2017-03-12 13 views
2

セイIIとtensorflow取引はシンプルかつニューロン使用してSGD持っている方法:2次元エラー

In [0]: error.get_shape() 
Out[0]: TensorShape([Dimension(None), Dimension(1)]) 

私がチェックした場合:私は2次元の誤差がありますその結果

data = np.array([ 
    (0, 0), 
    (0, 1), 
    (1, 0), 
    (1, 1), 
]) 

labels = np.array([ 
    [0], 
    [0], 
    [0], 
    [1], 
]) 

x = tf.placeholder(tf.float32, shape=[None, 2]) 
y = tf.placeholder(tf.float32, shape=[None, 1]) 

w = tf.Variable(initial_value=[[-0.31199348], [-0.46391705]], dtype=tf.float32) 
b = tf.Variable(initial_value=[-1.94877], dtype=tf.float32) 
h = tf.nn.bias_add(tf.matmul(x, w), b) 

error = tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=h) 
optimizer = tf.train.GradientDescentOptimizer().minimize(error) 

errorの勾配

In [2]: error = tf.reduce_mean(
      tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=h), 
      reduction_indices=0, 
     ) 

は私がerror単一次元を持つことになります:私は、バッチ間でmeanを計算するerrorを変更した場合

Out[1]: array([[-0.8440423 ], [-0.85625702]] 

を今:私は次のように表示されます

In [1]: print sess.run(
      tf.gradients(error, w), 
      feed_dict={ 
       x: data, 
       y: labels, 
      }, 
     ) 

w簡単なスクリプトを使用して:

In [3]: error.get_shape() 
Out[3]: (1,) 
同じスクリプトを使用して

私は異なる結果が表示されます:

Out[4]: [[-0.21101058], [-0.21406426]] 

、今では4(バッチサイズ)で割った値と同じ結果であるため、実際には完璧な理にかなっている - それは本当に意味です。

私が理解できないのは、2次元のerror(基本的に1つのエラーではなくいくつかのエラーがある場合)のテンソルフローの計算勾配です。暗黙のうちに第1次元(バッチ)にわたって平均を計算すると、私にとっては合理的に思えるかもしれませんが、わかりますように、そうではありません。

答えて

1

私は答えがあります:テンソルフローは、最初の次元、つまりバッチ全体の誤差を単純に合計します。