假设您有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])
Run Code Online (Sandbox Code Playgroud)
如何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)
Run Code Online (Sandbox Code Playgroud)
我是否必须在第一个致密层之前或之后添加lambda x_1层?
由于渐变是通过网络反向流动的,因此您需要在不应该到达渐变的图层之后直接添加渐变停止图层。
即
# 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)
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2040 次 |
| 最近记录: |