当优化器在循环中运行时,我无法理解reduce_sum的工作。
我的train_x
和train_y
列表中有30个样本。我通过一次迭代从两个样本中获取一个样本来循环运行优化器。我的成本函数使用张量流的reduce_sum
方法计算所有样本的预测值与实际值之和。根据该图,优化器取决于成本函数,因此将针对每个x
和y
计算成本。我需要知道reduce_sum
是要等待所有30个样本还是一次获取一个样本(x
,y
)。这里的n_samples
是30。我还需要知道是针对每个纪元还是针对每个weights
和bias
更新x
和y
。>
X = tf.placeholder(tf.float32)
Y = tf.placeholder(tf.float32)
W = tf.Variable(np.random.randn(), name='weights')
B = tf.Variable(np.random.randn(), name='bias')
pred = X * W + B
cost = tf.reduce_sum((pred - Y) ** 2) / (2 * n_samples)
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
init = tf.global_variables_initializer()
with tf.Session() as sesh:
sesh.run(init)
for epoch in range(epochs):
for x, y in zip(train_x, train_y):
sesh.run(optimizer, feed_dict={X: x, Y: y})
if not epoch % 20:
c = sesh.run(cost, feed_dict={X: train_x, Y: train_y})
w = sesh.run(W)
b = sesh.run(B)
print(f'epoch: {epoch:04d} c={c:.4f} w={w:.4f} b={b:.4f}')
答案 0 :(得分:0)
我需要知道reduce_sum是等待所有30个样本还是一次获取一个样本(x,y)。
tf.reduce_sum
是一个操作,因此它没有任何隐式可变状态。 tf.reduce_sum
的结果完全由模型参数(W
和B
)和feed_dict
调用的sess.run(cost, feed_dict={...})
参数中显式提供的占位符值定义。
如果您想汇总所有批次的指标值,请查看tf.metrics
:
y_pred = tf.placeholder(tf.float32)
y_true = tf.placeholder(tf.float32)
mse, update_op = tf.metrics.mean_squared_error(y_true, y_pred)
init = tf.local_variables_initializer() # MSE state is local!
sess = tf.Session()
sess.run(init)
# Update the metric and compute the value after the update.
sess.run(update_op, feed_dict={y_pred: [0.0], y_true: [42.0]}) # => 1764.0
# Get current value.
sess.run(mse) # => 1764.0
我还需要知道权重和偏差是否将针对每个时期或针对x和y进行更新。
每次sess.run(optimizer, ...)
调用都将计算可训练变量的梯度,并将这些梯度应用于变量值。参见GradientDescentOptimizer.minimize
。