Python Keras.layers.concatenate生成一个错误';

Python Keras.layers.concatenate生成一个错误';,python,machine-learning,keras,conv-neural-network,Python,Machine Learning,Keras,Conv Neural Network,我正在尝试训练一个有两个输入分支的CNN。这两个分支(b1,b2)将合并成一个由256个神经元组成的密集连接层,其脱落率为0.25。这就是我到目前为止所做的: batch_size, epochs = 32, 3 ksize = 2 l2_lambda = 0.0001 ### My first model(b1) b1 = Sequential() b1.add(Conv1D(128*2, kernel_size=ksize, activation='relu',

我正在尝试训练一个有两个输入分支的CNN。这两个分支(b1,b2)将合并成一个由256个神经元组成的密集连接层,其脱落率为0.25。这就是我到目前为止所做的:

batch_size, epochs = 32, 3
ksize = 2
l2_lambda = 0.0001


### My first model(b1)
b1 = Sequential()
b1.add(Conv1D(128*2, kernel_size=ksize,
             activation='relu',
             input_shape=( xtest.shape[1], xtest.shape[2]),
             kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b1.add(Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b1.add(MaxPooling1D(pool_size=ksize))
b1.add(Dropout(0.2))

b1.add(Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b1.add(MaxPooling1D(pool_size=ksize))
b1.add(Dropout(0.2))

b1.add(Flatten())

###My second model (b2)

b2 = Sequential()
b2.add(Dense(64, input_shape = (5000,), activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b2.add(Dropout(0.1))


##Merging the two models
model = Sequential()
model.add(concatenate([b1, b2],axis = -1))
model.add(Dense(256, activation='relu', kernel_initializer='normal',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
model.add(Dropout(0.25))
model.add(Dense(num_classes, activation='softmax'))
但是当我连接时,它会给我以下错误:

我首先尝试使用以下命令:

  model.add(Merge([b1, b2], mode = 'concat'))
但是我得到一个错误,'ImportError:无法导入名称“合并”。我使用的是keras 2.2.2和python 3.6。

您需要使用来实现所需的功能。您可以使用
连接
层或其等效的功能API
连接

concat = Concatenate(axis=-1)([b1.output, b2.output])
# or you can use the functional api as follows:
#concat = concatenate([b1.output, b2.output], axis=-1)

x = Dense(256, activation='relu', kernel_initializer='normal',
          kernel_regularizer=keras.regularizers.l2(l2_lambda))(concat)
x = Dropout(0.25)(x)
output = Dense(num_classes, activation='softmax')(x)

model = Model([b1.input, b2.input], [output])

请注意,我只将模型的最后一部分转换为函数形式。您可以对其他两个模型执行相同的操作
b1
b2
(实际上,您试图定义的体系结构似乎是一个由两个合并在一起的分支组成的单一模型)。最后,使用
model.summary()
查看并重新检查模型的体系结构

是的,我也试过了,但我还是犯了和以前一样的错误。我不知道如何将其更改为函数式API。我不熟悉Keras和机器学习。啊哈!使用
b1.output
b2.output
而不是
b1
b2
。我刚刚尝试过,现在出现了以下错误:TypeError:添加的层必须是类层的实例。找到:Tensor(“concatenate_1/concat:0”,shape=(?,?),dtype=float32)我不确定这是否有用。但是xtest.shape[1]是5000,xtest.shape[2]是208。对不起!我最初的评论有点错误(因此我删除了它以防止进一步混淆)。请看我的答案,谢谢。我的网络现在运行良好。你为我保留了这一天:)