Dummy op, который меняет градиенты
Это можно сделать с помощью декоратора tf.custom_gradient
, как описано в этом примере :
@tf.custom_gradient
def grad_reverse(x):
y = tf.identity(x)
def custom_grad(dy):
return -dy
return result, custom_grad
Затем выможно просто использовать его, как если бы он был обычным оператором TensorFlow, например:
z = encoder(x)
r = grad_reverse(z)
y = decoder(r)
Keras API?
Большим удобством TF 2.0 является его собственная поддержка Keras API.Вы можете определить пользовательский GradReverse
op и наслаждаться удобством Keras:
class GradReverse(tf.keras.layers.Layer):
def __init__(self):
super().__init__()
def call(self, x):
return grad_reverse(x)
Затем вы можете использовать этот слой как любые другие слои Keras, например:
model = Sequential()
conv = tf.keras.layers.Conv2D(...)(inp)
cust = CustomLayer()(conv)
flat = tf.keras.layers.Flatten()(cust)
fc = tf.keras.layers.Dense(num_classes)(flat)
model = tf.keras.models.Model(inputs=[inp], outputs=[fc])
model.compile(loss=..., optimizer=...)
model.fit(...)