Tensorflow,Keras:如何在具有停止梯度的 Keras 层中设置 add_loss?

Nat*_*ion 5 python keras tensorflow

问题 1

我们知道我们可以tf.stop_gradient(B)用来防止B在反向传播中训练变量。但我不知道如何止损B

简单来说,假设我们的损失是:

loss = categorical_crossentropy + my_loss
B = tf.stop_gradient(B)
Run Code Online (Sandbox Code Playgroud)

其中categorical_crossentropymy_loss一切都取决于B。所以,如果我们为 设置停止梯度B,它们都将B作为常数。

但是我如何只设置my_loss停止渐变 wrt Bcategorical_crossentropy保持不变?就像是B = tf.stop_gradient(B, myloss)

我的代码是:

my_loss = ...
B = tf.stop_gradient(B)
categorical_crossentropy = ...
loss = categorical_crossentropy + my_loss
Run Code Online (Sandbox Code Playgroud)

那行得通吗?或者,如何使它起作用?


问题2

好的,伙计们,如果 Q1 可以解决,我的最终任务是如何在自定义层中做到这一点?

说得具体,假设我们有一个自定义层,其中有训练的权重AB和自我损失my_loss只有这一层。

loss = categorical_crossentropy + my_loss
B = tf.stop_gradient(B)
Run Code Online (Sandbox Code Playgroud)

如何使w模型损失(MSE、交叉熵等)B仅可训练,并且仅可训练my_loss

如果我再补充一点tf.stop_gradient(w),那将停止wmy_loss唯一或模型的最终损失?