我想替换或修改 op 的梯度或张量流中图形的一部分。如果我可以在计算中使用现有的梯度,那将是理想的。
在某些方面,这与 tf.stop_gradient()
的作用相反:我想要一个仅在计算梯度时使用的计算,而不是添加在计算梯度时被忽略的计算。
一个简单的例子是通过将梯度乘以一个常数来简单地缩放梯度(但不将前向计算乘以一个常数)。另一个例子是将渐变剪切到给定范围的东西。
原文由 Alex I 发布,翻译遵循 CC BY-SA 4.0 许可协议
我想替换或修改 op 的梯度或张量流中图形的一部分。如果我可以在计算中使用现有的梯度,那将是理想的。
在某些方面,这与 tf.stop_gradient()
的作用相反:我想要一个仅在计算梯度时使用的计算,而不是添加在计算梯度时被忽略的计算。
一个简单的例子是通过将梯度乘以一个常数来简单地缩放梯度(但不将前向计算乘以一个常数)。另一个例子是将渐变剪切到给定范围的东西。
原文由 Alex I 发布,翻译遵循 CC BY-SA 4.0 许可协议
2 回答5.1k 阅读✓ 已解决
2 回答1.1k 阅读✓ 已解决
4 回答1k 阅读✓ 已解决
3 回答1.1k 阅读✓ 已解决
3 回答1.2k 阅读✓ 已解决
1 回答1.7k 阅读✓ 已解决
1 回答1.2k 阅读✓ 已解决
对于 TensorFlow 1.7 和 TensorFlow 2.0,请查看 edit blow。
首先定义您的自定义渐变:
由于您不希望在前向传递中发生任何事情,因此请使用新梯度覆盖身份操作的梯度:
这是一个工作示例,其中一个层在向后传递中剪切渐变并且在向前传递中不执行任何操作,使用相同的方法:
针对 TensorFlow 1.7 和 TensorFlow 2.0 进行编辑
从 1.7 开始,有一种新的方法可以用更短的语法重新定义梯度,这也适用于 Tensorflow 2.0。它还允许同时重新定义多个操作的梯度。以下是上面的示例,为 TensorFlow 1.7 和 TensorFlow 2.0 重写:
在向后传递中缩放梯度的层:
在向后传递中剪切渐变的图层示例: