【问题标题】:Using TensorFlow ``grad_loss / grad_ys`` parameter to add gradients使用 TensorFlow ``grad_loss / grad_ys`` 参数添加渐变
【发布时间】:2018-08-15 17:51:55
【问题描述】:

我正在尝试使用optimizer.minimize(loss, grad_loss=) 中的grad_loss 参数来修改具有现有渐变的网络渐变。 我在这里关注了cmets: Use of grads_ys parameter in tf.gradients - TensorFlow

我想运行一个玩具示例,在该示例中我为grad_ys 重新创建默认的1 值,如文档中所述。

以下是相关代码段:

grads_and_vars = optimizer.compute_gradients(loss_op) 
vars_with_grad = [v for g, v in grads_and_vars if g is not None] 
grad_loss = [] 
for grad,var in grads_and_vars:
    grad_loss.append(tf.ones_like(grad))
train_op = optimizer.minimize(loss_op, grad_loss=grad_loss)

第一部分使用compute_gradients 提取渐变。最后一行计算损失函数loss_op 的梯度,但尝试使用1 填充向量作为梯度。据我了解,这应该类似于在没有grad_loss 参数的情况下取笑minimize

不幸的是,这失败了,因为它期望 grad_loss 是一个张量(并且有一个 dtype)而不是一个列表。查看gradients_impl.py 我看到函数期望grad_lossloss 具有相同的维度(在这种情况下是标量)。

我希望能在这个简单的示例中提供任何帮助 - 如何以这种方式将元素添加到渐变中?

编辑:我想问题归结为grad_loss 的定义:“一个Tensor 持有为loss 计算的梯度。”如何从compute_gradients获得的一组梯度中生成这样的张量?

谢谢。

【问题讨论】:

  • 那么你的目的是什么?根据我的理解,如果损失不是标量,那么你必须将grad_loss 传递给函数,grad_loss 是你的对象 w.rt 损失的梯度。
  • 我的损失是标量,但梯度是向量、矩阵等(根据我训练的模型和权重)。我不明白的是如何为函数提供我修改后的渐变。
  • 查看github.com/tensorflow/models/blob/master/tutorials/image/… 了解如何为优化器提供自定义渐变
  • 在这个例子中,他们使用“opt.apply_gradients”来自定义渐变。但是,我想使用相同的原始渐变,但以grad_loss 旨在提供的确切方式修改它们。我相信我缺少一个技术细节。

标签: python tensorflow


【解决方案1】:

您可以使用tf.convert_to_tensor 方法将渐变列表转换为tensor,然后使用tf.reduce_sum

train_op = optimizer.minimize(loss_op, grad_loss=tf.reduce_sum(tf.convert_to_tensor(grad_loss)))

【讨论】:

    猜你喜欢
    • 2016-07-22
    • 1970-01-01
    • 2018-02-04
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    • 1970-01-01
    相关资源
    最近更新 更多