连接多个卷积块:”一个`Concatenate`层应该被调用在一个至少包含2个输入的列表上”

我在尝试重建一篇论文中提到的卷积模型,但遇到了一些问题。

这是论文中模型的架构:enter image description here

这是我用Python和TensorFlow尝试的代码:

X = dfy = dataset['attack_map']X_train, X_test, y_train, y_test = train_test_split(X,y, test_size = 0.30)X_train = np.array(X_train)X_test = np.array(X_test)y_train = np.array(y_train)y_test = np.array(y_test)X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1)shape = (X_train.shape[1], X_train.shape[2])## 第一块model1 = tf.keras.Sequential()model1.add(tf.keras.layers.InputLayer(input_shape = shape))model1.add(tf.keras.layers.Conv1D(filters = 32, kernel_size = 2, strides = 1))model1.add(tf.keras.layers.Activation('relu'))model1.add(tf.keras.layers.MaxPooling1D(pool_size = 2, strides = 1))model1.add(tf.keras.layers.Flatten())model1.add(tf.keras.layers.Dropout(.5))## 第二块model2 = tf.keras.Sequential()model2.add(tf.keras.layers.InputLayer(input_shape = shape))model2.add(tf.keras.layers.Conv1D(filters = 32, kernel_size = 4, strides = 1))model2.add(tf.keras.layers.Activation('relu'))model2.add(tf.keras.layers.MaxPooling1D(pool_size = 4, strides = 1))model2.add(tf.keras.layers.Flatten())model2.add(tf.keras.layers.Dropout(.5))## 第三块model3 = tf.keras.Sequential()model3.add(tf.keras.layers.InputLayer(input_shape = shape))model3.add(tf.keras.layers.Conv1D(filters = 32, kernel_size = 8, strides = 1))model3.add(tf.keras.layers.Activation('relu'))model3.add(tf.keras.layers.MaxPooling1D(pool_size = 8, strides = 1))model3.add(tf.keras.layers.Flatten())model3.add(tf.keras.layers.Dropout(.5))model3.add(tf.keras.layers.Dense(256))model3.add(tf.keras.layers.Dropout(.5))model3.add(tf.keras.layers.Dense(5))model3.add(tf.keras.layers.Softmax())model = tf.keras.Sequential()      model.add(tf.keras.layers.Concatenate([model1, model2, model3]))model.add(tf.keras.layers.Dense(5))model.add(tf.keras.layers.Softmax())model.compile(loss = 'sparse_categorical_crossentropy', optimizer = "adam", metrics = ['accuracy'])callback = tf.keras.callbacks.EarlyStopping(monitor="val_loss", min_delta=0, patience=10, verbose=1, mode="auto", baseline=None, restore_best_weights=False),start = time.perf_counter()model.fit(X_train, y_train, epochs=EPOCHS, callbacks=[callback])elapsed = time.perf_counter() - startmodel.evaluate(X_test,  y_test, verbose=2)print('Elapsed %.3f seconds.' % elapsed)

我得到的错误是:

 ValueError: A `Concatenate` layer should be called on a list of at least 2 inputs

我的想法是连接这些块。这可能是一个愚蠢的问题,但我最近一直在使用TensorFlow。

有什么建议吗?谢谢


回答:

你应该在Keras中使用函数式API。这样你可以很容易地通过以下伪代码实现它:

h1=tf.keras.layers.Conv1D(filters = 32, kernel_size = 4, strides = 1)(inp)h1=tf.keras.layers.Activation('relu')(h)h1=tf.keras.layers.Flatten()(h)h1=tf.keras.layers.Dense(5)(h)out1=tf.keras.layers.Softmax()(h).........h2=tf.keras.layers.Dense(5)(h)out2=tf.keras.layers.Softmax()(h).........h3=tf.keras.layers.Dense(5)(h)out3=tf.keras.layers.Softmax()(h)

基本上,out值代表不同结果密集层的输出。(模型)

h=tf.keras.layers.concatenate([out1,out2,out3])h=tf.keras.layers.Dense(5)(h)R_out=tf.keras.layers.Softmax()(h)model=tf.keras.Model(inputs=inp,outputs=R_out)

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注