MNIST-GAN笔记一
Posted Neil-Yale
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MNIST-GAN笔记一相关的知识,希望对你有一定的参考价值。
对于MNIST图像分类,改良的方法:
1.将损失从事偶从MSELoss改为BCELoss
即从均方误差改为二元交叉熵损失
均方误差适合回归任务,即神经网络的输出值被设计为连续范围的值
而对于分类任务,二元交叉熵损失更适合,它同时惩罚置信度高的错误输出和置信度低的正确输出。
修改之后,结果如下
可以看到损失值在下降,不过下降的速度比MSELoss慢,损失值的噪声也更大,以至于训练的后期偶尔也有较高的损失值出现
打印出测试数据集对于第19副图像的输出值,可以看到判断为4的置信度提升了,为9的置信度降低了。准确率也提升到了90%
2.改进激活函数
从sigmoid改为leakyRelu
此处可以将MSELoss保持不变,与最初的方案进行比较
下面代码中0.02是LeakyRelu函数左半边的梯度
看看损失图
可以看到损失值从一开始就迅速下降到接近于0,即使在训练初期,平均损失值就很低,同时噪声也较少
准确率到了97%
打印出对测试集第19副图像的预测
可以看到现在只有对4的置信度,非常的高
由此可以知道,改变激活函数效果明显,同时由于简化了梯度,计算变得更简单了
3.改进反向传播梯度更新网络权重的方法
使用SGD的缺点之一是它会陷入损失函数的局部最小值,另一个缺点是,它对所有可学习的参数都使用单一的学习率
最常见的改进方案是使用Adam,它直接解决了以上两个缺点
首先,利用动量(momentum)的概念,减少陷入局部最小值的可能性。同时,对每个可学习的参数使用单独的学习率,这些学习率随着每个参数在训练期间的变化而变化
带代码中保留MSELoss和Sigmoid,只是将优化器从SGD改为Adam
损失图如下
可以看到损失值迅速降到了0,且均值始终保持较低。
可以看到准确率到了97%
打印出第19副测试图像,网络很确定认为图中的数字是4
4.标准化
神经网络中的权重和信号(向网络输入的数据)的取值范围都很大。较大的输入值会导致饱和,使学习变困难
大量研究表明,减少神经网络中参数和信号的取值范围,以及将均值转换为0,是有好处的,这种方法称作normalization,标准化。
常见的做法之一是在信号进入神经网络层之前将它标准化
还是使用MSELoss,Sigmoid,SGD
不过在网络信号输入最终层之前使用LayerNorm(200),将他们标准化
训练之后可以看到准确率到91%左右
损失图如下
可以看到,损失值下降的速率高于原始网络,如果考虑噪声在图中的密度,而不只是高度,则损失值的噪声也较少
同样打印测试图像
判断为4的置信度非常高,虽然还有对9的较小置信度的预测,不过其他数字的预测值都是0了
不过需要注意,标准化是如何帮助训练神经网络,解读的研究层出不穷,尚无定论
5.整合在一起
把BCE损失、LeakyRelu、Adam以及标准化加到一起
由于BCE只能处理0~1之间的值,而LeakyRelu有可能输出范围之外的值,所以我们在最终层以后需要保留一个sigmoid
但是在隐藏层之后使用LeakyRelu
简单比较使用numpy和python的性能差距
emm等不下去了,反正很慢
测试cuda是否可用
可以看到GAN的生成器在生成1010格式规的图像时,对于输出规律越来越清晰了。
以上是关于MNIST-GAN笔记一的主要内容,如果未能解决你的问题,请参考以下文章