最近需要做一个数据增强的DL实验,需要在每个batch时候对训练数据进行数据增强(添加一些虚假点),以此学习了kears中model.fit_generator()函数,在模型训练的时候,记录一下学习过程以及调试的过程。
函数参数说明
1 | fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, validation_data=None, validation_steps=None, validation_freq=1, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0) |
fit_generator主要是用于解决加载巨大数据内存不足的问题,也可以用来进行数据增强,许多和model.fit()很相似,只介绍几个关键的。
generator
生成器,用于生成数据(训练/验证/测试)。
steps_per_epoch
可以理解为一个周期的batch数目,通常设置为n_train/batch_size的大小。
模型的训练过程中,需要理解一下几个值的意义:
①epoch ②iteration ③batchsize
通常模型在训练过程中,每次都是采用batch_size个训练样本去训练模型(根据这batch_size个样本的梯度去训练),使用一次batch_size训练一次,完成一次iteration。模型训练完成一个epoch,所有的训练样本参与训练一次(且仅一次),此时完成的迭代数目 = n_train / batch_size个,所以我的理解是steps_per_epoch指的就是迭代数目(iteration )
debug
由于可能涉及保密,不贴代码,只记录调试过程。
首先遇到了训练过程中损失为nan的情况,这种情况的主要原因有以下几个:
1.学习率不合适,学习率过大
2.网络模型搭建不合理,比如激活函数,添加BN等
3.输入数据的问题,可能数据本身就有nan值,或者空值。
检查了实验的学习率以及网络结构,根据经验判断,均不存在明显问题,并且实验过程中,在第一个epoch的时候,损失正常,但是到第二个epoch损失就直接为nan了,分析原因可能在第一个epoch和第二个epoch之间,可能是数据加载存在问题。
设置断点调试:
在第一个epoch结束的时候,batch_x变为了一个空的列表,所以损失为nan了。为什么会为空的列表,原始数据本身不是空,应该是在取batch的时候出了问题。
i的范围是0-75一共76个,但是需要75次迭代就可以,所以不应该+1,找到bug之处!修改完毕之后,程序可以正常运行,接下来就开始进行数据增强操作了。