【问题标题】:TensorFlow apply_gradients remotelyTensorFlow 远程应用梯度
【发布时间】:2016-01-20 21:02:52
【问题描述】:

我正在尝试将最小化功能拆分到两台机器上。在一台机器上,我调用“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返回的原始梯度张量。

标签: gradient tensorflow


【解决方案1】:

假设每个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 的有效值。

【讨论】:

  • 天哪,就是这样,非常感谢,已经为此工作了一周。
  • 这是否记录在某处?除了代码本身之外,我很难找到有关 feed_dict 如何工作的信息。也许我可以发布一个问题让它吐出有用的错误消息。
  • 主要文档在Session.run() 的文档中,描述了可以在feed_dict 中传递的内容。我想我们也有recently improved 在这种情况下引发的异常,但这可能还没有出现在当前版本中!
  • 在 tensorflow 1.8.0 中,compute_op 返回单个变量的元组。第一个是控制依赖,第二个是实际梯度。因此请务必更改 feed_dict[placeholder_gradients[i][0]] = gradients[i][1] 以避免形状不匹配错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2016-06-23
  • 2022-01-04
  • 2019-11-16
  • 1970-01-01
相关资源
最近更新 更多