私は次の簡単なコードを持っています:
a = tf.constant([7, 6, 7, 4, 5, 4], dtype=tf.float32)
e = tf.constant(5.2, dtype = tf.float32)
with tf.Session() as sess:
print(sess.run(a - e))
この減算の結果は次のとおりです。
[ 1.8000002 0.8000002 1.8000002 -1.1999998 -0.19999981 -1.1999998 ]
の代わりに
[ 1.8 0.8 1.8 -1.2 -0.2 -1.2 ]
それは非常に奇妙です。おそらく問題は何ですか?
簡単に言うと、5.2には終了バイナリ表現がないという理由があります。したがって、1/3
10進数でどのように見えるかを知っている場合は、の同じ状況を想像してみてください5.2
。次の点を常に覚えておいてください。
10進数は、最も単純な分数形式で記述された10進数に、の累乗である分母がある場合にのみ、終了する2進数表現を持ち
2
ます。
あなたが考える場合5.2
、それはある52/10
か26/5
、と5
の力ではありません2
。現在、float32(倍精度演算)では、それを表すのに32ビットしかありません。したがって、もちろん、それはそれと非常に近い5.2
が完全に同じではない数を表すことになります。
したがって、減算の計算に関するTensorFlowは、わずかな違いをもたらします。
ただし、数値を変換するとtf.float64
、表現はまだ正確ではありませんが、エラーが消えるのがわかります。これはPrint
あなたの人生をよりシンプルにする機能の真の努力です。全景を表示しているわけではありません。これは、64-bit
算術演算では、真の値と内部的に表される値の差が32-bit
算術演算よりもはるかに小さいためです。したがって、Print
関数はゼロの連続ストリームを認識し、それを切り捨てます。
しかし、あなたがそのようなものを使うならば、あなたは次のようなPrint('%.60f'% <YOUR RESULT>)
ものを見るでしょう
with tf.Session() as sess:
...: for i in range(10):
...: c = sess.run(a - e)
...:
2018-09-09 18:50:42.209402: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1471] Adding visible gpu devices: 0
2018-09-09 18:50:42.209464: I tensorflow/core/common_runtime/gpu/gpu_device.cc:952] Device interconnect StreamExecutor with strength 1 edge matrix:
2018-09-09 18:50:42.209475: I tensorflow/core/common_runtime/gpu/gpu_device.cc:958] 0
2018-09-09 18:50:42.209484: I tensorflow/core/common_runtime/gpu/gpu_device.cc:971] 0: N
2018-09-09 18:50:42.209635: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1084] Created TensorFlow device (/job:localhost/replica:0/task:0/device:GPU:0 with 10397 MB memory) -> physical GPU (device: 0, name: GeForce GTX 1080 Ti, pci bus id: 0000:02:00.0, compute capability: 6.1)
for item in c:
...: print('%.60f' % item)
...:
1.780000000000000248689957516035065054893493652343750000000000
0.780000000000000248689957516035065054893493652343750000000000
1.780000000000000248689957516035065054893493652343750000000000
-1.219999999999999751310042483964934945106506347656250000000000
-0.219999999999999751310042483964934945106506347656250000000000
-1.219999999999999751310042483964934945106506347656250000000000
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加