修改中间梯度Tensorflow

时间:2017-01-27 10:40:36

标签: tensorflow gradients

您可以使用tf.gradients()获得中间渐变,并且可以通过对此结果应用op(如剪切)来创建新的张量,但是如何相应地修改反向传播?

例如,实现Huber loss(delta = 1)。 第一种方法是在批处理维度上创建一个类似。

的布尔掩码
cond=tf.less(input_tensor,1)
cond=tf.cast(cond,"tf.float32")
loss=cond*tf.square(input_tensor)+(1.-cond)*(tf.abs(input_tensor)-0.5)

实现它的一种更简单的方法是使用l2损失并将其渐变的输入剪辑为1.

l2_loss=tf.square(input_tensor)
modified_grad_wrt_input=tf.clip_by_value(tf.gradients(l2_loss,input_tensor),0.,1.)

但是当你训练网络时,你必须使用compute_gradientsapply_gradients,这只会给你变量的渐变。如何让优化器在执行链规则时使用张量modified_grad_wrt_input

您是否必须使用此github issue中的gradient_override_map? 没有注册新的op / gradients有没有更简单的方法?

0 个答案:

没有答案