我试图在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”等函数应用于它们?
答案 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)