下面有一段两个Sequential的model连接一起的例子
错误示例
错误代码如下,
from keras.models import Sequential
from keras.layers.core import Dense
from keras.layers import Concatenate
import numpy as np
left_branch = Sequential()
left_branch.add(Dense(32, input_dim=1))
right_branch = Sequential()
right_branch.add(Dense(32, input_dim=1))
merged = Concatenate([left_branch, right_branch])
model= Sequential()
model.add(merged)
model.add(Dense(10, activation='softmax'))
input_data_1=np.linspace(1,32, num=32)
input_data_2=np.linspace(1,1, num=32)
targets=np.array([1,1,1,1,1,0,0,0,0,0])
final_data = np.concatenate([input_data_1,input_data_2])
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit(final_data, targets)
在执行时抛出如下错误:
A `Concatenate` layer should be called on a list of at least 2 inputs
上层有两个Sequential的model,输入应该是两个,所以改一下
final_model.fit([input_data_1,input_data_2], targets)
但是又抛出异常assert len(inputs) == 1
错误原因
- Sequential是一个model对象,对于Concatenate操作,是对Layer的操作。所以left_branch和right_brach需要改为layer对象
- 最终的model不需要Sequential来建立,直接调用Model生成,然后指定inputs/outputs即可
- fit的时候需要单独输入两个Input的值
正确示例
left_input = Input(shape=((1, 32)))
right_input = Input(shape=((1, 32)))
left_branch = Dense(10)(left_input)
right_branch = Dense(10)(right_input)
layer_cb = keras.layers.concatenate([left_branch, right_branch])
layer_out = Dense(2)(layer_cb)
model = Model(inputs=[left_input, right_input], outputs=layer_out)
model.summary()
input_data_1=np.linspace(1,32, num=32).reshape((1,1,32))
input_data_2=np.linspace(1,1, num=32).reshape((1,1,32))
targets=np.array([1,0]).reshape((1, 1, 2))
model.compile(optimizer='rmsprop', loss='categorical_crossentropy')
model.fit([input_data_1, input_data_2], targets)