Conv1D 层 Keras 的 input_shape

Posted

技术标签:

【中文标题】Conv1D 层 Keras 的 input_shape【英文标题】:input_shape of Conv1D layer Keras 【发布时间】:2021-12-31 20:31:39 【问题描述】:

我正在尝试为非图像数据集的二进制分类制作 CNN 模型。我的模型/代码正在运行并产生非常好的结果(准确度很高),但我无法理解Conv1D 第一层的input_shape 参数。

X 或输入(此处为x_train_df)的形状为 (2000, 28)。它有 28 个特征和 2000 个样本。 Y 或标签的形状(此处为y_train_df)为 (2000, 1)。

model = Sequential()
model.add(Conv1D(filters = 64, kernel_size = 3, activation = 'relu', input_shape = (x_train_df.shape[1], 1)))
model.add(Conv1D(filters = 64, kernel_size = 3, activation = 'relu'))
model.add(MaxPooling1D(pool_size = 2))
model.add(Flatten())
model.add(Dense(100, activation = 'relu'))
model.add(Dense(1, activation = 'sigmoid'))

optimzr = Adam(learning_rate=0.005)
model.compile(loss='binary_crossentropy', optimizer=optimzr,  metrics=[[tf.keras.metrics.AUC(curve="ROC", name = 'auc')], [tf.keras.metrics.AUC(curve="PR", name = 'pr')]])

# running the fitting
model.fit(x_train_df, y_train_df, epochs = 2, batch_size = 32, validation_data = (x_val_df, y_val_df), verbose = 2)

我已将 input_shape 设为 (28, 1)(参考自 this question)。

但是在Conv1D layer documentation 中是这样写的,

当将此层用作模型中的第一层时,请提供 input_shape 参数(整数元组或无,例如 (10, 128) 为 128维向量的10个向量序列

我从中了解到的是 input_shape 的维度应该是 (2000, 1) 因为我有 2000 个一维向量。但是将其设为input_shape 会显示错误,

ValueError: 层“sequential_25”的输入 0 与 层:预期形状=(无,2000,1),找到形状=(无,28)

所以我的问题是正确的input_shape 应该是什么?

【问题讨论】:

你能说出你的 input_shape (2000,1) 的数据集形状是什么吗? 如果您的数据集形状为 (2000, 1)=(batch_size, row) 与 input_shape(2000, 1) 不正确。因此,必须对数据集进行整形 (batch_size, 2000, 1)。 我原始输入的形状是 (2000, 28)。假设批量大小为 1,使其 (1, 2000, 28) 显示错误。请查看对答案的评论。 【参考方案1】:

让我们看看“Conv1D”是如何接受输入的。

>>> # The inputs are 128-length vectors with 10 timesteps, and the batch size
>>> # is 4.
>>> input_shape = (4, 10, 128)
>>> x = tf.random.normal(input_shape)
>>> y = tf.keras.layers.Conv1D(
... 32, 3, activation='relu',input_shape=input_shape[1:])(x)
>>> print(y.shape)
    (4, 8, 32)

3+D 张量,形状为:batch_shape + (steps, input_dim)

As seen above,有 128 个特征,10 个时间步长,批量大小为 4。因此,Conv1D 将输入作为 (batch_size,timesteps,features)。它需要 3D 输入。假设您为您的案例选择批量大小为 1。你必须提供像 (1,2000,28) 这样的输入。

【讨论】:

将输入设为 (1,2000,28) 导致错误为 ValueError: logits and labels must have the same shape, received ((None, 1) vs (None, 2000)). 所以我将 x_train_df 的形状更改为 (2000, 28, 1) 和 (2000, 1, 1) 对于y_train_df,如图所示in this 并且有效。我对此感到困惑。如果您能解释如何修改问题中的代码,这将非常有帮助。

以上是关于Conv1D 层 Keras 的 input_shape的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 的卷积层上使用 Dropout

Keras CNN模型参数计算

Keras网络层之卷积层

嵌入层后的dropout层

卷积层(CNN)如何在 keras 中工作?

知识图谱深度学习:Keras 初探