【问题标题】:Concatenate multiple convolution blocks: "A `Concatenate` layer should be called on a list of at least 2 inputs"连接多个卷积块:“应在至少 2 个输入的列表上调用“连接”层”
【发布时间】:2021-10-10 08:39:54
【问题描述】:

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

这是论文中模型的架构:

这是我对 Python 和 Tf 的尝试:

X = df
y = 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])


## FIRST BLOCK
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))

## SECOND BLOCK
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))

## THIRD BLOCK
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() - start


model.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

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

有什么建议吗?谢谢

【问题讨论】:

    标签: python python-3.x tensorflow machine-learning deep-learning


    【解决方案1】:

    您应该在 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)
    

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

    --

    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)
    

    【讨论】:

    • 感谢您的回复。一个问题:这些“出”变量是什么?
    • 哦,抱歉,我忘记添加了。我正在再次编辑检查。
    • 谢谢,我会努力的,我会告诉你的
    猜你喜欢
    • 1970-01-01
    • 2020-04-25
    • 2018-12-22
    • 1970-01-01
    • 2021-11-17
    • 2018-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多