多层感知器用于光学字符识别仅适用于某些数据集

新进展

我最近使用OpenCV的MLP实现来测试它是否能解决相同的问题。OpenCV能够对我的实现能够分类的相同数据集进行分类,但无法解决我的实现无法解决的那些数据集。可能这是由于终止参数(决定何时结束训练)的原因。我在100,000次迭代之前停止了训练,而MLP并未实现泛化。这次的网络架构是400个输入神经元,10个隐藏神经元和2个输出神经元。

我已经实现了多层感知器算法,并验证了它对XOR逻辑门有效。对于光学字符识别,我训练网络正确分类用粗绘图工具(标记笔)绘制的“A”和“B”字母。然而,当我尝试训练网络分类用细绘图工具(铅笔)绘制的字母时,网络似乎陷入了一个低谷,无法在合理的时间内对字母进行分类。对于用GIMP绘制的字母也是如此。

我知道人们说我们必须使用动量来摆脱低谷,但我在阅读的资料中对此描述得不够明确。我尝试在误差变化不显著时增加动量值,在误差变化显著时减少,但似乎没有帮助。

我的网络架构是400个输入神经元(每个像素一个),两个隐藏层各有25个神经元,输出层有2个神经元。图像是灰度图像,输入为黑色像素-0.5,白色像素0.5。

编辑:

目前,网络在每个训练样本的计算误差低于可接受的误差常数之前一直进行训练。我还尝试在10,000个周期后停止训练,但这会导致预测结果不佳。使用的激活函数是S形逻辑函数。我使用的误差函数是误差平方和。

我认为我可能达到了局部最小值而不是低谷,但这不应该反复发生。


回答:

动量并不总是好的,它可以帮助模型跳出坏的低谷,但也可能使模型跳出好的低谷。特别是当之前的权重更新方向不好时。

有几个原因可能导致你的模型表现不佳。参数设置不当,设置MLP的参数始终是一项非平凡的任务。

一个简单的方法是首先将学习率、动量权重和正则化权重设置为较大的数值,但将迭代次数(或周期)设置为非常大的数值。一旦模型发散,就将学习率、动量权重和正则化权重减半。

这种方法可以使模型缓慢收敛到局部最优,同时也给它跳出坏的低谷的机会。

此外,在我看来,对于两类问题,一个输出神经元就足够了。如果没有必要,不需要增加模型的复杂性。同样,如果可能,使用三层MLP而不是四层MLP。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注