Machine learning 用于ocr的多层感知器仅适用于某些数据集

Machine learning 用于ocr的多层感知器仅适用于某些数据集,machine-learning,neural-network,ocr,momentum,Machine Learning,Neural Network,Ocr,Momentum,新发展 我最近使用OpenCV的MLP实现来测试它是否能够解决相同的任务。OpenCV能够对我的实现能够对相同的数据集进行分类,但无法解决我无法解决的问题。这可能是由于终止参数(决定何时结束培训)。我在100000次迭代之前就停止了,MLP没有泛化。这次的网络结构是400个输入神经元,10个隐藏神经元和2个输出神经元 我已经实现了多层感知器算法,并验证它与异或逻辑门一起工作。对于OCR,我教网络正确地对“A”和“B”的字母进行分类,这些字母是用粗图untensil(一个标记)绘制的。然而,当我试

新发展

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

我已经实现了多层感知器算法,并验证它与异或逻辑门一起工作。对于OCR,我教网络正确地对“A”和“B”的字母进行分类,这些字母是用粗图untensil(一个标记)绘制的。然而,当我试图教网络如何用铅笔对一幅薄薄的图画进行分类时,网络似乎陷入了困境,无法在合理的时间内对字母进行分类。我用GIMP画的字母也是如此

我知道有人说我们必须利用动力离开山谷,但我读到的消息来源很模糊。当误差变化不明显时,我尝试增加动量值,当误差变化不明显时,尝试减少动量值,但似乎没有帮助

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

编辑:

目前,网络正在训练,直到每个训练示例的计算误差低于可接受的误差常数。我也尝试过在10000个时期停止训练,但这会产生糟糕的预测。所使用的激活函数是S形逻辑函数。我使用的误差函数是平方误差的和


我想我可能已经达到了一个局部最小值,而不是一个山谷,但这不应该重复发生。

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

有几个原因使您的模型不能很好地工作。 参数设置不当,设置MLP的参数始终是一项非常重要的任务

一种简单的方法是首先将学习速率、动量权重和正则化权重设置为一个大的数字,但将迭代(或历元)设置为一个非常大的权重。一旦模型发散,一半的学习率,动量权重和正则化权重

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


此外,在我看来,一个输出神经元就足以解决两类问题。如果不需要,则无需增加模型的复杂性。类似地,如果可能,使用三层MLP而不是四层MLP。

您在分类(预测未看到的输入)或培训时是否遇到问题?听起来好像是训练时间造成了问题,但还不清楚。另外,你应该说明你在图层上使用的激活功能和丢失功能。很抱歉,有几件事我不明白。通过将迭代设置为一个大的“权重”,您的意思是我应该在大量的历史之后停止吗?此外,我正在检查有关训练集的错误。当你说“发散”时,你是说我应该检查验证集的错误吗?还有一件事,我需要使用正则化吗?谢谢,抱歉耽搁了。我的意思是多次运行该算法。发散意味着误差越来越大,而且永远不会减小。误差可以在训练期间测量。例如,每50个历元计算一次平均误差。如果你使用正则化会更好。我仍然有问题,但我不明白为什么它仍然不起作用。这似乎减少了误差,但误差仍然很大。主要原因有两个:(1)是否有足够的训练数据?(2) 您提取的特征是否足够?(3) 模型可能陷入局部最优。(4) 如果您有足够的训练数据,请尝试增加模型的复杂性。(5) 不断地调整参数。我想我已经明白了为什么它现在不起作用了,尽管也许我应该早点弄明白。似乎没有足够的训练示例使模型能够正确地对新字母进行分类(训练集中不包括一个字母)。也许它和其他数据集一起工作,因为它们更容易分类。谢谢你的帮助。