模型训练
训练模型时,模型的准确率跟
1.数据量
2.batch_size 的大小
3.epochs 的次数
4.学习率的大小都有关
如果测试集的准确率小于训练集的,可能的原因是:
1.没有打乱测试集
2.过拟合
3.学习率太高
改进
1.预测时使用 from sklearn.utils import shuffle 该句,调用 shuffle 模块将数据打乱
这个方法是行不通的!!!!因为测试集的图片和标签是一一对应的,如果打乱,就无法预测了
2.适当的降低学习率(0.0001)
优化器 sgd 的学习率一般设置为0.01!!很重要,batch_size = 75(SGD 优化器的 batch_size 一般设置的大些,效果好)
通过代码测试,SGD 的学习率与训练次数成比例,lr / echo 约等于 1/200
----------------------------------------------------------------
opt = keras.optimizers.RMSprop(learning_rate=0.0001, decay=1e-6)
而 RMSprop 的学习率一般为 0.0001,batch_size = 32
3.数据量小,使用数据增强
4.利用正则化
5.利用 dropout 层
6.找个好的优化器会节省大量训练时间
使用 SGD 优化器训练 300 次出现的效果和使用 Adam 优化器训练 40 次出现的现象差不多,准确率都开始震荡,说明模型不稳定.但是训练200-300次的预测效果要比60次的效果好,200-300次训练,虽然准确率和 loss 都在 0.8 左右,但是实际预测结果很准确:
而训练60次的结果确实这样:
对 cnn 卷积神经网络的思考:
训练神经网络需要大量的数据,如 cifar10 数据集(small dataset),里面有 5 万张 10 种类别的图片,利用cnn结构,使用 RMSprop 优化器,经过 100 次训练,训练时还要使用数据增强技术,最终模型的准确率在测试集上可以达到 80% 左右.若使用 SGD 优化器,不使用数据增强技术,大约需要训练 200 次左右,可达到 80% 的准确率。随着训练次数的增加,模型在训练集上的准确率先增后减(RMSprop -- 100 次,SGD--200次,Adam--70次左右),说明模型不稳定。而且由此也可以看出优化器的性能:Adam > RMSprop > SGD
神经网络的优化
1.当激活函数的输出为有限值时,基于梯度的方法更稳定
当激活函数的输出为无限值时,建议调小学习率
2.sigmoid 函数的导数分布在0-0.25之间,在进行反向传播时存在多个0-0.25之间的数相乘,导致结果变的很小,出现梯度消失
3.使用 relu 函数时,需要将数据归一化,变成正态分布,减小参数分布的巨大变化,设置更小的学习率,减缓负神经元数量