之前在学习用tensorflow搭建cnn网络进行训练时,采用了交叉熵损失函数,当时根据文档采用了ylog(y_)的损失函数的形式,结果发现训练中准确率一直很低,并且到一定训练轮数后就不变了。后来调查发现损失函数矩阵在某一轮变成了nan。查阅资料后才知道,由于ylog(y_)这种形式当参数y_为0的时候可能会导致损失函数为nan,导致无法收敛。
解决的方法则是对参数做一个截断,给予一个非常小的非零最小值,这样可以保证损失函数不为nan,使得训练可以正常进行。代码如下:
#原始的代码,交叉熵定义为ylog(y_)求和的均值,
#修改后给y_加了一个非常小的非零正数,使得y_为0时,损失函数不会为nan
#cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(y_ ), reduction_indices=[1]))
cross_entropy = tf.reduce_mean(-tf.reduce_sum(y * tf.log(y_ + 1e-10 ), reduction_indices=[1]))
修改了损失函数后,重新训练,发现准确率上升,并且最终收敛到一个比较高的准确率上。
参考资料:https://blog.csdn.net/qq_32464407/article/details/79170949
网友评论