张量流如何处理二维误差

时间:2017-03-12 15:08:42

标签: python machine-learning tensorflow gradient-descent

说我有一个使用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的梯度(基本上我们有几个错误而不是一个错误)?如果它隐含地计算第一维度(批次)的平均值,那对我来说似乎是合理的,但正如我们所看到的那样并非如此。

1 个答案:

答案 0 :(得分:1)

现在我有了一个答案:tensorflow简单地将错误汇总到第一维,即批次。