机器学习/深度学习入门:训练中的问题

1.损失函数后面的epoch中出现剧烈的抖动,如下图所示,说明你的学习率在此时比较高,需要进行学习率的衰减。

2.损失函数在刚开的时候抖动,并且随着epoch的增加损失函数保持在一定的范围内,说明你的学习率比较大。

3.损失函数减少的比较缓慢,说明你的学习率比较小。

有关学习率的影响具体如下文的连接所示:

http://baijiahao.baidu.com/s?id=1591531217345055627&wfr=spider&for=pc

4.迁移学习的具体情况如下:

Ø  CNN feature + classifier;这个比较好理解,通常做法就是在大的数据集(比如ImageNet)上训练出一个CNN,然后提取最后一层卷积层或者倒数第二层全连接层的输出作为CNN 特征,然后直接使用 SVM、贝叶斯或softmax等分类器进行分类;

Ø  Fine-tuning:将在大数据集上训练得到的weights作为特定任务(小数据集)的初始化权重,重新训练该网络(根据需要,修改全连接层输出);至于训练的方式可以是:1.微调所有层2.固定网络前面几层权重,只微调网络的后面几层,这样做有两个原因:A. 避免因数据量小造成过拟合现象;B.CNN前几层的特征中包含更多的一般特征(比如,边缘信息,色彩信息等),这对许多任务来说是非常有用的,但是CNN后面几层的特征学习注重高层特征,也就是语义特征,这是针对于数据集而言的,不同的数据集后面几层学习的语义特征也是完全不同的;

在进行微调网络并仅训练网络后几层的时候,需要指定这几层的训练参数,否则会出现损失函数一直减小,准确率先增大后减小,但是在tensorboard上无法正确显示的情况,具体实现如下(总觉得这种解决方法比较牵强):

var_list = [v for v in tf.trainable_variables() if v.name.split('/')[0] in train_layers]
train_op = tf.train.AdamOptimizer(LR).minimize(loss, var_list=var_list, global_step=global_step)

后来发现,如果微调网络并训练全部网络层数时,调整好学习率即可解决上面的问题:

var_list = [v for v in tf.trainable_variables()]
train_op = tf.train.AdamOptimizer(LR).minimize(loss, var_list=var_list, global_step=global_step)

5.训练集准确率低于验证集准确率10%,一开始总觉得是自己代码的问题,调试了好久,训练集的准确率还是低,最后换了一个数据集训练集和准确率才正常,最后经验证发现是数据集中数据和标签没有一一对应好,修改之后即可

6.训练集的loss先下降后上升,该类问题的原因有多种,主要的解决办法如下:

  • 数据和标签没有对应好,或者打散数据集时出错等。
  • 学习率过大,导致loss上升(此处的上升分为两种,一种是上升到某个值后来回摆动不再上升,另一种是极值发散,甚至爆炸NAN)
  • 可以考虑将SGD换为ADAM

7.验证集的loss先下降后上升,可考虑此时模型已经过拟合了

8.改变优化器后,loss一直不收敛,可尝试使用降低学习率的方法

持续更新中......

没有更多推荐了,返回首页