Python 在Keras中合并2个序列模型

Python 在Keras中合并2个序列模型,python,machine-learning,neural-network,keras,conv-neural-network,Python,Machine Learning,Neural Network,Keras,Conv Neural Network,我正在尝试合并keras中的两个连续模型。代码如下: 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

我正在尝试合并keras中的两个连续模型。代码如下:

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_张量中 raise VALUERROR('意外找到类型为
'+str(类型(x))+'
'的实例)VALUERROR:意外找到类型为的实例 键入
。应为符号张量 例如

更多日志:

ValueError:调用层合并_1时使用的输入不是 符号张量。接收类型:类“keras.models.Sequential”。 完整输入:[keras.models.Sequential对象位于0x2b32d518a780, 0x2b32d521ee80]处的keras.models.Sequential对象。所有到 层应该是张量


如何合并这两个使用不同窗口大小的连续模型,并对其应用“max”、“sum”等函数?

使用函数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来跟踪它们):

现在,我们已经创建了“路径”,现在是创建
模型的时候了。创建模型就像告诉输入张量的起始点和结束点一样:

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非常容易实现这一点:

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

oneInputModel = Model(commonInput,mergedOut)

你需要合并两个模型的输出层,我认为你不能在keras中合并已编译的模型。你应该看看check:明白。我认为我们可以。值得一试。感谢链接编译不会影响任何关于创建/更改模型的事情。但是当你更改时,你必须重新编译以进行培训。(在keras中编译只是:“为训练设置优化器和损失函数”,没有别的)。如果你不打算训练,你甚至不需要“编译”一个模型,它可以做任何事情,包括预测,当它没有编译时,除了训练。因此,当我们想要合并两个模型时,我们不能将这两个模型声明为Sequential()?我们必须使用函数式API。我在调用Concatenate()时不断遇到我在问题中提到的错误。在这种情况下,我们不能使用Sequential()。您可以保留序列模型,没有问题,但最终模型不能是序列的,这是不可行的。错误消息是关于:“调用层时,您没有传递张量"。您很可能正在传递模型。请注意我的答案中的
model1.output
model2.output
张量。---
model1是一个模型,而
model1.output
是一个张量。最终的模型是一个函数式
模型
,包含两个
顺序
模型和一些附加项我发现很难理解最后一部分。我正在用相同的训练数据训练我的两个模型。这是我的fit()函数-
model.fit([train\u data,train\u data],train\u标签,batch\u size=256,epochs=5,validation\u data=(test\u数据,test\u标签),verbose=1,callbacks=callbacks)
我仍然收到一个错误,错误是:
ValueError:模型需要2个输入数组,但只收到一个数组。找到:形状为(1807,6000,1)的数组
可能是因为
验证\u数据
,它还需要两个输入,就像您对
训练\u数据所做的那样。
commonInput = Input(input_shape)

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

mergedOut = Add()([out1,out2])
oneInputModel = Model(commonInput,mergedOut)