如何在 Keras 中为维度 (2505,10) 的数据设计 CNN?

Posted

技术标签:

【中文标题】如何在 Keras 中为维度 (2505,10) 的数据设计 CNN?【英文标题】:How to design a CNN in Keras for data of dimensions (2505,10)? 【发布时间】:2021-10-05 20:21:59 【问题描述】:

我正在设计一个用于分类静息态 EEG 信号的神经网络。我已经对我的数据进行了预处理,这样每个主题的特征都是由一个包含 111 个通道的表格及其超过 2505 个时间步长的读数组成。作为降维的衡量标准,我将 111 个通道聚集到大脑的 10 个叶中,有效地将每个受试者的维度降低到 (2505,10)。由于这些数据是 2D 的,我认为它类似于用于灰度图像的 CNN。

我已将每个受试者的 EEG 数据编译成一个大小为(253、2505、10)的数据框,其中 253 是受试者的数量。相应的地面实况值存储在大小为 (253,1) 的列表中,其索引与数据帧中的索引匹配。我想建立一个分类器来判断受试者是多动症阳性还是阴性。我一直在设计神经网络,尤其是在将主题传递到第一层时面临维度问题。

#where        X=[df0, df1, df2,......, df252]    &    y=[0,1,0,........,1]

# Model configuration
batch_size = 100
no_epochs = 30
learning_rate = 0.001
no_classes = 2
validation_split = 0.2
verbosity = 1

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu', padding='same'))

model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
              metrics=['accuracy'])
# Fit data to model
i=0 #validation_data=(X_test, y_test),
X_train = np.array(X_train)
y_train = np.array(y_train)
print("X_train:\t")
print(X_train.shape)
print("y_train:\t")
print(y_train.shape)

history = model.fit(X_train,y_train, 
              batch_size=batch_size,
              epochs=no_epochs,
              verbose=verbosity)

ValueError:layersequential_12 的输入 0 与 layer 不兼容::预期 min_ndim=4,发现 ndim=3。收到的完整形状:(无,2505,10)。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

要对您的训练数据进行 Conv2D 建模,从图像处理的角度来看,需要具有 4 维(N_observatoion、nrows、ncolumns、nchannels)。因此,您必须根据您的领域知识相应地重塑您的功能以使其有意义:

X_train = np.array(X_train).reshape(253, 2505, 10, 1) or # np.array(X_train).reshape(253, 2505, 1, 10) 
# Then models can be defined as following:
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape = X_train.shape[1:], padding='same'))

我没有任何使用 Signal 数据的经验,但我想分享的是,如果您的通道列在图像像素中没有任何空间意义,那么考虑 2D Conv 网络是没有意义的。例如,如果在 111 个通道中将通道 X 的数据放入第 1 列或将通道 Y 的数据放入第 1 列,则在图像像素的情况下没有任何有意义的差异,那么您的 conv2D 滑块不会获得任何重要信息。相反,您可以考虑使用 conv1D 或 LSTM 网络。对于 conv 1D 网络,您不需要 4 维 X 并且您当前的 3 维 X 是可以的。你可以试试:

model = models.Sequential()
model.add(layers.Conv1D(32, 3, activation='relu', input_shape = X_train.shape[1:], padding='same'))

【讨论】:

非常感谢您的指导。我设法克服了这个问题,但是,现在我面临一个不同的问题。我将 X_train 和 y_train 变量传递给 model.fit() 但我得到一个“InvalidArgumentError:Logits 和标签必须具有相同的第一维。得到 logits 形状 [12520, 64] 和标签形状 [10]。我必须提到 X_train由总共 253 个实例中的 169 个实例(主题)组成。我选择了 10 个批量大小。我在 google 上搜索了错误,但我无法理解系统如何获得 logits 形状 [12520, 64]。我仍在尝试进行 2DConv。 如果您的 y 只有 2 个类别,那么您可以尝试使用二元交叉熵损失,并且您的网络应该以单个节点结束。但是,如果您有 10 个类别,那么您需要将 y_train 作为 10X1 阶矩阵,并且您的网络最终必须有 10 个节点。您可以在最后添加一些密集层来实现这一点 感谢您的建议,成功了!我在网络中添加了更多层,并以具有单个节点的密集层结束了网络。 欢迎,所以我想你可以接受并投票我的答案,这样我就可以赢得一些声誉,因为我是一个新的贡献者并且没有太多

以上是关于如何在 Keras 中为维度 (2505,10) 的数据设计 CNN?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 for 循环中使用 keras.Layer 的动态维度(无维度)?

Keras如何在还没有维度的情况下计算早期的参数个数?

如何在 Keras / Tensorflow 中将(无,)批量维度重新引入张量?

如何在 Keras 中为 LSTM 构建三维滞后时间步长?

如何在 Keras 中为循环神经网络 (RNN) 使用嵌入层

如何在 Keras 中为每个时间步应用不同的密集层