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次元(バッチ)にわたって平均を計算すると、私にとっては合理的に思えるかもしれませんが、わかりますように、そうではありません。