我正在使用Tensorflow探索线性回归。这是我来自this notebook的代码。
import tensorflow as tf
import numpy as np
learning_rate = 0.01
x_train = np.linspace(-1,1,101)
y_train = 2*x_train + np.random.randn(*x_train.shape) * 0.33
X = tf.placeholder("float")
Y = tf.placeholder("float")
def model(X, w):
return tf.multiply(X,w)
w = tf.Variable(0.0, name = "weights")
training_epochs = 100
y_model = model(X,w)
cost = tf.reduce_mean(tf.square(Y-y_model))
train_op = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(cost)
with tf.Session() as sess:
init = tf.global_variables_initializer()
sess.run(init)
for epoch in range(training_epochs):
for (x,y) in zip(x_train,y_train):
sess.run(train_op, feed_dict = {X:x, Y: y})
print(sess.run(w))
它试图最小化成本函数。根据这个问题的answers,我认为tf.reduce_mean()
的工作方式类似于np.mean()
。
但是,每次将一对(x,y)
馈入train_op
时,权重w
似乎并不是根据THE对而更新,而是根据之前的所有对进行更新。
对此有何解释?这与与优化程序一起工作有关吗?
答案 0 :(得分:0)
我想回答我自己的问题。如果您认为这确实是线性回归,那么这不是一个小问题。
我误解了 tf.train.GradientDescentOptimizer 的性能。它只运行了一个步骤以使损失函数最小化,而不是达到最小值。如果是这样,@ UmangGupta是正确的,我们可以得到斜率。
在每个时期,优化器都会尝试针对每个数据点“一点”优化损耗函数。因此,将数据馈送到优化器的顺序很重要。因此,以下代码将给出不同的答案。
for (x,y) in list(zip(x_train,y_train))[::-1]:
sess.run(train_op, feed_dict = {X:x, Y: y})
答案 1 :(得分:-1)
如果您更改这段代码
for epoch in range(training_epochs):
for (x,y) in zip(x_train,y_train):
sess.run(train_op, feed_dict = {X:x, Y: y})
以此
for (x,y) in zip(x_train,y_train):
for epoch in range(training_epochs):
sess.run(train_op, feed_dict = {X:x, Y: y})
您能得到您所期望的吗?
在您的原始代码中,第一个循环引用迭代,因此您要修复梯度下降的第一个迭代,然后将其应用于所有先前的对(因为第二个循环引用所有先前的对),那么您'正在修复第二个迭代,然后再次对所有先前的对应用梯度下降,依此类推。
如果您按上述方式交换循环,则将固定一对,然后将所有梯度下降迭代应用于该一对。我不确定这是否是您想要的。