为什么我的神经网络不起作用?

时间:2016-11-26 13:54:37

标签: python machine-learning neural-network

背景

我创建了一个神经网络,可以是n个输入,n个n长度的隐藏层,n个输出。当使用它进行手写识别时 - 使用Kaggle数据集(一个76x文本文件,28x28矩阵,0-255值为手写数字),结果表明在某处,某些东西一定是错误的。在这种情况下,我使用784个输入(每个像素28x28),1个15个神经元的隐藏层,以及10个神经元的输出层。

输出猜测是像[0,0,0,1,0,0,0,0,0,0]这样的向量 - 这意味着它猜测为3.这是基于这个http://neuralnetworksanddeeplearning.com/chap1.html#a_simple_network_to_classify_handwritten_digits (相同的原则和设置)

我假设我的问题在反向传播中的某个地方 - 并且因为我的程序在所有维度(层,层的长度等)中具有完全灵活的网络大小,我的反向传播算法非常复杂 - 并且基于这里解释的链规则https://mattmazur.com/2015/03/17/a-step-by-step-backpropagation-example/ 基本上,每个输出的总误差是相对于每个权重计算的,并且对于隐藏层,使用先前层中的权重变化的总和。

当使用0.5的学习率时,e_total从2.252开始,在一分钟内达到0.4462,然后在5分钟内不低于0.2。

这让我觉得有些事情必须奏效。但是,当我输出所需的输出和输出猜测时,它们很少匹配,即使在5分钟的iteraton /学习之后。我希望看到这样的结果

output layer: [0.05226,0.0262,0.03262,0.0002, 0.1352, 0.99935, 0.00, etc]
output desired: [0,0,0,0,0,1,0, etc]

(除了正确的猜测值之外,所有<0.1都应该> 0.9)

但我得到像

这样的东西
output layer: [0.15826,0.0262,0.33262,0.0002, 0.1352, 0.0635, 0.00, etc]
output desired: [0,1,0,0,0,0,0, etc] 

(全部<0.1,因此没有明确的分类,更不用说准确的分类了。)

当猜测值和期望值匹配时,我甚至添加了一行代码来输出'正确' - 即使如我所说,e_total减少,'正确'总是发生在大约十分之一 - 这是不比随意好!

我尝试了不同的隐藏图层长度,各种不同的学习率 - 但没有好处。

我在评论中提供了更多可能有帮助的信息

更新

根据建议,我使用我的系统尝试学习XOR功能 - 有2个输入,1个隐藏的2个神经元层和1个输出。 意思是,desired_list现在是单个元素数组,可以是[1]或[0]。输出值似乎是随机的> 0.5且<1。 0.7,与期望的输出没有明确的关系。为了确认,我已多次手动测试我的前馈和后退支持,并且他们在我链接的教程中如何解释。

2 个答案:

答案 0 :(得分:1)

您在此示例中使用了一个隐藏图层。错误反向传播能够正确学习一个或两个隐藏层。在评论中,您声明从0-1区间开始权重初始化。一旦我尝试从图片中识别纸张并获得可怜的结果。从0-1区间我有体重初始值。当我以-1比1改进时,结果非常好。

确定。你的参数:
768 15 10

执行相同任务的深度网络参数:
768 500 500 2000 10

错误反向传播能够完成此任务。尝试使用具有更多神经元的两个隐藏层。

例如,像这样的事 768 2000 1500 10:)

此外,您应该将输入从0-255标准化为0-1。

<强>更新 XOR trainig持续时间很长。请尝试10万个时代。如果结果不好,那么BP实施就会出错。对于XOR问题,请将权重从-1初始化为1,隐藏和输出单元必须有偏差。

答案 1 :(得分:0)

你不需要重新发明轮子...... 您可以使用pybrain模块,它提供优化的“监督学习”功能,如反向传播,R-Prop等... (并且还监督学习,无监督学习,强化学习和黑盒优化算法功能)

您可以找到here示例,了解如何使用pybrain模块制作带有10×9输入阵列的OCR(仅适应您的28x28需求)

如果你肯定会重新发明轮子......你可能会对pybrain源代码进行一些反省(因为pybrain的后支撑版本可以工作),以便解释/仔细检查你的代码版本无法正常工作的原因。

由于NN调试是一项艰巨的任务,您还可以发布更多代码并共享与您的代码相关的任何资源......

此致