2016-10-31 12 views
0
sess = tf.InteractiveSession() 
num_elements = 10 
output = [[0.76158798] * num_elements] 
softmax_w = [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] * num_elements 
print(tf.matmul(output, softmax_w).eval()) 
sess = tf.InteractiveSession() 
num_elements = 50 
output = [[0.76158798] * num_elements] 
softmax_w = [[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] * num_elements 
print(tf.matmul(output, softmax_w).eval()) 

にNUM_ELEMENTS変更なぜtf.matmul()は一見矛盾した結果を出すのですか?

[[ 0.76158804 0.76158804 0.76158804 0.76158804 0.76158804 0.76158804 0.76158804]] 

を与える

[[ 3.80794024 3.80794024 3.80794024 3.80794024 3.80793881 3.80793881 3.80793881]] 

を与えるなぜ第例えば全て同じではない結果の行列の要素はありますか?私はテンソルの流れ0.11.0rc0

答えて

0

を使用してい

は、それが数値誤差によって引き起こされたようです。私はあなたのコードと同じ結果を得たが、その後私はoutputsoftmax_wのfloat64テンソルを行い、問題が消えてしまった:

sess = tf.InteractiveSession() 
num_elements = 50 
output = tf.convert_to_tensor([[0.76158798] * num_elements], dtype = tf.float64) 
softmax_w = tf.convert_to_tensor([[0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]] * num_elements, dtype = tf.float64) 
print(tf.matmul(output, softmax_w).eval()) 
+0

数値エラーの場合、結果要素の一部にのみ影響するのはなぜですか?それらはすべて同じ数学的計算から生じる。 – ben

1

私はこれがあなたの行の長さは、(7)ではないことに起因すると考えていますSSEレジスタに収まる浮動小数点数の整数倍。より大きな例では、出力の最初の4要素はベクトル化されたコードパスを使用して計算され、最後の3要素はスカラー "クリーンアップ"ループで計算されます。コードのベクトルとスカラーバージョンで実行浮動小数点加算の順序はわずかに異なり、浮動小数点加算ので連想ないことがあり、

num_elements * std::numeric_limits<float>::epsilon() * std::abs(result) 

程度のわずかな違いが生じます。

関連する問題