提高 TensorFlow CNN 的测试准确性

数据挖掘 机器学习 Python 神经网络 深度学习 张量流
2022-02-24 14:25:06

我正在尝试使用 Tensorflow 进行信号分类。这些信号是正常信号或高风险信号。为此,我使用了卷积神经网络。信号长度为685,架构为:

  • 具有 27 个通道和 1 x 16 窗口大小和步幅 1 的卷积层。
  • 最大池化层,窗口大小为 1 x 2,步幅为 2。
  • 具有 14 个通道和 1 x 32 窗口大小和步幅 1 的卷积层。
  • 最大池化层,窗口大小为 1 x 2,步幅为 2。
  • 具有 4 个通道和 1 x 32 窗口大小和步幅 1 的卷积层。
  • 最大池化层,窗口大小为 1 x 2,步幅为 2。
  • 具有 3 个通道和 1 x 10 窗口大小和步幅 1 的卷积层。
  • 最大池化层,窗口大小为 1 x 2,步幅为 2。
  • 具有 20 个神经元和 dropout 层的全连接层。
  • 具有 10 个神经元和 dropout 层的全连接层。
  • 最后是 Soft max 层。

在使用 AdamOptimizer 以 0.001 的学习率和 150000 个信号训练网络后,训练准确度接近 95%(使用 16 批量大小的批量训练),但使用 20000 个新信号的测试准确度几乎为 50%。由于只有 2 个类,因此这种准确性并不比随机猜测好。

model="conv1d-27-16-1,maxpool-2,conv1d-14-32-1,maxpool-2,conv1d-4-32-1,maxpool-2,conv1d-3-10-1,maxpool-2,full-20,full-10,softmax"

cnn=CNN_1D(model,input_size=685,n_classes=2,num_epochs=20,batch_size=16,dropout=0.75)
cnn.read_data('train_input','train_targets','test_input','test_targets')
cnn.build_model()
cnn.training(validation_set='all')

如何提高网络中的测试准确性?

1个回答

这显然是过度拟合的情况,因为您的验证错误远大于您的训练错误。了解过拟合是您的问题后,您可以通过多种方式解决此问题:

我可以看到您已经在进行 dropout,因此将 dropout 设置得更高应该会有所帮助。此外,您可以尝试在更多层中使用 dropout,而不仅仅是最后两层。如果设置更高的 dropout 率和设置更多的带有 dropout 的层不起作用,那么这可能意味着您的训练和验证数据不是来自相同的分布。您可以研究训练数据和验证的统计属性,并研究它们是否来自同一分布。

额外评论:如果只有两个类,为什么不在最后一层使用 sigmoid 激活函数?