我正在使用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似乎不会根据该对更新,而是根据之前的所有对更新。
对此有何解释?这与与优化器一起工作有关吗?
发布于 2018-07-14 06:46:37
我想回答我自己的问题。如果你认为这是精确的线性回归,那么这不是一个微不足道的问题。
for (x,y) in list(zip(x_train,y_train))[::-1]: sess.run(train_op, feed_dict = {X:x, Y: y})
总之,这段代码运行的不是严格的线性回归,而是它的近似值。
发布于 2018-07-14 06:48:50
如果您更改了这段代码
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})你得到你想要的了吗?
在您的原始代码中,第一个循环引用迭代,因此您将修复梯度下降的第一个迭代,然后将其应用于所有先前的对(因为第二个循环引用所有先前的对),然后修复第二个迭代,并再次针对所有先前的对应用梯度下降,依此类推。
如果你像上面那样交换你的循环,那么你就是在修复一对,然后将所有的梯度下降迭代应用于这一对。我不确定这是不是你想要的。
https://stackoverflow.com/questions/51333061
复制相似问题