2017-02-24 107 views
2

我是Keras的新手。我正在嘗試合併Keras中三個預訓練模型的輸出層。每個模型都有兩個獨立的輸入,但尺寸不同,密集層輸出。合併具有不同輸入形狀的不同型號的輸出

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) 

由於型號?.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() 

回答

4

的模型對象不是可調用的函數。這應該可以解決這個問題:

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() 
+1

謝謝您的回答,但模型調用就像層[https://keras.io/getting-開始/功能-API導/(https://keras.io/getting-started/functional-api-guide/)。這並沒有解決我的問題。 – user2595774

+0

感謝您的鏈接,我站在糾正。雖然它在我的最後工作。我正在分享整個代碼。 – indraforyou

+0

非常感謝!它像一個魅力!我在我的文章中修改了多個輸入的解決方案,但它基本相同。 – user2595774

相關問題