【问题标题】:How does tensorflow deal with 2-dimensional errorstensorflow如何处理二维错误
【发布时间】:2017-03-21 08:26:52
【问题描述】:

假设我有一个使用 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(批量大小) - 这就是真正的意思。

我不明白的是,在第一种情况下,tensorflow 是如何计算二维error 的梯度(基本上我们有几个错误而不是一个错误)?如果它隐式计算第一维(批次)的平均值,对我来说似乎是合理的,但正如我们所见,情况并非如此。

【问题讨论】:

    标签: python machine-learning tensorflow gradient-descent


    【解决方案1】:

    现在我有一个答案:tensorflow 只是简单地将第一维的误差求和,即批次。

    【讨论】:

      猜你喜欢
      • 2016-09-03
      • 2020-07-09
      • 1970-01-01
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2014-07-13
      • 1970-01-01
      相关资源
      最近更新 更多