TensorFlow 远程应用梯度

5

我正在尝试将最小化函数分配给两台计算机。在一台机器上,我调用“compute_gradients”,在另一台机器上,我使用通过网络发送的梯度调用“apply_gradients”。问题在于,无论我做什么,调用apply_gradients(...).run(feed_dict)似乎都不起作用。我已经尝试在apply_gradients中插入占位符来代替张量梯度,

  variables = [W_conv1, b_conv1, W_conv2, b_conv2, W_fc1, b_fc1, W_fc2, b_fc2]
  loss = -tf.reduce_sum(y_ * tf.log(y_conv))
  optimizer = tf.train.AdamOptimizer(1e-4)
  correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(y_,1))
  accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
  compute_gradients = optimizer.compute_gradients(loss, variables)

  placeholder_gradients = []
  for grad_var in compute_gradients:
     placeholder_gradients.append((tf.placeholder('float', shape=grad_var[1].get_shape()) ,grad_var[1]))
  apply_gradients = optimizer.apply_gradients(placeholder_gradients)

然后当我收到渐变时,我调用。
  feed_dict = {}
  for i, grad_var in enumerate(compute_gradients):
        feed_dict[placeholder_gradients[i][0]] = tf.convert_to_tensor(gradients[i])
  apply_gradients.run(feed_dict=feed_dict)

然而,当我这样做时,我遇到了

ValueError: 使用序列设置数组元素。

这只是我尝试过的最新方法,我还尝试过不使用占位符的相同解决方案,以及等待接收梯度后再创建apply_gradients操作,结果会导致图形不匹配的错误。

有关我应该采取哪个方向的任何帮助?


请注意,在apply_gradients中使用占位符(代表梯度张量)是不必要的,因为您可以为任何变量(张量)提供numpy值。您只需使用由compute_gradients返回的原始梯度张量即可。 - Falcon
1个回答

7
假设每个 gradients[i] 都是您使用某种机制获取的 NumPy 数组,修复方法就是在构建 feed_dict 时删除调用 tf.convert_to_tensor()
feed_dict = {}
for i, grad_var in enumerate(compute_gradients):
    feed_dict[placeholder_gradients[i][0]] = gradients[i]
apply_gradients.run(feed_dict=feed_dict)

feed_dict中,每个值都应该是NumPy数组(或其他可以轻松转换为NumPy数组的对象)。特别地,tf.Tensor不是feed_dict的有效值。


1
天啊,就是这个,非常感谢,我已经为此工作了一个星期了。 - syzygy
1
这个有文档解释吗?我花了很长时间才找到feed_dict的工作原理信息,除了代码本身。也许我可以发布一个问题来输出一个有用的错误消息。 - syzygy
2
主要文档在Session.run()的文档中,其中描述了可以传递到feed_dict中的内容。我认为我们也最近改进了在这种情况下引发的异常,但这可能还没有在当前版本中实现! - mrry
在tensorflow 1.8.0中,compute_op为单变量返回一个元组。第一个是控制依赖项,第二个是实际梯度。因此,请确保更改feed_dict[placeholder_gradients[i][0]] = gradients[i][1]以避免形状不匹配错误。 - kingspp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接