我正在设计一个用于静息状态脑电信号分类的神经网络。我对数据进行了预处理,使每个主题都有一个表,其中包含111个通道及其在2505个时间步长的读数。作为维数减少的测量,我将111个通道聚集到大脑的10个脑叶中,有效地将每个受试者的维数减少到(255,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: Input 0 of layer sequential_12 is incompatible with the layer:: expected min_ndim=4, found ndim=3。完整形状收到:(None, 2505, 10).
任何帮助都将是感激的。
要有一个Conv2D模型,你的火车数据,在图像处理的角度,需要是4维的(n_observation, 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'))
我没有任何处理信号数据的经验,但我想分享的是,如果您的通道列在图像像素中没有任何空间意义,那么考虑二维转换网络是没有意义的。例如,如果在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'))