问题 1
我们知道可以使用tf.stop_gradient(B)
来防止变量B
在反向传播中被训练。但我不知道如何在特定损失函数中停止B
。
简单地说,假设我们的损失函数为:
loss = categorical_crossentropy + my_loss
B = tf.stop_gradient(B)
在这里,categorical_crossentropy
和 my_loss
都依赖于 B
。如果我们对 B
设置停止梯度,它们都会将 B
视为常数。
但是,我如何只针对 my_loss
对 B
设置停止梯度,同时保持 categorical_crossentropy
不变呢?就像这样:B = tf.stop_gradient(B, myloss)
。
我实现的代码如下:
my_loss = ...
B = tf.stop_gradient(B)
categorical_crossentropy = ...
loss = categorical_crossentropy + my_loss
这能行吗?或者说,如何使其工作?
问题2
好的,如果Q1可以解决,我的最终问题是如何在自定义层中实现它?
具体来说,假设我们有一个自定义层,其中包括可训练权重A
和B
以及仅适用于该层的自身损失my_loss
。
class My_Layer(keras.layers.Layer):
def __init__(self, **kwargs):
super(My_Layer, self).__init__(**kwargs)
def build(self, input_shape):
self.w = self.add_weight(name='w', trainable=True)
self.B = self.add_weight(name='B', trainable=True)
my_loss = w * B
# tf.stop_gradient(w)
self.add_loss(my_loss)
如何使 w
只对模型损失(MSE,交叉熵等)进行训练,而使 B
仅对 my_loss
进行训练?
如果我添加 tf.stop_gradient(w)
,那么这会停止 w
对于 my_loss
吗?还是会停止模型的最终损失?
compile
而不仅仅是一个字符串,例如model.compile(loss=losses.mean_squared_error, optimizer='sgd')
而不是model.compile(loss='mean_squared_error', optimizer='sgd')
。 - HeyWatchThis