を使用して確率を生成nan
または計算している Tensorflow マルチクラス分類器があります。次のスニペットを参照してください ( 6 つのクラスがあり、出力がワンホット エンコードされているため、形状はあります)。は 1024 です。inf
tf.nn.softmax
logits
batch_size x 6
batch_size
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)
分類子は、nan
またはinf
で見つかった最後のステートメントで失敗しますprobabilities
。logits
そうでなければ、最初のステートメントは失敗していたでしょう。
私が読んだことからtf.nn.softmax
、ロジットで非常に大きな値と非常に小さな値を処理できます。対話モードでこれを確認しました。
>>> 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)
2 番目のステートメントでは、値logits
を -15 と 15 にクリッピングしています。これにより、softmax 計算でnan
/が何らかの形で防止されます。inf
そのため、当面の問題を修正することができました。
しかし、なぜこのクリッピングが機能しているのか、まだわかりませんか? (-20 と 20 の間のクリッピングは機能せず、モデルはnan
またはinf
で失敗することに注意してくださいprobabilities
)。
なぜこれが当てはまるのか、誰かが理解するのを手伝ってくれますか?
64 ビット インスタンスで実行されている tensorflow 1.15.0 を使用しています。