Keras:在特定层之后停止渐变

时间:2018-06-19 15:04:36

标签: keras

假设您有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)的梯度,以免在卷积层的权重更新中不计入梯度?


根据Stopping Gradient back prop through a particular layer in 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层?

1 个答案:

答案 0 :(得分:4)

由于渐变是通过网络反向流动的,因此您需要在不应该​​到达渐变的层之后直接添加渐变停止层。

# weights in x should not be updated by gradients from x_1
x = Convolution2D(...)(input_layer) 
x_1_stop_grad = Lambda(lambda x: K.stop_gradient(x))(x)
x_1 = Dense(64)(x_1_stop_grad)
x_1 = Dense(32)(x_1)
...