【发布时间】: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_loss 与loss 具有相同的维度(在这种情况下是标量)。
我希望能在这个简单的示例中提供任何帮助 - 如何以这种方式将元素添加到渐变中?
编辑:我想问题归结为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