Pour tensorflow 1.7 ou plus récent, regardez edit coup.
D'abord définir votre dégradé personnalisé:
@tf.RegisterGradient("CustomGrad")
def _const_mul_grad(unused_op, grad):
return 5.0 * grad
Puisque vous voulez ne se passe rien dans la passe en avant, remplacer le gradient d'une pièce d'identité avec votre nouveau dégradé:
g = tf.get_default_graph()
with g.gradient_override_map({"Identity": "CustomGrad"}):
output = tf.identity(input, name="Identity")
Voici un exemple de travail avec une couche de clips dégradés à l'arrière passe et ne fait rien à l'avant de passer, à l'aide de la même méthode:
import tensorflow as tf
@tf.RegisterGradient("CustomClipGrad")
def _clip_grad(unused_op, grad):
return tf.clip_by_value(grad, -0.1, 0.1)
input = tf.Variable([3.0], dtype=tf.float32)
g = tf.get_default_graph()
with g.gradient_override_map({"Identity": "CustomClipGrad"}):
output_clip = tf.identity(input, name="Identity")
grad_clip = tf.gradients(output_clip, input)
# output without gradient clipping in the backwards pass for comparison:
output = tf.identity(input)
grad = tf.gradients(output, input)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("with clipping:", sess.run(grad_clip)[0])
print("without clipping:", sess.run(grad)[0])
edit pour TensorFlow 1.7
Depuis la 1.7, il y a une nouvelle façon de redéfinir le dégradé avec une syntaxe plus courte. (Il permet également de redéfinir le gradient de plusieurs opérations en même temps, ce qui n'est pas nécessaire pour cette question). Voici quelques exemples à partir de ci-dessus, réécrit pour TensorFlow 1.7:
Couche échelles dégradés à l'arrière pass:
@tf.custom_gradient
def scale_grad_layer(x):
def grad(dy):
return 5.0 * dy
return tf.identity(x), grad
Exemple avec une couche de clips dégradés à l'arrière pass:
import tensorflow as tf
input = tf.Variable([3.0], dtype=tf.float32)
@tf.custom_gradient
def clip_grad_layer(x):
def grad(dy):
return tf.clip_by_value(dy, -0.1, 0.1)
return tf.identity(x), grad
output_clip = clip_grad_layer(input)
grad_clip = tf.gradients(output_clip, input)
# output without gradient clipping in the backwards pass for comparison:
output = tf.identity(input)
grad = tf.gradients(output, input)
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print("with clipping:", sess.run(grad_clip)[0])
print("without clipping:", sess.run(grad)[0])