1

新发展

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

我已经实现了多层感知器算法,并验证了它可以与 XOR 逻辑门一起使用。对于 OCR,我教网络正确分类用厚绘图工具(标记)绘制的“A”和“B”字母。但是,当我尝试教网络对薄的绘图工具(铅笔)进行分类时,网络似乎陷入了困境,无法在合理的时间内对字母进行分类。我用 GIMP 绘制的字母也是如此。

我知道人们说我们必须利用动力才能走出山谷,但我读到的消息来源很模糊。我尝试在误差变化不显着时增加动量值,并在高于时减小,但这似乎没有帮助。

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

编辑:

当前,网络正在训练,直到每个训练示例的计算误差低于可接受的误差常数。我也尝试过在 10,000 个 epoch 时停止训练,但这会产生不好的预测。使用的激活函数是 sigmoid 逻辑函数。我使用的误差函数是平方误差之和。

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

4

1 回答 1

0

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

有几个原因使您的模型无法正常工作。参数设置不好,设置 MLP 的参数总是一项不平凡的任务。

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

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

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

于 2013-11-18T02:47:17.047 回答