您可以使用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_gradients
和apply_gradients
,这只会给你变量的渐变。如何让优化器在执行链规则时使用张量modified_grad_wrt_input
?
您是否必须使用此github issue中的gradient_override_map? 没有注册新的op / gradients有没有更简单的方法?