假设您有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层?
答案 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)
...