Keras:在某一层之后停止梯度

问题描述 投票:0回答:1

假设你有一个 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 层?

    

keras
1个回答
12
投票

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)

	
© www.soinside.com 2019 - 2024. All rights reserved.