如何在 Matlab 中改进神经网络中的数字识别预测?

Posted

技术标签:

【中文标题】如何在 Matlab 中改进神经网络中的数字识别预测?【英文标题】:How to improve digit recognition prediction in Neural Networks in Matlab? 【发布时间】:2016-09-28 10:08:04 【问题描述】:

我已经使用神经网络进行了数字识别(56x56 位),但我在测试集上获得了 89.5% 的准确率,在训练集上获得了 100% 的准确率。我知道使用这个训练集可以在测试集上获得 >95% 的数据。有什么方法可以改善我的训练,以便我能得到更好的预测?将迭代次数从 300 次更改为 1000 次给了我 +0.12% 的准确度。我的文件大小也受到限制,因此不可能增加节点数量,但如果是这种情况,也许我可以从输入层中删除一些像素/节点。

训练我正在使用:

输入层:3136 个节点 隐藏层:220 个节点 标签:36 lambda=0.1 的正则化成本函数 fmincg 计算权重(1000 次迭代)

【问题讨论】:

你用什么方法来训练你的网络? 正如我在主题中所说:fmincg。就像fminunc,但人们说它更好。 你是怎么得出这些参数的?你在使用交叉验证吗? 没有使用交叉验证。我从像素数(56x56)中获得的输入,隐藏节点非常随机(想从公式中获取它们:sqrt(输入*标签),但它太高而无法适应文件大小限制),lambda 是随机的也是(正在选择:1、0.1、0.01)。和迭代 - 越多越好还是我错了? 我会使用大量的迭代。将我的训练数据分成至少 80% 到 20% 的两部分。将第一部分作为训练提供给网络。然后用第二部分测试网络(不做任何权重更新)并计算误差。重复此操作,直到您的测试错误停止减少。否则,如果你只是用你的训练数据训练网络直到误差最小,你就会过拟合。 【参考方案1】:

正如 cmets 中提到的,最简单和最有前途的方法是切换到卷积神经网络。但是使用您当前的模型,您可以:

添加更多层,每个层使用更少的神经元,这会增加学习能力,并且应该会稍微提高准确性。问题是您可能会开始过度拟合。使用正则化来解决这个问题。

使用batch Normalization (BN)。虽然您已经在使用正则化,但 BN 可以加速训练并进行正则化,并且是一种特定于 NN 的算法,可能效果更好。

合奏。在同一数据集上训练多个 NN,但初始化不同。这将产生略有不同的分类器,您可以组合它们的输出以稍微提高准确性。

交叉熵损失。你没有提到你正在使用什么损失函数,如果它不是交叉熵,那么你应该开始使用它。所有的高精度分类器都使用交叉熵损失。

切换到反向传播和随机梯度下降。我不知道使用不同优化算法的效果,但反向传播可能会优于您当前使用的优化算法,您可以将其与其他优化器(例如 Adagrad 或 ADAM)结合使用。

其他可能提高准确度的小改动包括更改激活函数(如 ReLU)、在每个 epoch 后打乱训练样本以及进行数据增强。

【讨论】:

以上是关于如何在 Matlab 中改进神经网络中的数字识别预测?的主要内容,如果未能解决你的问题,请参考以下文章

手写数字识别基于matlab GUI欧拉数和二维矩阵相关系数手写数字识别含Matlab源码 1896期

手写数字识别基于matlab CNN网络手写数字识别分类含Matlab源码 1286期

C#中调用Matlab人工神经网络算法实现手写数字识别

matlab数字识别项目原理

数字识别基于matlab BP神经网络不同字体0-9数字识别含Matlab源码 1863期

手写数字识别基于matlab GUI BP神经网络手写数字识别系统含Matlab源码 1639期