2017-07-02 460 views
3

如何多次訓練1個模型並將它們組合到輸出層?如何在keras中同時訓練多個神經網絡?

例如:

model_one = Sequential() #model 1 
model_one.add(Convolution2D(32, 3, 3, activation='relu', input_shape=(1,28,28))) 
model_one.add(Flatten()) 
model_one.add(Dense(128, activation='relu')) 

model_two = Sequential() #model 2 
model_two.add(Dense(128, activation='relu', input_shape=(784))) 
model_two.add(Dense(128, activation='relu')) 

model_???.add(Dense(10, activation='softmax')) #combine them here 

model.compile(loss='categorical_crossentropy', #continu together 
      optimizer='adam', 
      metrics=['accuracy']) 


model.fit(X_train, Y_train, #continu together somehow, even though this would never work because X_train and Y_train have wrong formats 
     batch_size=32, nb_epoch=10, verbose=1) 

我聽說,我可以做到這一點通過圖模型,但我找不到它的任何文件。

編輯:在回答下面的建議:

A1 = Conv2D(20,kernel_size=(5,5),activation='relu',input_shape=(28, 28, 1)) 
---> B1 = MaxPooling2D(pool_size=(2,2))(A1) 

拋出這個錯誤:

AttributeError: 'Conv2D' object has no attribute 'get_shape' 

回答

3

圖形符號會爲你做它。從本質上講,你給每個層,然後一個獨特的手柄使用手柄末鏈接回到上一層括號:

layer_handle = Layer(params)(prev_layer_handle) 

注意,第一層必須是Input(shape=(x,y))沒有事先聯繫。

然後,當你讓你的模型,你需要告訴它,它預計與列表多個輸入:

model = Model(inputs=[in_layer1, in_layer2, ..], outputs=[out_layer1, out_layer2, ..]) 

最後,當你訓練它,你還需要提供相應的輸入和輸出數據的列表與你的定義:

model.fit([x_train1, x_train2, ..], [y_train1, y_train2, ..]) 

同時其他一切都是一樣的,所以你只需要綜合這些結合起來,給你你想要的網絡佈局:

from keras.models import Model 
from keras.layers import Input, Convolution2D, Flatten, Dense, Concatenate 

# Note Keras 2.02, channel last dimension ordering 

# Model 1 
in1 = Input(shape=(28,28,1)) 
model_one_conv_1 = Convolution2D(32, (3, 3), activation='relu')(in1) 
model_one_flat_1 = Flatten()(model_one_conv_1) 
model_one_dense_1 = Dense(128, activation='relu')(model_one_flat_1) 

# Model 2 
in2 = Input(shape=(784,)) 
model_two_dense_1 = Dense(128, activation='relu')(in2) 
model_two_dense_2 = Dense(128, activation='relu')(model_two_dense_1) 

# Model Final 
model_final_concat = Concatenate(axis=-1)([model_one_dense_1, model_two_dense_2]) 
model_final_dense_1 = Dense(10, activation='softmax')(model_final_concat) 

model = Model(inputs=[in1, in2], outputs=model_final_dense_1) 

model.compile(loss='categorical_crossentropy', #continu together 
       optimizer='adam', 
       metrics=['accuracy']) 

model.fit([X_train_one, X_train_two], Y_train, 
      batch_size=32, nb_epoch=10, verbose=1) 

文檔可在Functional Model API中找到。我建議閱讀其他問題或查看Keras' repo以及文檔目前沒有很多示例。

+0

非常感謝!你從哪裏導入Model和Concatenate?你有鏈接到正確的文檔? –

+0

它在第二行發生錯誤。我編輯了我得到的錯誤。 –

+1

沒問題,現在應該工作,我混淆了兩個API,你需要在功能版本中有一個明確的Input()層。我想你也可能會使用Keras的舊版本;我更新了v2和默認頻道的最後維度排序,您可能必須在您的最後更改。 – Lif3line