【发布时间】:2019-07-01 19:08:40
【问题描述】:
这一层是静态的,它是一个伪函数。在前向传播中,它不做任何事情(恒等函数)。然而,在反向传播中,它将梯度乘以 -1。 github 上有很多实现,但它们不适用于 TF 2.0。
这里有一个供参考。
import tensorflow as tf
from tensorflow.python.framework import ops
class FlipGradientBuilder(object):
def __init__(self):
self.num_calls = 0
def __call__(self, x, l=1.0):
grad_name = "FlipGradient%d" % self.num_calls
@ops.RegisterGradient(grad_name)
def _flip_gradients(op, grad):
return [tf.negative(grad) * l]
g = tf.get_default_graph()
with g.gradient_override_map({"Identity": grad_name}):
y = tf.identity(x)
self.num_calls += 1
return y
flip_gradient = FlipGradientBuilder()
【问题讨论】:
-
@PedroMarques 感谢您的链接。但是文档仍然不明显。例如,他们定义了一个函数 clip_gradient_by_norm,但没有解释在哪里使用它。
-
例如,如果您使用 Keras 构建图表,您可以从 Lambda 层调用此函数。默认情况下,Tensorflow 跟踪图定义中的张量操作,并使用其自动微分规则来计算梯度。自定义梯度告诉它使用用户定义的 grad 函数而不是通过自动微分计算的梯度(对于这个函数的范围)。
标签: tensorflow keras tensorflow2.0