如何使用深度神经网络提高验证准确性?

How to increase validation accuracy with deep neural net?

我正在尝试使用 13000 个训练图像和 3000 个验证图像构建一个 11 class 图像 classifier。我正在使用正在使用 mxnet 进行训练的深度神经网络。训练准确率正在提高并达到 80% 以上,但验证准确率在 54-57% 的范围内并且没有增加。 这可能是什么问题?我应该增加图像的数量吗?

这显然看起来像是模型过度拟合训练集的情况,因为验证准确性逐步提高,直到固定在特定值。如果学习率再高一点,您最终会看到验证准确性下降,而训练集的准确性却提高了。

增加训练集的数量是解决这个问题的最好办法。您还可以尝试对现有图像集应用不同的变换(翻转、从稍大的图像中随机裁剪部分),看看模型是否学习得更好。

这里的问题是您的网络在某个时候停止学习有用的一般特征并开始适应您训练集的特性(结果过度拟合)。您想 'force' 您的网络继续学习有用的功能,您在这里没有几个选择:

  1. 使用权重正则化。它试图保持低权重,这通常会导致更好的泛化。试验不同的正则化系数。试试 0.1、0.01、0.001,看看它们对准确性有什么影响。
  2. 破坏您的输入(例如,随机用黑色或白色替换一些像素)。通过这种方式,您可以从输入和 'force' 网络中删除信息,以获取重要的一般特征。试验确定有多少输入应该被破坏的噪声系数。研究表明,在 15% - 45% 范围内的任何值都可以正常工作。
  3. 扩展你的训练集。由于您正在处理图像,因此您可以通过旋转/缩放等方式扩展现有图像(如建议的那样)。您还可以尝试对图像进行预处理(例如,将它们映射为黑白、灰度等),但此技术的有效性将取决于您的确切图像和 类)
  4. 使用去噪标准预训练你的层。在这里,您可以在微调整个网络之前单独预训练网络的每一层。预训练 'forces' 层以获取对重建输入信号有用的重要通用特征。例如,查看自动编码器(它们过去已应用于图像分类)。
  5. 试验网络架构。您的网络可能没有足够的学习能力。试验不同的神经元类型、层数和隐藏神经元数。确保尝试压缩架构(神经元少于输入)和稀疏架构(神经元多于输入)。

不幸的是,训练网络泛化良好的过程涉及大量实验和对参数 space 的近乎蛮力探索,并需要一些人工监督(您会看到许多研究工作采用这种方法)。最好为每个参数尝试 3-5 个值,看看它是否会引导您到某个地方。

当您试验绘制精度/成本/f1 作为迭代次数的函数并查看其行为方式时。通常您会注意到测试集的准确性达到峰值,然后持续下降。因此,除了良好的架构、正则化、损坏等之外,您还需要大量迭代才能产生最佳结果。

还有一个提示:确保每个训练时期随机化图像的顺序。