Python 在Keras中合并2个序列模型
我正在尝试合并keras中的两个连续模型。代码如下: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
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)