在使用cifar10 训练中,对比修改某些参数对训练结果的影响html
1) 训练环境:python 3.6 + tensorflow 2.0 python
2)训练数据:cifar10框架
3)训练数据分类:train 32000 + val 8000 + test 10000iphone
如下逻辑只是自我感受,没有找到相关论文,下降 loss 方向又不知道怎么修改,朝那个方向修改更好,只得慢慢调整,积累一些规律,固然了,这些规律在之后的实践中有多是“阶段性正确”。函数
关于训练前那些暂不修改事项post
1) - 在学习优化器时,看好多视频资料、文档资料、博文等对 adam 优化器评价较高,或者基于 adam 的改良版 RAdam 。学习
好比在 “ Adam优化器如何选择 ”一文中讲述的很是不错。能够参考。测试
关于改良版:要获得最强的优化器,只须要把RAdam和LookAhead合二为一优化
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )
2) - 选择激活函数的选择,在此选择relu,由于这是公认的好激活函数,或者采用它的升级版 LeakyReLU 。
在tensorflow 2.0 中使用 relu 和 LeakyReLU 介绍了使用方法。可是没有更多的理论介绍(理论的内容网上堆成山)。
3) - 选用 100 个 epoch + 自动终止,实验证实,通常不到100个epoch就会自动终止。
4) - 相对上面不动的内容,下面改变其余内容。
名称 | relu | LeakyReLU | 备注 | |
epoch | 18 | 17 | 差异不大 | |
train_set |
loss | 0.3005 | 0.1893♠ | LeakyReLU好 |
accuracy | 0.8917 | 0.9336♠ | LeakyReLU好 | |
val_set |
val_loss | 1.3521♠ | 1.5921 | relu较好 |
val_accuracy | 0.6705♠ | 0.6759 | 差异不大 | |
test_set | test_loss | 1.3466♠ | 1.6643 | relu较好 |
test_acc | 0.6723♠ | 0.6634 | 差异不大 |
结论:
1 - LeakyReLU 较好,能够使用 LeakyReLU 做为激活函数 。
2 - 对数据进行加强处理,以下降可能出现的过拟合现象
3 - 缺了一项?时间忘了添加进去。
保存名称(便于后续查询使用)
relu:model_point2019.10.14.23.23.56.h5
LeakyReLU:model_point2019.10.14.22.47.40.h5
# 第一层卷积 model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) # model.add(layers.Conv2D(32, (3, 3), input_shape=(32, 32, 3))) # model.add(layers.LeakyReLU(0.01))
feed 给模型的 batch_size 大小不同,其结果也存在有差别
history = model.fit(train_images, train_labels, epochs=100, batch_size=256, validation_data=(val_images, val_labels), callbacks=[visualization.model_point, visualization.model_stop] )
为了使训练样本对比更加有效,每一个 batch_size 分为 3 次,取中间值。
具体以下:
组别 | 16 | 64 | 256 | PK | |
细目 | 16-C | 64-C | 256-B | batch_size增长 | |
epoch | 14 | 18 | 30 | 增 | |
train_set |
loss | 0.2387 | 0.2442 | 0.3747 | 增 |
accuracy | 0.9154 | 0.9144 | 0.8707 | 降 | |
val_set |
val_loss | 1.5866 | 1.3429 | 1.0724 | 降 |
val_accuracy | 0.6536 | 0.6811 | 0.6858 | 增 | |
时间 | 10s310us | 4s111us | 2s69us | 降(倍数关系) | |
test_set | test_loss | 1.6349 | 1.3562 | 1.0770 | 降 |
test_acc | 0.6554 | 0.6820 | 0.6804 | 增 | |
时间 | 12s 1ms | 3s 324us | 3s 323us | 降 |
从上面能够得出,batch_size 的增长使得训练数据集的损失增长而准确度下降,同时尽管验证集中的损失值下降较多,可是准确度仅仅微微增长,因此小的 batch_size 更有利于模型的训练。
对于测试集而言,其效果与验证集相似。
固然了这仅仅针对目前的环境,是否是会随着数据集数量的变化而变化,暂时尚不知。
如今有些明白为何好多模型的训练采用小的 batch_size了。之后的训练能够尝试 16 或者 32
组别 | batch_size=16 | ||||
细目 | 16-A | 16-B | 16-C | 均值 | |
epoch | 16 | 13 | 14 | 14.3 | |
train_set |
loss | 0.1854 | 0.2348 | 0.2387 | 0.2196 |
accuracy | 0.9345 | 0.9160 | 0.9154 | 0.9345 | |
val_set |
val_loss | 1.8339 | 1.6358 | 1.5866 | 1.7103 |
val_accuracy | 0.6587 | 0.6697 | 0.6536 | 0.6607 | |
时间 | 9s291us | 10s306us | 10s310us | ||
test_set | test_loss | ||||
test_acc | |||||
时间 |
组别 | batch_size = 64 | ||||
细目 | 64-A | 64-B | 64-C | 均值 | |
epoch | 18 | 17 | 18 | 18 |
|
train_set |
loss | 0.2361 | 0.2834 | 0.2442 | 0.2546 |
accuracy | 0.9161 | 0.9008 | 0.9144 | 0.9104 | |
val_set |
val_loss | 1.3731 | 1.2901 | 1.3429 | 1.3165 |
val_accuracy | 0.6754 | 0.6798 | 0.6811 | 0.6788 | |
时间 | 4s114us | 4s109us | 4s111us | ||
test_set | test_loss | ||||
test_acc | |||||
时间 |
组别 | batch_size = 256 | ||||
细目 | 256-A | 256-B | 256-C | 均值 | |
epoch | 29 | 30 | 28 | 29 |
|
train_set |
loss | 0.3541 | 0.3747 | 0.4420 | 0.3903 |
accuracy | 0.8776 | 0.8707 | 0.8467 | 0.8650 | |
val_set |
val_loss | 1.0990 | 1.0724 | 0.9405 | 1.0373 |
val_accuracy | 0.6874 | 0.6858 | 0.7064 | 0.6932 | |
时间 | 2s70us | 2s69us | 2s68us | ||
test_set | test_loss | ||||
test_acc | |||||
时间 |
保存模型备注:
16-A model_point2019.10.15.00.18.11.h5
16-B model_point2019.10.15.00.22.22.h5
16-C model_point2019.10.15.00.30.50.h5
64-A model_point2019.10.15.00.35.56.h5
64-B model_point2019.10.15.00.38.41.h5
64-C model_point2019.10.15.00.41.05.h5
256-A model_point2019.10.15.00.45.30.h5
256-B model_point2019.10.15.00.49.30.h5
256-C model_point2019.10.15.00.52.47.h5