keras和tensorflow使用fit_generator 批次训练操作
fit_generator是keras提供的用来进行批次训练的函数,使用方法如下:
model.fit_generator(generator,steps_per_epoch=None,epochs=1, verbose=1,callbacks=None,validation_data=None,validation_steps=None, class_weight=None,max_queue_size=10,workers=1,use_multiprocessing=False, shuffle=True,initial_epoch=0)
参数说明:
generator:一个生成器,或者一个Sequence(keras.utils.Sequence)对象的实例,以在使用多进程时避免数据的重复。生成器的输出应该为以下之一:
一个(inputs,targets)元组
一个(inputs,targets,sample_weights)元组。
这个元组(生成器的单个输出)组成了单个的batch。因此,这个元组中的所有数组长度必须相同(与这一个batch的大小相等)。不同的batch可能大小不同。例如,一个epoch的最后一个batch往往比其他batch要小,如果数据集的尺寸不能被batchsize整除。生成器将无限地在数据集上循环。当运行到第steps_per_epoch时,记一个epoch结束。
steps_per_epoch:在声明一个epoch完成并开始下一个epoch之前从generator产生的总步数(批次样本)。它通常应该等于你的数据集的样本数量除以批量大小。对于Sequence,它是可选的:如果未指定,将使用len(generator)作为步数。
epochs:整数。训练模型的迭代总轮数。一个epoch是对所提供的整个数据的一轮迭代,如steps_per_epoch所定义。注意,与initial_epoch一起使用,epoch应被理解为「最后一轮」。模型没有经历由epochs给出的多次迭代的训练,而仅仅是直到达到索引epoch的轮次。
verbose:0,1或2。日志显示模式。0=安静模式,1=进度条,2=每轮一行。
callbacks:keras.callbacks.Callback实例的列表。在训练时调用的一系列回调函数。
validation_data:它可以是以下之一:
验证数据的生成器或Sequence实例
一个(inputs,targets)元组
一个(inputs,targets,sample_weights)元组。
在每个epoch结束时评估损失和任何模型指标。该模型不会对此数据进行训练。
validation_steps:仅当validation_data是一个生成器时才可用。在停止前generator生成的总步数(样本批数)。对于Sequence,它是可选的:如果未指定,将使用len(generator)作为步数。
class_weight:可选的将类索引(整数)映射到权重(浮点)值的字典,用于加权损失函数(仅在训练期间)。这可以用来告诉模型「更多地关注」来自代表性不足的类的样本。
max_queue_size:整数。生成器队列的最大尺寸。如未指定,max_queue_size将默认为10。
workers:整数。使用的最大进程数量,如果使用基于进程的多线程。如未指定,workers将默认为1。如果为0,将在主线程上执行生成器。
use_multiprocessing:布尔值。如果True,则使用基于进程的多线程。如未指定,use_multiprocessing将默认为False。请注意,由于此实现依赖于多进程,所以不应将不可传递的参数传递给生成器,因为它们不能被轻易地传递给子进程。
shuffle:是否在每轮迭代之前打乱batch的顺序。只能与Sequence(keras.utils.Sequence)实例同用。
initial_epoch:开始训练的轮次(有助于恢复之前的训练)。
补充知识:Keras中fit_generator的多个分支输入时,需注意generator的格式以及输入序列的顺序
需要注意迭代器yeild返回不能是[x1,x2],y这样,而是要完整的字典格式的:
yield({'input_1':x1,'input_2':x2},{'output':y})
这也不算坑追进去fit_generator也能看到示例
defgenerate_batch(x_train,y_train,batch_size,x_train2,randomFlag=True): ylen=len(y_train) loopcount=ylen//batch_size i=-1 whileTrue: ifrandomFlag: i=random.randint(0,loopcount-1) else: i=i+1 i=i%loopcount yield({'lstmInput':x_train[i*batch_size:(i+1)*batch_size], 'bgInput':x_train2[i*batch_size:(i+1)*batch_size]}, {'prediction':y_train[i*batch_size:(i+1)*batch_size]})
ps:因为要是tupleyield后的括号不能省
需注意的坑1是,validationdata中如果用【】组成数组进行输入,是要按顺序的,按编译model前的设置model=Model(inputs=[simInput,lstmInput,bgInput],outputs=predictions),中数组的顺序来编译
需注意的坑2是,多输入input时,以后都用inputs1=Input(batch_shape=(batchSize,TPeriod,dimIn,),name='input1LSTM')指定batchSize,不然跟statefullstm结合时,会提示不匹配。
history=model.fit_generator(generate_batch(trainX,trainY,batchSize,trainX2), steps_per_epoch=len(trainX)//batchSize, validation_data=([testX,testX2],testY), epochs=epochs, callbacks=[tensorboard,checkpoint],initial_epoch=0,verbose=1)#FittheLSTMnetwork/拟合LSTM网络
以上这篇keras和tensorflow使用fit_generator批次训练操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。