神经网络中的时期错误没有减少

时间:2017-10-22 09:54:07

标签: python neural-network conv-neural-network

我有一个数字图像数据集(只有2个类,7和9)。所以,它是一个二元分类问题。输入图像是28 * 28功能。所以,我在输入层使用神经网络和784个神经元。隐藏层中的100和50个神经元。输出层中有2个神经元。使用学习率为0.3。

我的问题是为什么错误没有随着时代而减少?难道我做错了什么 ? 我在火车数据集中有7125个样本。

>epoch=0, lrate=0.300, error=7124.996
>epoch=1, lrate=0.300, error=7124.996
>epoch=2, lrate=0.300, error=7124.996
>epoch=3, lrate=0.300, error=7124.996
>epoch=4, lrate=0.300, error=7124.995
>epoch=5, lrate=0.300, error=7124.995
>epoch=6, lrate=0.300, error=7124.995
>epoch=7, lrate=0.300, error=7124.995
>epoch=8, lrate=0.300, error=7124.995
>epoch=9, lrate=0.300, error=7124.995
>epoch=10, lrate=0.300, error=7124.995
>epoch=11, lrate=0.300, error=7124.994
>epoch=12, lrate=0.300, error=7124.994
>epoch=13, lrate=0.300, error=7124.994
>epoch=14, lrate=0.300, error=7124.994
>epoch=15, lrate=0.300, error=7124.994
>epoch=16, lrate=0.300, error=7124.993
>epoch=17, lrate=0.300, error=7124.993
>epoch=18, lrate=0.300, error=7124.993 
>epoch=19, lrate=0.300, error=7124.992 
>epoch=20, lrate=0.300, error=7124.992 
>epoch=21, lrate=0.300, error=7124.992 
>epoch=22, lrate=0.300, error=7124.991 
>epoch=23, lrate=0.300, error=7124.991 
>epoch=24, lrate=0.300, error=7124.990 
>epoch=25, lrate=0.300, error=7124.989 
>epoch=26, lrate=0.300, error=7124.989 
>epoch=27, lrate=0.300, error=7124.988 
>epoch=28, lrate=0.300, error=7124.987 
>epoch=29, lrate=0.300, error=7124.985 
>epoch=30, lrate=0.300, error=7124.984 
>epoch=31, lrate=0.300, error=7124.982 
>epoch=32, lrate=0.300, error=7124.980 
>epoch=33, lrate=0.300, error=7124.977 
>epoch=34, lrate=0.300, error=7124.972 
>epoch=35, lrate=0.300, error=7124.966 
>epoch=36, lrate=0.300, error=7124.957 
>epoch=37, lrate=0.300, error=7124.940 
>epoch=38, lrate=0.300, error=7124.899 
>epoch=39, lrate=0.300, error=7124.544 
>epoch=40, lrate=0.300, error=6322.611 
>epoch=41, lrate=0.300, error=5425.721
>epoch=42, lrate=0.300, error=4852.422 
>epoch=43, lrate=0.300, error=4384.062 
>epoch=44, lrate=0.300, error=4204.247 
>epoch=45, lrate=0.300, error=4091.508 
>epoch=46, lrate=0.300, error=4030.757 
>epoch=47, lrate=0.300, error=4014.341 
>epoch=48, lrate=0.300, error=3999.759 
>epoch=49, lrate=0.300, error=4008.330 
>epoch=50, lrate=0.300, error=3995.592 
>epoch=51, lrate=0.300, error=3964.337 
>epoch=52, lrate=0.300, error=3952.369 
>epoch=53, lrate=0.300, error=3965.271 
>epoch=54, lrate=0.300, error=3989.814 
>epoch=55, lrate=0.300, error=3972.481 
>epoch=56, lrate=0.300, error=3937.723 
>epoch=57, lrate=0.300, error=3917.152 
>epoch=58, lrate=0.300, error=3901.988
>epoch=59, lrate=0.300, error=3920.768

如果我改变隐藏层(5 + 2)中的神经元。我的结果越来越好了。为什么会这样?

>epoch=0, lrate=0.300, error=4634.128, l_rate=0.300
>epoch=1, lrate=0.300, error=4561.231, l_rate=0.300
>epoch=2, lrate=0.300, error=3430.602, l_rate=0.300
>epoch=3, lrate=0.300, error=927.599, l_rate=0.300
>epoch=4, lrate=0.300, error=843.441, l_rate=0.300
>epoch=5, lrate=0.300, error=741.719, l_rate=0.300
>epoch=6, lrate=0.300, error=734.094, l_rate=0.300
>epoch=7, lrate=0.300, error=691.922, l_rate=0.300
>epoch=8, lrate=0.300, error=705.822, l_rate=0.300
>epoch=9, lrate=0.300, error=629.065, l_rate=0.300
>epoch=10, lrate=0.300, error=588.232, l_rate=0.300
>epoch=11, lrate=0.300, error=592.619, l_rate=0.300
>epoch=12, lrate=0.300, error=554.380, l_rate=0.300
>epoch=13, lrate=0.300, error=555.677, l_rate=0.300
>epoch=14, lrate=0.300, error=555.798, l_rate=0.300
>epoch=15, lrate=0.300, error=523.214, l_rate=0.300
>epoch=16, lrate=0.300, error=530.260, l_rate=0.300
>epoch=17, lrate=0.300, error=491.709, l_rate=0.300
>epoch=18, lrate=0.300, error=469.119, l_rate=0.300
>epoch=19, lrate=0.300, error=472.025, l_rate=0.300
>epoch=20, lrate=0.300, error=473.940, l_rate=0.300
>epoch=21, lrate=0.300, error=438.288, l_rate=0.300
>epoch=22, lrate=0.300, error=412.492, l_rate=0.300
>epoch=23, lrate=0.300, error=424.129, l_rate=0.300
>epoch=24, lrate=0.300, error=427.414, l_rate=0.300
>epoch=25, lrate=0.300, error=435.418, l_rate=0.300
>epoch=26, lrate=0.300, error=406.067, l_rate=0.300
>epoch=27, lrate=0.300, error=411.439, l_rate=0.300
>epoch=28, lrate=0.300, error=373.220, l_rate=0.300
>epoch=29, lrate=0.300, error=381.987, l_rate=0.300
>epoch=30, lrate=0.300, error=359.585, l_rate=0.300
>epoch=31, lrate=0.300, error=368.407, l_rate=0.300
>epoch=32, lrate=0.300, error=351.560, l_rate=0.300
>epoch=33, lrate=0.300, error=359.028, l_rate=0.300
>epoch=34, lrate=0.300, error=371.987, l_rate=0.300
>epoch=35, lrate=0.300, error=336.106, l_rate=0.300
>epoch=36, lrate=0.300, error=318.453, l_rate=0.300

2 个答案:

答案 0 :(得分:1)

这是一个常见的问题;它通常是由您的NN和/或数据的设计引起的。为避免这种情况,您可能需要重新考虑您的设计决策。

从你的问题来看,似乎你决定采用一种特定的设计,如果改变可以帮助很多。我们来看看:

  • 0.3学习率:这是学习率的超高价值。您希望尽可能降低此值。虽然您花费较长时间进行培训,但它可以提高学习的一致性。 deeplearning4j guys建议“学习率的典型值在0.1到1e-6的范围内,尽管最佳学习率通常是数据(和网络架构)特定的。一些简单的建议是从尝试三种不同开始学习率--1e-1,1e-3和1e-6--在进一步调整之前,大致了解它应该是什么。理想情况下,他们同时运行具有不同学习速率的模型以节省时间。“
  • 隐藏层中的100 + 50个神经元。虽然我不确定这个NN正在执行什么样的任务,但这个数字对我来说听起来很低,因为你的输入层有784个神经元。看看这个paper: "What Size Neural Network Gives Optimal Generalization?"。请更新您的问题,以帮助我们了解您的问题。

答案 1 :(得分:0)

你的第一个模型有更多参数(第一个隐藏层:78,400个权重和100个偏差,第二个隐藏层:5000个权重和50个偏差)你可能随机初始化权重和偏差。通常随机初始化会让你接近50%的精确度,所以我对你为什么接近0%感到有点困惑(我假设有7125个训练样例,你的错误度量为error=7124.990意味着你将它们全部归类不正确地)。在任何情况下,如此高的学习率会发生什么,你采取一个非常错误的给定重量并将其移到最佳状态以便它仍然几乎和以前一样错,但现在坐着在误差曲线的另一侧。有意义的是,具有大量更多参数的模型在明确错误的值之间反弹将需要更多的训练时期才能看到错误的任何改进。

还有一件事需要考虑:因为你已将其设置为二进制分类问题,所以只需要一个输出神经元,而不是两个。在你的训练数据标签中,你可以有0编码7而1编码9.设置一个sigmoid输出神经元,给出0到1之间的值,并将你的预测阈值设置为0.5。

if ouput < 0.5:
    prediction = 7
else:
    prediction = 9