说我有一个使用SGD的简单AND神经元:
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)
结果我会有二维错误:
In [0]: error.get_shape()
Out[0]: TensorShape([Dimension(None), Dimension(1)])
如果我检查error
w.r.t的渐变。 w
使用简单的脚本:
In [1]: print sess.run(
tf.gradients(error, w),
feed_dict={
x: data,
y: labels,
},
)
我将看到以下内容:
Out[1]: array([[-0.8440423 ], [-0.85625702]]
现在,如果我更改error
以跨批次计算mean
:
In [2]: error = tf.reduce_mean(
tf.nn.sigmoid_cross_entropy_with_logits(labels=y, logits=h),
reduction_indices=0,
)
我将有一个单维error
:
In [3]: error.get_shape()
Out[3]: (1,)
使用相同的脚本我会看到不同的结果:
Out[4]: [[-0.21101058], [-0.21406426]]
这实际上非常有意义,因为现在它是相同的结果除以4(批量大小) - 这就是真正的意思。
我无法理解的是,在第一种情况下,张量流如何计算二维error
的梯度(基本上我们有几个错误而不是一个错误)?如果它隐含地计算第一维度(批次)的平均值,那对我来说似乎是合理的,但正如我们所看到的那样并非如此。
答案 0 :(得分:1)
现在我有了一个答案:tensorflow简单地将错误汇总到第一维,即批次。