合并具有不同输入形状的不同模型的输出

Posted

技术标签:

【中文标题】合并具有不同输入形状的不同模型的输出【英文标题】:Merge outputs of different models with different input shapes 【发布时间】:2017-07-15 16:15:10 【问题描述】:

我是 Keras 的新手。我正在尝试在 Keras 中合并三个预训练模型的输出层。每个模型都有两个独立的输入,但维度不同,还有一个 Dense 层输出。

    model1 = MyModel1() #returns keras.engine.training.Model
    model2 = MyModel2() #returns keras.engine.training.Model
    model3 = MyModel3() #returns keras.engine.training.Model

    x = merge([model1(model1.input),
               model2(model2.input),
               model3(model3.input)],
              mode='concat', concat_axis=1)

    # add some trainable layers here...

    # and a final softmax layer
    x = Dense(2, activation='softmax')(x)

    return Model(input=[model1.input,
                        model2.input,
                        model3.input],
                 output=x)

由于 model?.input 返回张量列表,这不起作用。我尝试了不同的东西,但似乎没有任何效果。这个问题有简单的解决方案吗?

编辑: 来自 indraforyou 的改编工作解决方案,适用于每个模型中的多个输入。

    from keras.models import Model
    from keras.layers import Input, Dense, merge


    def MyModel1():
        inp1 = Input(batch_shape=(None,32,))
        inp2 = Input(batch_shape=(None,32))
        x = Dense(8)(inp1)
        y = Dense(8)(inp2)
        merged = merge([x, y], mode='concat', concat_axis=-1)
        out = Dense(8)(merged)
        return Model(input=[inp1,inp2], output=out)

    def MyModel2():
        inp1 = Input(batch_shape=(None,10,))
        inp2 = Input(batch_shape=(None,10,))
        x = Dense(4)(inp1)
        y = Dense(4)(inp2)
        merged = merge([x, y], mode='concat', concat_axis=-1)
        out = Dense(4)(merged)
        return Model(input=[inp1,inp2], output=out)

    def MyModel3():
        inp1 = Input(batch_shape=(None,12,))
        inp2 = Input(batch_shape=(None,12,))
        x = Dense(6)(inp1)
        y = Dense(6)(inp1)
        merged = merge([x, y], mode='concat', concat_axis=-1)
        out = Dense(6)(merged)
        return Model(input=[inp1,inp2], output=out)

    model1 = MyModel1()
    model2 = MyModel2()
    model3 = MyModel3()

    x = merge([model1.output,
               model2.output,
               model3.output],
              mode='concat', concat_axis=-1)

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

    merged =  Model(input=[model1.input[0], model1.input[1],
                           model2.input[0], model2.input[1],
                           model3.input[0], model3.input[1]],
                    output=x)

    merged.summary()

【问题讨论】:

【参考方案1】:

模型对象不是可调用函数。这应该可以解决问题:

x = merge([model1.output,
           model2.output,
           model3.output],
          mode='concat', concat_axis=1)

更新工作代码

from keras.models import Model
from keras.layers import Input, Dense, merge


def MyModel1():
  inp = Input(batch_shape=(None,32,))
  out = Dense(8)(inp)
  return Model(input=inp, output=out)

def MyModel2():
  inp = Input(batch_shape=(None,10,))
  out = Dense(4)(inp)
  return Model(input=inp, output=out)

def MyModel3():
  inp = Input(batch_shape=(None,12,))
  out = Dense(6)(inp)
  return Model(input=inp, output=out)

model1 = MyModel1()
model2 = MyModel2()
model3 = MyModel3()

x = merge([model1.output,
           model2.output,
           model3.output],
          mode='concat', concat_axis=1)

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

merged =  Model(input=[model1.input,
                    model2.input,
                    model3.input],
             output=x)

merged.summary()

【讨论】:

感谢您的回答,但模型可以像层https://keras.io/getting-started/functional-api-guide/ 一样调用。这并没有解决我的问题。 感谢您的链接,我已更正。虽然它在我的最后工作。我正在分享整个代码。 非常感谢!它就像一个魅力!我在我的帖子中调整了您的多输入解决方案,但基本相同。 没问题,你想出了多输入的情况很好

以上是关于合并具有不同输入形状的不同模型的输出的主要内容,如果未能解决你的问题,请参考以下文章

转换后的 Tensorrt 模型与 Tensorflow 模型的输出形状不同?

无法合并具有两个不同实体的模型

基于图像和文本特征的 TensorFlow 训练模型,具有多类输出

Keras,Tensorflow:将两个不同的模型输出合并为一个

Keras 序列模型输入层

最后一层的张量输出在 PyTorch 中的形状错误