python - 使用 Keras 询问有关 EEG 分类的建议
问题描述
我有一个关于脑电图的数据集,形状如下:
(11,1158, 200)
在哪里
11 is the number of EEG channel
1158 is the number of each task
200 is the time interval of each task
例如,如果你绘制一个任务,你会得到(注意数据是标准化的):
此任务表示具有类的任务。(例如看到第 2 类的图片,我的数据集中的类总数为 5)。
现在我将我的数组转换为这个形状:
(1158, 200, 11)
这样模型就可以区分每个任务。这是我使用的模型:
opt = keras.optimizers.Adam(learning_rate=1e-4)
model = Sequential()
model.add(Conv1D(filters=128, kernel_size=64, activation='relu', input_shape=(200, 11)))
model.add(Conv1D(filters=64, kernel_size=8, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(5, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])
model.fit(x_train, y_train, validation_data=(x_valid,y_valid), epochs=50, batch_size=16)
我尝试了许多不同的超参数,但我的所有结果都有点像这样:
Epoch 50/50
58/58 [==============================] - 0s 5ms/step - loss: 0.1281 - accuracy: 0.9946 - val_loss: 2.7850 - val_accuracy: 0.1897
训练准确率很高,但验证准确率在 20% 到 25% 之间(100/5 = 20,其中 5 是类数);这基本上意味着模型预测的东西是随机的。我的方法错了吗?如果是这样,我应该如何解决这个问题?
解决方案
由于您的数据本质上是一个时间序列分类问题,我的直觉是从基于 LSTM 的东西开始。
可悲的是,我的第二个见解与数据大小有关。你的特征空间是 200x11=2200,样本大小是 1158。如果样本大小 > 5 * 特征大小,我倾向于使用深度学习,但我真的认为 DL 开始发光大约 10 倍。如果收集更多数据的可能性不大,那么您将需要寻找其他解决方案来解决高方差问题(模型对于可用数据级别而言过于复杂)。
第三,我可以评论说,假设您对验证集进行了与您的训练集等效的标准化和塑造,那么您的数据形状对我来说是正确的,那么这可能不是问题。
编辑:我刚刚注意到训练的最后一个时期显示训练的样本为 58/58。该值表示训练集中的样本数。这是你所期待的吗?我预计样本数量将是您的总集 EG 810/810 的 70%。如果您不确定我在问什么,请发布 y_train 和 y_valid 的大小。这可以帮助我自己和其他人验证培训过程。
推荐阅读
- python - 如何提取docx的特定列并将其保存到python中的数据框?
- python - 如何在pyqt5 python的qtextedit中突出显示文本中的一个单词?
- python - 文件路径正确,但 cv2.imread 显示 AttributeError: 'Nonetype' object has no attribute 'shape'
- javascript - react-native useNavigation 功能组件中的无效 Hook 调用
- angular - 如何使用 indexedDb 和 Angular 在单个键中添加多个对象
- serialization - 使用 #[serde(untagged)] 和 #[serde(with)] 的组合反序列化枚举
- php - shopware6 - 在个人资料页面中注入数据或路由 http://domain/account/*
- typescript - 打字稿将字符串联合类型转换为另一种类型的交集
- javascript - 自动反应角色 / Discord.js 机器人
- apache-flink - 使用状态处理器 api 进行 Flink 状态后端配置