将张量幅度归一化为张量流中的单位长度

时间:2018-02-23 19:13:52

标签: tensorflow gradient normalize

如何将渐变幅度归一化为张量流中的单位长度?

我正在尝试做类似

的事情

gradients = tf.gradients(self.loss, _params) gradients_norm = tf.norm(gradients , name='norm') final_gradients= [(gradients/gradients_norm , var) for grad, var in gradients]

有任何线索吗?谢谢

1 个答案:

答案 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可训练变量。这些是优化器默认情况下通常会更新的所有变量。