我试图在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:使用不是符号张量的输入调用图层merge_1 . 收到类型:class'keras.models.Sequential' . 完整输入:[keras.models.Sequential object at 0x2b32d518a780,keras.models.Sequential object at 0x2b32d521ee80] . 该层的所有输入都应该是张量 .
如何合并使用不同窗口大小的这两个Sequential模型并将“max”,“sum”等函数应用于它们?
1 回答
使用 functional API 为您带来所有可能性 .
使用功能API时,您需要跟踪输入和输出,而不仅仅是定义图层 .
您定义一个图层,然后使用输入张量调用图层以获得输出张量 . 模型和图层可以完全相同的方式调用 .
对于合并图层,我更喜欢使用更直观的其他合并图层,例如
Add()
,Multiply()
和Concatenate()
.同样的想法适用于以下所有层 . 我们不断更新输出张量,将它提供给每一层并获得一个新输出(如果我们对创建分支感兴趣,我们将为每个感兴趣的输出使用不同的var来跟踪它们):
现在我们创建了"path",是时候创建
Model
了 . 创建模型就像告诉它开始的输入张量以及结束的位置:请注意,由于此模型有两个输入,您必须在列表中使用两个不同的
X_training
vars训练它:现在,假设您只需要一个输入,并且model1和model2将采用相同的输入 .
功能API通过创建输入张量并将其提供给模型(我们称模型就像它们是图层一样)非常容易:
在这种情况下,模型会考虑这个输入: