无法使用tf.reduce_sum()进行优化,但成功使用了tf.reduce_mean()

时间:2017-12-29 19:56:31

标签: python tensorflow machine-learning

import tensorflow as tf
import numpy as np

#date generation
x_data = np.float32(np.random.rand(2, 100))
y_data = np.dot([0.1, 0.2], x_data) + 0.3

#linear model
b = tf.Variable(tf.zeros([1]))
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))
y = tf.matmul(W, x_data) + b

#minimize variance
loss = tf.reduce_sum(tf.square(y - y_data)) #why I cannot use sum here
optimizer = tf.train.GradientDescentOptimizer(0.01)
train = optimizer.minimize(loss)

#initialization
init = tf.global_variables_initializer()

#graph initialization
sess = tf.Session()
sess.run(init)

#train network
for step in range(201):
sess.run(train)
#if step % 20 == 0:
print(step, sess.run(W), sess.run(b), sess.run(loss))

嗨,我在使用tensorflow实现玩具模型时遇到了问题。当我使用 tf.reduce_sum()函数作为损失函数时,优化器无法收敛。实际上,损失变得越来越大。但是当我将损失函数从 tf.reduce_sum()更改为 tf.reduce_mean()时,优化器才能成功运行。任何人都可以告诉为什么 tf.reduce_sum()不能用于此模型,但 tf.reduce_mean()呢?

2 个答案:

答案 0 :(得分:3)

一次性汇总所有样本的损失超过平均损失。

例如,我们假设y_data = [1.2,3.2,2.4]并预测y = [1,3,3]

然后按以下几行:

tf.reduce_sum(tf.square(y - y_data))

损失将证明是:

  

0.04 + 0.04 + 0.36 = 0.44

相反,如果你使用减少平均值,相同的预测将导致较低的损失,在这种情况下

  

0.44 / 3 = 0.14666

因此,使用reduce_sum时,渐变和参数更新也会更大。跳过可能的局部最小值。

另外 优化器中的学习率是每个例子的损失,如果您想要为批处理实现相同的效果,您需要将学习率与批量大小划分为成功训练模型或使用reduce_mean来训练模型。

答案 1 :(得分:1)

我遇到过类似的问题。看看用户:Stephen的回答将回答你的问题:TensfoFlow: Linear Regression loss increasing (instead decreasing) with successive epochs