CNN按钮报告
一、 不同激活函数对精度和Loss的影响
- 两层卷积一层池化一层全连接
(1)Relu:最终Loss为1.389
(2)Sigmoid:最终Loss为4.851
(3)Tanh:最终Loss为4.046
(4)总结:
Loss Acc
Relu 1.389 0.581
Sigmoid 4.851 0.050
Tanh 4.046 0.069
可以看出在较为简单的网络模型中,使用relu作为激活函数,其效果与其他两个激活函数比起来是非常好的,而其他两种函数可能由于问题复杂且模型简单,效果都非常差。这也就说明了为什么在大多数情况下,都会选择relu函数作为激活函数,因为其可以避免很多情形下梯度消失的情况。
- GoogleNet
(1) Relu:最终Loss为0.036
(2) Sigmoid:最终Loss为0.094
(3)Tanh:最终Loss为0.042
(4)总结:
Loss Acc
Relu 0.036 0.987
Sigmoid 0.094 0.953
Tanh 0.042 0.984
可以看出在较为复杂的网络模型中,使用relu作为激活函数与使用tanh作为激活函数都比sigmoid激活函数效果好,而sigmoid因为有太多可以使得梯度消失的情况,所以效果最差。由于模型比较复杂的原因,显示的效果都比较好,但是还是可以明显看出来relu与tanh的效果更好。
二、 不同学习率对精度和Loss的影响
- 两层卷积一层池化一层全连接
(1)lr=0.02 最终Loss为1.389
(2)lr=0.1 最终Loss为1.395
(3)lr=0.01 最终Loss为1.456
(4)总结:
Loss Acc
lr=0.02 1.389 0.581
lr=0.1 1.395 0.584
lr=0.01 1.456 0.537
可以看出,在学习率为0.01的时候准确率曲线基本上是平滑上升的,而当学习率为0.02时,会出现准确率跳跃的情况,可能是因为步长太大,出现了跳过最优解又跳回来的情况。当学习率为0.1的时候,达到了比较好的情况以后又出现准确率下降的情况,步长太大了。
2.GoogleNet
(1)lr=0.02 最终Loss为0.023
(2)lr=0.1 最终Loss为nan
(3)lr=0.01 最终Loss为0.094
(4)总结:
Loss Acc
lr=0.02 0.023 0.996
lr=0.1 nan nan
lr=0.01 0.094 0.987
可以看出,在复杂模型情况下,处理简单数据集问题,学习率为0.02或者0.01的差距不大,都是逐步向最优解前进。而当学习率过大为0.1时,会直接造成梯度爆炸,导致无法继续深度学习。
三、 不同损失函数对精度和Loss的影响
1.两层卷积一层池化一层全连接
(1)SGD:最终Loss为1.389
(2)Adam:最终Loss为1.385
(3)RMSprop:最终Loss为1.454
(4)总结:
Loss Acc
SGD 1.389 0.581
Adam 1.385 0.556
RMSprop 1.454 0.533
可以看出,在对应简单模型时,SGD、Adam、RMSprop的效果基本一样,没有什么区别,但是按曲线过程来看,Adam拟合的很快,其次是RMSprop,但是其比较不稳定,虽然拟合比较慢,但总的来说SGD算法好些。
2.GoogleNet
(1)SGD:最终Loss为0.094
(2)Adam:最终Loss为2.322
(3)RMSprop:最终Loss为2.347
(4)总结:
Loss Acc
SGD 0.094 0.953
Adam 2.322 0.112
RMSprop 2.347 0.099
可以看出,在对应复杂模型时,由于每个损失函数都带有超参数,当超参数定的不合理时,对复杂模型的影响非常大,所以如何找到最优的超参数,也是深度学习需要考虑的一个问题。
四、 不同批量大小对精度和Loss的影响
1.两层卷积一层池化一层全连接
(1)batch_size=64 最终Loss为1.389
(2)batch_size=128 最终Loss为1.456
(3)batch_size=32 最终Loss为1.354
(4)总结:
Loss Acc
batch_size=64 1.389 0.581
batch_size=128 1.456 0.544
batch_size=32 1.354 0.573
通过对不同batch_size下的loss和精确度可视化分析,可以看出当batch_size越大时,虽然准确率和loss没有太大的提升,但是会更平滑的到达顶峰。也就是说,这个简单模型处理MNIST数据集时,在算法允许的情况下,batch_size越大模型的性能越好。
2.GoogleNet
(1)batch_size=64 最终Loss为0.094
(2)batch_size=128 最终Loss为0.027
(3)batch_size=32 最终Loss为0.048
(4)总结:
Loss Acc
batch_size=64 0.094 0.953
batch_size=128 0.027 0.993
batch_size=32 0.048 0.986
通过对不同batch_size下的loss和精确度可视化分析,可以看出当batch_size越大时,虽然准确率和loss没有太大的提升,但是会更平滑的到达顶峰。也就是说,这个复杂模型处理MNIST数据集时,在算法允许的情况下,batch_size越大模型的性能越好。
五、 不同冲量大小对精度和Loss的影响
1.两层卷积一层池化一层全连接
(1)momentum=0.5 最终Loss为0.048
(2)momentum=1 最终Loss为2.773
(3)momentum=0.01 最终Loss为1.425
(4)总结:
Loss Acc
momentum=0.5 1.389 0.581
momentum=1 2.773 0.098
momentum=0.01 1.425 0.548
可以看出,冲量要选取合适才有用,当选取过大时,可能会导致惯性过大,一直到不了最低点,不能收敛。如果取的过小,又有可能冲不出局部最小值。
2.GoogleNet
(1)momentum=0.5 最终Loss为0.094
(2)momentum=1 最终Loss为nan
(3)momentum=0.01 最终Loss为0.048
(4)总结:
Loss Acc
momentum=0.5 0.094 0.953
momentum=1 nan 0.098
momentum=0.01 0.048 0.985
可以看出,冲量要选取合适才有用,当选取过大时,可能会导致惯性过大,一直到不了最低点,不能收敛。如果取的过小,又有可能冲不出局部最小值。
六、 BN层对精度和Loss的影响
1.两层卷积一层池化一层全连接
(1)添加BN层 最终Loss为1.389
(2)不添加BN层 最终Loss为1.400
(3)总结:
Loss Acc
添加BN层 1.389 0.581
不添加BN层 1.400 0.552
可以看出,在简单模型中加入BN层,使数据更规范,不管是拟合速度、loss值和acc值都会比不加BN层的模型好。
2.GoogleNet
(1)添加BN层 最终Loss为0.094
(2)不添加BN层 最终Loss为0.137
(3)总结:
Loss Acc
添加BN层 0.094 0.953
不添加BN层 0.137 0.923
可以看出,在复杂模型中加入BN层,使数据更规范,不管是拟合速度、loss值和acc值都会比不加BN层的模型好。
七、 不同模型对精度和Loss的影响
1.两层卷积一层池化一层全连接
2.GoogleNet
3.总结:
Loss Acc
简单模型 1.389 0.581
复杂模型 0.094 0.953
可以看出,GoogleNet的所有性能指标都优于自己创造的两层卷积一层池化一层全连接的简单模型,但是GoogleNet的运行时间也是简单模型的三倍多,所以也不能只考虑把模型复杂化,还是要从参数优化上多想办法,来使得模型更优秀。