我正在尝试使用三个预训练的 VGG16、InceptionV3 和 EfficientNetB0 创建一个集成,用于医学图像分类任务。这是我基于 Keras 和 Tensorflow 后端的代码:
def load_all_models():
all_models = []
model_names = ['model1.h5', 'model2.h5', 'model3.h5']
for model_name in model_names:
filename = os.path.join('models', model_name)
model = tf.keras.models.load_model(filename)
all_models.append(model)
print('loaded:', filename)
return all_models
models = load_all_models()
for i, model in enumerate(models):
for layer in model.layers:
layer.trainable = False
print("[INFO] evaluation network ...")
model.evaluate(X_test, verbose=1)
predIdxs = model.predict(X_test, verbose=1)
predprobabilities = model.predict(X_test, verbose=1)
predIdxs = np.argmax(predprobabilities, axis=1)
print(classification_report(y_test.argmax(axis=1), predIdxs, target_names=lb.classes_))
然后,我将三个网络的输出串联连接到一个 Dense
层,如下面的代码所示:
ensemble_visible = [model.input for model in models]
ensemble_outputs = [model.output for model in models]
merge = tf.keras.layers.concatenate(ensemble_outputs)
merge = tf.keras.layers.Dense(10, activation='relu')(merge)
output = tf.keras.layers.Dense(3, activation='sigmoid')(merge)
model = tf.keras.models.Model(inputs=ensemble_visible, outputs=output)
感谢任何帮助或建议,谢谢!
答案 0 :(得分:0)
我们正在加载三个模型,错误提示 Flatten
层的名称重复了 3 次。我们只需要更改名称,
models = load_all_models()
for i, model in enumerate(models):
for layer in model.layers:
if layer.name == "Flatten":
layer.name = "Flatten_{}".format( i )
layer.trainable = False
因此,我们将为 Flatten
、Flatten_0
和 Flatten_1
等三个 Flatten_2
层提供唯一名称。