您可以使用 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

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