tf.nn.sigmoid_cross_entropy_with_logits结果数值过大
(2019-09-11 03:06:19)
标签:
tensorflow交叉熵数值过大交叉熵大 |
使用tensorflow计算两向量交叉熵的时候,用到上述函数,发现这样的交叉熵的loss数值非常大,并且发现,虽然更新模型,没有出现太多问题,但是偶尔会出现loss为inf或nan的报错信息,导致程序崩溃。
首先检查发现,函数的logits输入的向量,几乎在1e+8的范围(或者是负数达到这个数量级),根据sigmoid的函数的取值,过一层sigmoid激活函数后,这样的数值会变成接近1(或者接近0)的数值。但实际上,其实sigmoid函数在超过+5和小于-5的时候,都接近平滑(也就是接近1或者0的上界或下界)。
然后,看回sigmoid_cross_entropy_with_logits的官方API文档,其最终的结果用如下的公式计算max(x, 0) - x * z + log(1 + exp(-abs(x))),可以显然看出,如果x取值过大(较大正数),那么这个数值确实比较大。回推这个公式,其实虽然x值较大,sigmoid会产生接近1的数值(二分类预测为1结果),但是这样会导致在交叉熵中,对数会接近负无穷大。
这时候思考到一个问题,为什么此时的x数值会这么大,其实一般神经网络的输出都是在一个比较小的范围,比如[0,1]或者[-1,1],检查给出x数值输出的网络,发现问题,在训练的时候,输入的图片都是在[0,255]之间,但是实际使用的时候,图片是在[-1,1]之间,这样输入就有巨大的gap,而网络本身又放大了这个gap,导致了数值的异常。
这样的事情,有个比较深刻的教训就是,还是时刻得注意,并且非常清楚的知道,自己网络的输入和输出的数值的范围。