在Keras合并2个连续模型

时间:2017-08-31 10:59:29

标签: python machine-learning neural-network keras conv-neural-network

我试图在keras中合并2个连续模型。这是代码:

model1 = Sequential(layers=[
    # input layers and convolutional layers
    Conv1D(128, kernel_size=12, strides=4, padding='valid', activation='relu', input_shape=input_shape),
    MaxPooling1D(pool_size=6),
    Conv1D(256, kernel_size=12, strides=4, padding='valid', activation='relu'),
    MaxPooling1D(pool_size=6),
    Dropout(.5),

])

model2 = Sequential(layers=[
    # input layers and convolutional layers
    Conv1D(128, kernel_size=20, strides=5, padding='valid', activation='relu', input_shape=input_shape),
    MaxPooling1D(pool_size=5),
    Conv1D(256, kernel_size=20, strides=5, padding='valid', activation='relu'),
    MaxPooling1D(pool_size=5),
    Dropout(.5),

])

model = merge([model1, model2], mode = 'sum')
Flatten(),
Dense(256, activation='relu'),
Dropout(.5),
Dense(128, activation='relu'),
Dropout(.35),
# output layer
Dense(5, activation='softmax')
return model

以下是错误日志:

  

文件   “/nics/d/home/dsawant/anaconda3/lib/python3.6/site-packages/keras/backend/tensorflow_backend.py”   第392行,在is_keras_tensor中       提出ValueError('意外地发现了类型为' + str(type(x)) + '的实例。'ValueError:意外地发现了一个实例   输入<class 'keras.models.Sequential'>。期待象征性的张量   实例

更多日志:

  

ValueError:使用不是a的输入调用图层merge_1   象征张量。收到类型:class'keras.models.Sequential'。   完整输入:[keras.models.Sequential object at 0x2b32d518a780,   keras.models.Sequential object at 0x2b32d521ee80]。所有输入到   图层应该是张量。

如何合并使用不同窗口大小的这两个Sequential模型并将“max”,“sum”等函数应用于它们?

1 个答案:

答案 0 :(得分:13)

使用功能API 为您带来所有可能性。

使用功能API时,您需要跟踪输入和输出,而不仅仅是定义图层。

您定义了一个图层,然后使用输入张量调用图层以获得输出张量。模型和图层可以完全相同的方式调用。

对于合并图层,我更喜欢使用更直观的其他合并图层,例如Add()Multiply()Concatenate()

from keras.layers import *

mergedOut = Add()([model1.output,model2.output])
    #Add() -> creates a merge layer that sums the inputs
    #The second parentheses "calls" the layer with the output tensors of the two models
    #it will demand that both model1 and model2 have the same output shape

同样的想法适用于以下所有层。我们不断更新输出张量,将其提供给每一层并获得新的输出(如果我们对创建分支感兴趣,我们将为每个感兴趣的输出使用不同的var来跟踪它们):

mergedOut = Flatten()(mergedOut)    
mergedOut = Dense(256, activation='relu')(mergedOut)
mergedOut = Dropout(.5)(mergedOut)
mergedOut = Dense(128, activation='relu')(mergedOut)
mergedOut = Dropout(.35)(mergedOut)

# output layer
mergedOut = Dense(5, activation='softmax')(mergedOut)

现在我们创建了&#34;路径&#34;,现在是时候创建Model了。创建模型就像告诉它开始的输入张量以及结束的位置一样:

from keras.models import Model

newModel = Model([model1.input,model2.input], mergedOut)
    #use lists if you want more than one input or output    

请注意,由于此模型有两个输入,因此您必须在列表中使用两个不同的X_training vars进行训练:

newModel.fit([X_train_1, X_train_2], Y_train, ....)    

现在,假设您只想要一个输入,并且model1和model2都将采用相同的输入。

功能API通过创建输入张量并将其提供给模型(我们称模型就像它们是图层一样)非常容易:

commonInput = Input(input_shape)

out1 = model1(commonInput)    
out2 = model2(commonInput)    

mergedOut = Add()([out1,out2])

在这种情况下,模型会考虑这个输入:

oneInputModel = Model(commonInput,mergedOut)