我有以下暹罗模型:
我想使a-L1
和b-L1
层的启用/禁用可培训。即:如有必要,a-L1
和/或b-L1
对于当前输入应透明(不使用或禁用)。因此,经过训练的模型将学习何时应该启用/禁用a-L1
和b-L1
层之一或全部。
我设法用4种情况训练了该模型,因此我得到了4种不同的模型:
这些模型的性能是相辅相成的,我想将它们结合起来。请问您有什么建议吗?
答案 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))
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)