2 回答

TA贡献1802条经验 获得超6个赞
我认为你能做的最好的事情就是在任何地方使用函数式 API:
def defineModel(nkernels, nstrides, dropout, input_shape):
l_input = Input( shape=input_shape )
model = Conv1D(nkernels, nstrides, activation='relu')(l_input)
model = Conv1D(nkernels*2, nstrides, activation='relu')(model)
model = BatchNormalization()(model)
model = MaxPooling1D(nstrides)(model)
model = Dropout(dropout)(model)
return model, l_input
models = []
inputs = []
for i in range(15):
model, input = defineModel(64,2,0.75,(64,1))
models.append( model )
inputs.append( input )
然后很容易恢复子模型的输入和输出列表并合并它们
merged = Concatenate()(models)
merged = Dense(512, activation='relu')(merged)
merged = Dropout(0.75)(merged)
merged = Dense(1024, activation='relu')(merged)
merged = Dropout(0.75)(merged)
merged = Dense(40, activation='softmax')(merged)
model = Model(inputs=inputs, outputs=merged)
通常,这些操作不是瓶颈。这些都不应该在训练或推理过程中产生重大影响

TA贡献1876条经验 获得超7个赞
当然,正如@GabrielM 建议的那样,使用函数式 API 是最好的方法,但是如果你不想修改define_model函数,你也可以这样做:
models = []
inputs = []
outputs = []
for i in range(15):
model = defineModel(64,2,0.75,(64,1))
models.append(model)
inputs.append(model.input)
outputs.append(model.output)
merged = Concatenate()(outputs) # this should be output tensors and not models
# the rest is the same ...
model = Model(inputs=inputs, outputs=merged)
添加回答
举报