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

在keras模型中,如何使给定层的启用可培训?,keras,keras-layer,Keras,Keras Layer,我有以下暹罗模型: 我想使层a-L1和b-L1的启用/禁用可培训。ie:a-L1和/或b-L1应在必要时对当前输入透明(不使用或禁用)。因此,培训后的模型将学习何时启用/禁用一个或两个层a-L1和b-L1 我设法用4个案例来训练这个模型,因此我得到了4个不同的模型: 模型1:无a-L1和b-L1 型号2:不带a-L1 型号3:不带b-L1 模型4:a-L1和b-L1 这些模型的性能相辅相成,我想将它们结合起来。你有什么建议吗

我有以下暹罗模型:

我想使层
a-L1
b-L1
的启用/禁用可培训。ie:
a-L1
和/或
b-L1
应在必要时对当前输入透明(不使用或禁用)。因此,培训后的模型将学习何时启用/禁用一个或两个层
a-L1
b-L1

我设法用4个案例来训练这个模型,因此我得到了4个不同的模型:

  • 模型1:无a-L1和b-L1
  • 型号2:不带a-L1
  • 型号3:不带b-L1
  • 模型4:a-L1和b-L1

这些模型的性能相辅相成,我想将它们结合起来。你有什么建议吗。 首先定义输入层,它对所有输入层都是通用的

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模型的层。此外,我想添加我在上面的答案注释中指定的权重机制

首先,让我们用常见的新输入定义新模型 现在获取所有模型的L2层 加权合并 现在将L2旁边的模型1(m1)层与这个新的加权_输出连接起来
您想合并所有四个模型吗?是的,这类似于合并功能,但要保持相同的体系结构,理想的功能是具有一些可训练参数的功能,能够禁用或启用紫色层
a-L1
b-L1
。使用可针对每层输出训练的额外权重参数。然后,总输出将是前几层的加权和。请在回答中提供更多细节,好吗?或者给出一个例子或一些keras代码。谢谢。你的意思是我在单独训练后会把整个模型组合起来,这是个好主意。这是另一个非常有趣的模型。安,你有什么建议只合并
L2
之前的层?这样我就可以保持建筑不变(暹罗式的)?谢谢@Mitiku它真的帮助了我。
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))
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)
# 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)