如何在keras中组合两个预训练模型?

如何在keras中组合两个预训练模型?,keras,deep-learning,computer-vision,Keras,Deep Learning,Computer Vision,我想结合两个预训练模型(DenseNet169和InceptionV3),也可以是任意两个。遵循以下链接中的步骤,但不起作用。确实尝试了连接和连接,但仍然出现错误。我可能在什么地方犯了一些错误。这是我的第一个问题,非常感谢您的帮助。 第一个案例:我尝试了没有池 model1 = DenseNet169(weights='imagenet', include_top=False, input_shape=(300,300,3)) out1 = model1.output model2 =

我想结合两个预训练模型(DenseNet169和InceptionV3),也可以是任意两个。遵循以下链接中的步骤,但不起作用。确实尝试了连接和连接,但仍然出现错误。我可能在什么地方犯了一些错误。这是我的第一个问题,非常感谢您的帮助。 第一个案例:我尝试了没有池

model1 = DenseNet169(weights='imagenet', include_top=False, input_shape=(300,300,3))
out1 = model1.output    

model2 = InceptionV3(weights='imagenet', include_top=False, input_shape=(300,300,3))
out2 = model2.output

from keras.layers import concatenate 
from keras.layers import Concatenate 

x = concatenate([out1, out2])  # merge the outputs of the two   models
out = Dense(10, activation='softmax')(x)  # final layer of the network
我得到了这个错误:

ValueError:A
连接
层需要输入匹配的形状,concat轴除外。获取输入形状:[(无,9,9,1664),(无,8,8,2048)]

第二种情况:尝试使用平均池,能够连接,但在训练过程中出错

model1 = DenseNet169(weights='imagenet', include_top=False, pooling='avg', input_shape=(300,300,3))
out1 = model1.output   

model2 = InceptionV3(weights='imagenet', include_top=False, pooling='avg', input_shape=(300,300,3))
out2 = model2.output

x = concatenate([out1, out2])  # merge the outputs of the two models
out = Dense(10, activation='softmax')(x)  # final layer of the network

model = Model(inputs=[model1.input, model2.input], outputs=[out])

model.compile(optimizer=Adam(), loss='categorical_crossentropy',metrics=['accuracy'])
history = model.fit_generator(generator=data_generator_train,
                          validation_data=data_generator_val,
                          epochs=20,
                          verbose=1
                         )
第二种情况下的错误: ValueError:检查模型输入时出错:传递给模型的Numpy数组列表的大小不是模型预期的大小。预期会看到2个数组,但得到了以下1个数组的列表:[array([[0.17074525,0.10469133,0.08226486], [0.19852941, 0.13124999, 0.11642157], [0.36528033, 0.3213197 , 0.3085095 ], ...,
[0.19082414,0.17801011,0.15840226…

第二种情况:由于您的模型需要两个输入,因此您的
数据生成器序列
数据生成器
应该返回/生成对应模型和输出的两个输入的列表。您可以通过更新
\u数据生成器
的返回值来实现这一点方法

def __data_generation(...):
    ...
    # consider X as input image and y as the label of your model
    return [X, X], keras.utils.to_categorical(y, num_classes=self.n_classes)
第一种情况:由于model2
(8x8)
输出的空间大小与model1
(9x9)
输出的空间大小不同(更小),因此可以在串联之前对model2输出应用零填充

out1 = model1.output
out2 = model2.output
out2 = ZeroPadding2D(((0,1), (0,1)))(out2)
x = concatenate([out1, out2])

对于第一种情况,也需要修改第二种情况下的数据生成器。

< P>第二种情况下的结构是正确的,但是考虑连接两个模型,如果两个模型的输入是相似的,那么每个模型都有自己的输入,通过重复这样的输入:
model.fit([X_train,X_train], y_train)
我自己解决了你的问题,效果非常好

model1 = DenseNet169(weights='imagenet', include_top=False)
model2 = InceptionV3(weights='imagenet', include_top=False)

model1_out = model1.output
model1_out=GlobalAveragePooling2D()(model1_out)

model2_out = model2.output
model2_out=GlobalAveragePooling2D()(model2_out)

x = concatenate([model1_out, model2_out])

x = Dense(10, activation='softmax')(x) 

model=Model(inputs=[model1.input,model2.input],outputs=x)

model.fit([X_train,X_train], y_train)

非常感谢您的详细解释。非常感谢。我尝试了您的方法。它对fit运行良好,但对fit_generator仍有相同的错误。有任何对fit_generator也有效的方法吗?感谢您的帮助。非常感谢。我使用了来自的类DataGenerator,仍然不太了解如何修复“def_data_generation”部分要到达[X,X,y]。在培训过程中仍然遇到相同的错误。请帮助我解决此问题。请尝试使用
返回[X,X],keras.utils.to_category(y,num_classes=self.n_classes)
中的
数据生成
方法。希望它会有帮助。问题现已解决。谢谢,非常感谢。