我有一个Tensorflow多分类器,使用tf.nn.softmax计算概率时会出现nan或inf。如下所示的代码段(logits的形状为batch_size x 6,因为我有6个类别且输出是one-hot编码)。batch_size是1024。
分类器在最后一个语句中失败,因为它在probabilities中发现了nan或inf。logits很干净,否则第一个语句也会失败。 从我所读到的关于tf.nn.softmax的内容来看,它可以处理logits中非常大和非常小的值。我已经在交互模式下验证过了。
在第二个语句中,我将`logits`中的值剪切到-15和15之间,这在某种程度上防止了softmax计算中出现
然而,我仍然不明白为什么这种剪辑起作用?(我应该提到,在-20和20之间剪辑无效,并且模型在
有人可以帮助我理解为什么会这样吗?
我正在使用tensorflow 1.15.0,在64位实例上运行。
logits = tf.debugging.check_numerics(logits, message='bad logits', name=None)
probabilities = tf.nn.softmax(logits=logits, name='Softmax')
probabilities = tf.debugging.check_numerics(probabilities, message='bad probabilities', name=None)
分类器在最后一个语句中失败,因为它在probabilities中发现了nan或inf。logits很干净,否则第一个语句也会失败。 从我所读到的关于tf.nn.softmax的内容来看,它可以处理logits中非常大和非常小的值。我已经在交互模式下验证过了。
>>> with tf.Session() as s:
... a = tf.constant([[1000, 10], [-100, -200], [3, 4.0]])
... sm = tf.nn.softmax(logits=a, name='Softmax')
... print(a.eval())
... print(sm.eval())
...
[[1000. 10.]
[-100. -200.]
[ 3. 4.]]
[[1. 0. ]
[1. 0. ]
[0.26894143 0.7310586 ]]
我尝试将logits
中的值修剪,整个过程现在可以工作了。请参见下面修改后的片段。
logits = tf.debugging.check_numerics(logits, message='logits', name=None)
safe_logits = tf.clip_by_value(logits, -15.0, 15.0)
probabilities = tf.nn.softmax(logits=safe_logits, name='Softmax')
probabilities = tf.debugging.check_numerics(probabilities, message='bad probabilities', name=None)
在第二个语句中,我将`logits`中的值剪切到-15和15之间,这在某种程度上防止了softmax计算中出现
nan
/inf
。因此,我能够解决手头的问题。然而,我仍然不明白为什么这种剪辑起作用?(我应该提到,在-20和20之间剪辑无效,并且模型在
probabilities
中出现nan
或inf
时失败)。有人可以帮助我理解为什么会这样吗?
我正在使用tensorflow 1.15.0,在64位实例上运行。