新发展
我最近使用OpenCV的MLP实现来测试它是否可以解决相同的任务。 OpenCV能够对我的实现能够进行的相同数据集进行分类,但无法解决我的实现无法解决的数据集。也许这是由于终止参数(确定何时结束训练)。我在100,000次迭代之前停了下来,MLP没有概括。这次网络架构是400个输入神经元,10个隐藏神经元和2个输出神经元。
我已经实现了多层感知器算法,并验证它与XOR逻辑门一起工作。对于OCR,我教网络正确分类用粗绘图(标记)绘制的“A”和“B”字母。然而,当我试图教网络对薄图画(铅笔)进行分类时,网络似乎陷入了山谷,无法在合理的时间内对字母进行分类。对于我用GIMP绘制的信件也是如此。
我知道人们说我们必须利用势头走出山谷,但我读到的消息来源含糊不清。当误差变化微不足道时,我尝试增加一个动量值,并且在上面时减少,但它似乎没有帮助。
我的网络架构是400个输入神经元(每个像素一个),2个隐藏层,每个神经元有25个神经元,输出层有2个神经元。图像是灰度图像,黑色像素的输入为-0.5,白色像素的输入为0.5。
修改
目前,网络正在训练,直到每个训练示例的计算误差低于可接受的误差常数。我也曾尝试在10,000个时期停止训练,但这会产生糟糕的预测。使用的激活函数是sigmoid逻辑函数。我使用的错误函数是平方误差的总和。
我想我可能已达到局部最小值而不是谷值,但这不应该重复发生。
答案 0 :(得分:0)
动量并不总是好的,它可以帮助模型跳出一个糟糕的山谷,但也可能使模型跳出一个好的山谷。特别是当以前的权重更新方向不好时。
有几个原因导致您的模型无法正常工作。 参数设置不正确,设置MLP的参数总是一项非常重要的任务。
一种简单的方法是首先将学习率,动量权重和正则化权重设置为大数,但是将迭代(或时期)设置为非常大的权重。一旦模型发散,学习率,动量权重和正则化权重的一半。
这种方法可以使模型慢慢收敛到局部最优,并且还有机会跳出一个坏谷。
而且,在我看来,一个输出神经元足以解决两类问题。如果没有必要,则无需增加模型的复杂性。同样,如果可能,使用三层MLP而不是四层MLP。