我正在尝试为非图像数据集的二进制分类创建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
应该是什么?
3条答案
按热度按时间kuarbcqp1#
让我们来看看“Conv1D”如何接受输入。
字符串
带形状的3+DTensor:batch_shape +(steps,input_dim)
As seen above,有128个特征,10个时间步,批量大小为4。因此,Conv1D将输入作为(batch_size,timesteps,features)。它将输入3D。假设您为案例选择批量大小为1。您必须提供给予输入,如(1,2000,28)。
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%的测试数据与真实的数据。
ws51t4hk3#
我在尝试实现Wavenet时遇到了这个问题,其中的音频功能是音频样本的一维数组。示例代码给出了以下错误:
字符串
x.shape
这里是(BATCH_SIZE,64000)
或者在我的例子中是(100,64000)
错误消息指示
min_ndim=3
但ndim=2
。我通过将
1
附加到输入层的形状来解决这个问题:型
现在
x
的形状是(100,64000,1)
,Conv1D
吃掉了它。这反映了音频样本等同于单个“通道”的观点(与计算机视觉上下文相比)。因此,通过假装音频数据实际上是单色图像数据,Tensorflow的神就被安抚了,在所有时间周期中带来了美味指标的良好收获。