如何将渐变幅度归一化为张量流中的单位长度?
我正在尝试做类似
的事情 gradients = tf.gradients(self.loss, _params)
gradients_norm = tf.norm(gradients , name='norm')
final_gradients= [(gradients/gradients_norm , var) for grad, var in gradients]
有任何线索吗?谢谢
答案 0 :(得分:1)
有一些Gradient Clipping功能可以一步完成您想要的任务:
https://www.tensorflow.org/api_guides/python/train#Gradient_Clipping
例如:
tf.clip_by_norm(t, clip_norm, axes=None, name=None)
一旦你获得了渐变,就像你在那里展示的那样,你将需要使用那些新的,剪裁的渐变而不是原始的渐变。使用:
tf.train.Optimizer.apply_gradients(grads_and_vars, global_step=None, name=None)
https://www.tensorflow.org/api_guides/python/train#Optimizers
应该运行apply_gradients
op而不是正常的最小化器OP来训练网络。
示例 - 正常训练OP:
train_op = tf.train.GradientDescentOptimizer(learning_rate=1e-4).minimize(loss_function)
示例 - 您的培训OP:
gradients = tf.gradients(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES), self._loss)
grads_and_vars = [(tf.clip_by_norm(grad, clip_norm), var) for grad, var in gradients]
train_op = tf.train.GradientDescentOptimizer(learning_rate=1e-4).apply_gradients(grads_and_vars)
注意使用tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)
可以获得list
可训练变量。这些是优化器默认情况下通常会更新的所有变量。