关于tensorflow 2.0 中训练时的相关事项

在使用cifar10 训练中,对比修改某些参数对训练结果的影响html

1 框架的修改的基本逻辑

1.1 训练的背景

1) 训练环境:python 3.6 + tensorflow 2.0 python

2)训练数据:cifar10框架

3)训练数据分类:train 32000 + val 8000 + test 10000iphone

1.2 改变的逻辑

如下逻辑只是自我感受,没有找到相关论文,下降 loss 方向又不知道怎么修改,朝那个方向修改更好,只得慢慢调整,积累一些规律,固然了,这些规律在之后的实践中有多是“阶段性正确”。函数

关于训练前那些暂不修改事项post

1) - 在学习优化器时,看好多视频资料、文档资料、博文等对 adam 优化器评价较高,或者基于 adam 的改良版 RAdam 。学习

好比在 “ Adam优化器如何选择 ”一文中讲述的很是不错。能够参考。测试

关于改良版:要获得最强的优化器,只须要把RAdam和LookAhead合二为一优化

不是咱们喜新厌旧,而是RAdam确实是好用,新的State of the Art优化器RAdamurl

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'] )

 

2) - 选择激活函数的选择,在此选择relu,由于这是公认的好激活函数,或者采用它的升级版 LeakyReLU 。

在tensorflow 2.0 中使用 relu 和 LeakyReLU 介绍了使用方法。可是没有更多的理论介绍(理论的内容网上堆成山)。

3) - 选用 100 个 epoch + 自动终止,实验证实,通常不到100个epoch就会自动终止。

4) - 相对上面不动的内容,下面改变其余内容。

2 relu vs LeakyReLU

2.1 结果数据化

名称 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

2.2 结果可视化

 

 

 2.3 模型可视化

 

 

 2.4 替换代码段

# 第一层卷积
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))

3 batch_size 大小

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] )

3.1 batch_size = 16 / 64 / 256

为了使训练样本对比更加有效,每一个 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 

3.2 每组训练详记

组别 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

相关文章
相关标签/搜索