如何在keras模型中使给定层的启用可训练?

时间:2018-11-26 10:55:46

标签: keras keras-layer

我有以下暹罗模型:

enter image description here

我想使a-L1b-L1层的启用/禁用可培训。即:如有必要,a-L1和/或b-L1对于当前输入应透明(不使用或禁用)。因此,经过训练的模型将学习何时应该启用/禁用a-L1b-L1层之一或全部。
我设法用4种情况训练了该模型,因此我得到了4种不同的模型:

  • model-1:没有a-L1和b-L1
  • model-2:不带a-L1
  • model-3:不带b-L1
  • model-4:同时具有a-L1和b-L1

这些模型的性能是相辅相成的,我想将它们结合起来。请问您有什么建议吗?

1 个答案:

答案 0 :(得分:1)

让我们考虑您已经训练了四个模型,我们将它们称为m1,m2,m3和m4

首先定义所有输入层共有的输入层。

inputs = Input(shape=your_inputs_shape)

model_1_output = m1(inputs)
model_2_output = m2(inputs)
model_3_output = m3(inputs)
model_4_output = m4(inputs)
merged_layer = Concatenate(axis=your_concatanation_axis)([model_1_output, model_2_output, model_3_output,model_4_output)
new_model = Model(inputs=inputs, outputs=merged_layer)

我希望这能解决您的问题。

编辑:

要回答有关评论的问题,可以仅合并L2之前的图层。但是您必须决定要使用哪个模型层(从L2开始),(因为您没有合并从L2开始的层)。假设您要在L2之后使用m1模型的图层。另外,我想添加我在答案注释中指定的加权机制。

首先让我们用常见的新输入定义新模型

new_inputs = Input(shape=(inputs_shape))
new_m1 = keras.models.Model(inputs = new_inputs, outputs = m1(new_inputs))
new_m2 = keras.models.Model(inputs = new_inputs, outputs = m2(new_inputs))
new_m3 = keras.models.Model(inputs = new_inputs, outputs = m3(new_inputs))
new_m4 = keras.models.Model(inputs = new_inputs, outputs = m4(new_inputs))

现在获取所有模型的L2层

model1_l2 = new_m1.layers[1].get_layer("L2").output
model2_l2 = new_m2.layers[1].get_layer("L2").output
model3_l2 = new_m3.layers[1].get_layer("L2").output
model4_l2 = new_m4.layers[1].get_layer("L2").output

加权合并

merged = Concatenate(axis=your_concatanation_axis)([model1_l2, model2_l2, model3_l2,model4_l2])
merged_layer_shape = merged.get_shape().as_list()

# specify number of channels you want the output to have after merging

desired_output_channels = 32

new_trainable_weights =  keras.backend.random_normal_variable(shape=(merged_layer_shape[-1], desired_output_channels),mean=0,scale=1)
weighted_output = keras.backend.dot(merged,new_trainable_weights)

现在使用此新的weighted_output连接L2旁边的model1(m1)层

# I'm using some protected properties of layer. But it is not recommended way to do it.
# get the index of l2 layer in new_m1
for i in range(len(new_m1.layers[1].layers)):
    if new_m1.layers[1].layers[i].name=="L2":
        index = i
x = weighted_output
for i in range(index+1, len(new_m1.layers[1].layers)):
    x = new_m1.layers[1].layers[i](x)

new_model = keras.models.Model(inputs=new_inputs, outputs=x)