Conv1D层Keras的input_shape

js81xvg6  于 5个月前  发布在  其他
关注(0)|答案(3)|浏览(71)

我正在尝试为非图像数据集的二进制分类创建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参数(整数元组或None,例如(10,128),用于128维向量10个向量的序列。
我从中理解到的是,input_shape的维数应该是(2000,1),因为我有2000个一维向量。但是将其设为input_shape会显示错误,
ValueError:图层“sequential_25”的输入0与图层不兼容:预期形状=(None,2000,1),发现形状=(None,28)

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

kuarbcqp

kuarbcqp1#

让我们来看看“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+DTensor:batch_shape +(steps,input_dim)
As seen above,有128个特征,10个时间步,批量大小为4。因此,Conv1D将输入作为(batch_size,timesteps,features)。它将输入3D。假设您为案例选择批量大小为1。您必须提供给予输入,如(1,2000,28)。

uoifb46i

uoifb46i2#

我也使用CNN-Conv 1D处理非图像数据集。我有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))
因此输入形状(无,188,1)
这对我来说很有用,我得到了97%的训练和91%的测试数据与真实的数据。

ws51t4hk

ws51t4hk3#

我在尝试实现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=3ndim=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的神就被安抚了,在所有时间周期中带来了美味指标的良好收获。

相关问题