假设你有一个 Keras NN 模型,如何在某一层之后停止反向传播中的梯度?
即,如果我们有一个具有两个输出的模型:
input_layer = Input(shape=(10,10,3))
x = Convolution2D(...)(input_layer)
x = Activation('relu')(x)
x = Flatten()(x)
x_1 = Dense(64)(x)
x_1 = Dense(32)(x_1)
x_1 = Dense(2)(x_1)
x_2 = Dense(64)(x)
x_2 = Dense(32)(x_2)
x_2 = Dense(2)(x_2)
model = Model(inputs=input_layer, outputs=[x_1, x_2])
如何才能在
x_1
层之后停止输出x_1 = Dense(64)(x)
的梯度,从而使其不被计入卷积层中的权重更新?
根据通过keras中的特定层停止梯度反向支撑中的答案,我在
x_1
密集层之前添加了一个lambda层,但我不太确定:
x_1 = Dense(64)(x)
x_1_stop_grad = Lambda(lambda x: K.stop_gradient(x))(x_1)
x_1 = Dense(32)(x_1)
x_1 = Dense(2)(x_1)
我是否必须在第一个密集 x_1
层之前或之后添加 lambda 层?
即
from keras import ops
# weights in x should not be updated by gradients from x_1
x = Convolution2D(...)(input_layer)
x_1_stop_grad = Lambda(lambda x: ops.stop_gradient(x))(x)
x_1 = Dense(64)(x_1_stop_grad)
x_1 = Dense(32)(x_1)