模型验证精度停留在 0.65671 Keras

数据挖掘 Python 喀拉斯 卷积神经网络
2022-02-14 10:59:42

我正在使用 conv1d 对 EEG 信号进行分类,但我的 val_accuracy 停留在 0.65671。无论我做什么改变,它永远不会超过 0.65671。这是架构

model=Sequential()
model.add(Conv1D(filters=4,kernel_size=5,strides=1,padding='valid',kernel_initializer='RandomUniform',input_shape=X_train.shape[1::]))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Conv1D(filters=6,kernel_size=3,strides=1,padding='same'))
model.add(BatchNormalization())
model.add(Activation('relu'))
model.add(Dropout(0.2))
model.add(Conv1D(filters=8,kernel_size=3,strides=1,padding='valid',activation='relu'))
#model.add(Conv1D(filters=24,kernel_size=7,strides=1,padding='same',activation='relu'))

model.add(Flatten())
model.add(Dense(12,activation='relu'))
model.add(Dense(1,activation='sigmoid'))

训练数据的形状是(5073,3072,7),测试数据的形状是(1908,3072,7)

我尝试减少每一层的神经元数量,改变激活函数,并添加更多层。但这个上限大多没有改变。

我尝试了一种二进制类的热编码,keras.utils.to_categorical(y_train,num_classes=2)但这个问题没有解决。

我试过学习率0.0001,但它不起作用。我尝试了一些kernel_initializeroptimizers但没有任何帮助

结果

   Train on 5073 samples, validate on 1908 samples
Epoch 1/8
 - 23s - loss: 0.6865 - acc: 0.5757 - val_loss: 0.6709 - val_acc: 0.6564

Epoch 00001: val_acc improved from -inf to 0.65645, saving model to weights.hdf5
Epoch 2/8
 - 22s - loss: 0.6760 - acc: 0.5837 - val_loss: 0.6569 - val_acc: 0.6567

Epoch 00002: val_acc improved from 0.65645 to 0.65671, saving model to weights.hdf5
Epoch 3/8
 - 21s - loss: 0.6661 - acc: 0.5843 - val_loss: 0.6669 - val_acc: 0.6111

Epoch 00003: val_acc did not improve from 0.65671
Epoch 4/8
 - 21s - loss: 0.6622 - acc: 0.5915 - val_loss: 0.6579 - val_acc: 0.6253

Epoch 00004: val_acc did not improve from 0.65671
Epoch 5/8
 - 22s - loss: 0.6575 - acc: 0.5939 - val_loss: 0.6540 - val_acc: 0.6255

Epoch 00005: val_acc did not improve from 0.65671
Epoch 6/8
 - 21s - loss: 0.6554 - acc: 0.5940 - val_loss: 0.6448 - val_acc: 0.6399

Epoch 00006: val_acc did not improve from 0.65671
Epoch 7/8
 - 21s - loss: 0.6511 - acc: 0.6042 - val_loss: 0.6584 - val_acc: 0.6195

Epoch 00007: val_acc did not improve from 0.65671
Epoch 8/8
 - 21s - loss: 0.6487 - acc: 0.6059 - val_loss: 0.6647 - val_acc: 0.6030

Epoch 00008: val_acc did not impr

超过 0.65671

4个回答

我想看看你的数据集:)我也在做一些信号分类。

除非在数据预处理阶段有一些简单的错误:(首先检查你没有在这里显示的内容!)

  • 正如@stefanLopez 正确指出的那样,您的过滤器数量太少了。
  • 其次,过滤器长度太短,无法捕捉到任何严重的东西。
  • 测试时删除 batchnorm。
  • 减少测试时的辍学。
  • 使用 ELU(指数线性单元)激活进行测试。
  • 最后,使用更多神经元的 FC 层。
  • 尝试使用 glorot(通常称为 Xavier)初始化程序。

示例模型:

model=Sequential()

model.add(Conv1D(filters=24,kernel_size=16,strides=1,padding='valid',activation='elu',kernel_initializer='glorot_normal',input_shape=X_train.shape[1::]))

model.add(Conv1D(filters=16,kernel_size=9,strides=1,padding='same',activation='elu',kernel_initializer='glorot_normal'))
model.add(Dropout(0.1))

model.add(Conv1D(filters=12,kernel_size=9,strides=1,padding='valid',activation='elu',kernel_initializer='glorot_normal'))
model.add(Dropout(0.1))

model.add(Flatten())
model.add(Dense(128,activation='elu'))
model.add(Dropout(0.1))
model.add(Dense(16,activation='elu'))
model.add(Dropout(0.1))
model.add(Dense(1,activation='sigmoid'))

告诉它是否有帮助。

我也在使用 1D CNN 进行 EEG/EMG 分类。似乎对我有帮助的一件事是玩弄过滤器的数量,而您的过滤器似乎很低。我在一个图层上使用了多达 80 个过滤器,有时效果很好。此外,您可能希望反转您的工作方式,并在开始时添加更多过滤器,并在每个连续层中减少。

我遇到了同样的问题,但网络/任务不同。

我正在使用完全连接的网络从图像中回归矢量。很快,在 1-2 个 epoch 之后,训练和验证似乎都停留在某些值上。奇怪的是,尽管它们比您的情况大一个数量级(我的:损失 ~7.2,错误 ~7.9),但它们也在小数点后二位左右变化。

原因是批处理生成器函数中的一个错误,它可能会导致它总是返回相同的批处理进行验证。我通过创建一个只有 10 个样本(图像)的调试数据集找到了这个错误。

您可能会考虑从此更改您的代码:

model.add(Dense(12,activation='relu'))

对此:

model.add(Dense(12))
model.add(Activation('relu'))

我在处理基于图像的任务时遇到了问题。准确性和验证被卡住了。这完全有帮助。我从这个链接了解到这一点:Training Accuracy 卡在 Keras