Conv1D 层 Keras 的 input_shape

问题描述 投票:0回答:3

我正在尝试制作一个用于非图像数据集二元分类的 CNN 模型。我的模型/代码正在运行并产生非常好的结果(准确性很高),但我无法理解

input_shape
第一层的
Conv1D
参数。

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)(参考这个问题)。

但是在 Conv1D 层文档中写道,

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

我从中了解到的是 input_shape 的维度应该是 (2000, 1),因为我有 2000 个一维向量。但是将其指定为

input_shape
显示错误为,

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

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

input_shape

python tensorflow keras conv-neural-network
3个回答
0
投票

让我们检查一下“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)

如上所示,有 128 个特征,10 个时间步长,批量大小为 4。因此,Conv1D 将输入视为 (batch_size,timesteps,features)。它需要 3D 输入。假设您为您的案例选择批量大小为 1。您必须输入类似 (1,2000,28) 的输入。


0
投票

我也将 CNN-Conv1D 用于非图像数据集。我有 188 个特征。所以我对我的输入这样做: X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1],1))

#在我的 RNN 首字母缩写中

model.add(Reshape((188, 1), input_shape(X_train[1], 1))

所以输入形状 (None, 188, 1)

这对我来说很有效,我得到了 97% 的训练和 91% 用真实数据测试数据。


0
投票

我在尝试实现 Wavenet 时遇到了这个问题,其中音频特征是音频样本的一维数组。给出此错误的示例代码:

x = tf.keras.Input((64000,), BATCH_SIZE)
y = tf.keras.layers.Conv1D(1, 1)(x)
model = Model(x, y)

x.shape
这里是
(BATCH_SIZE,64000)
或者就我而言
(100,64000)

错误消息表明

min_ndim=3
但是
ndim=2

我通过将

1
附加到输入层的形状来解决这个问题:

x = tf.keras.Input((64000,1,), BATCH_SIZE)
y = tf.keras.layers.Conv1D(1, 1)(x)
model = Model(x, y)

现在

x
的形状是
(100,64000,1)
,被
Conv1D
吃掉了。

这反映了音频样本相当于单个“通道”的视角(与计算机视觉环境相比)。因此,通过假装你的音频数据实际上是单色图像数据,Tensorflow诸神得到了安抚,带来了丰收贯穿所有时间周期的美味指标。

© www.soinside.com 2019 - 2024. All rights reserved.