Tensorflow的reduce_sum如何循环工作?

时间:2018-12-27 10:40:11

标签: tensorflow

当优化器在循环中运行时,我无法理解reduce_sum的工作。

我的train_xtrain_y列表中有30个样本。我通过一次迭代从两个样本中获取一个样本来循环运行优化器。我的成本函数使用张量流的reduce_sum方法计算所有样本的预测值与实际值之和。根据该图,优化器取决于成本函数,因此将针对每个xy计算成本。我需要知道reduce_sum是要等待所有30个样本还是一次获取一个样本(xy)。这里的n_samples是30。我还需要知道是针对每个纪元还是针对每个weightsbias更新xy

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}')

1 个答案:

答案 0 :(得分:0)

  

我需要知道reduce_sum是等待所有30个样本还是一次获取一个样本(x,y)。

tf.reduce_sum是一个操作,因此它没有任何隐式可变状态。 tf.reduce_sum的结果完全由模型参数(WB)和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