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

标签 python machine-learning neural-network

背景

我创建了一个神经网络,它可以包含 n 个输入、n 个长度为 n 的隐藏层、n 个输出。当使用它进行手写识别时——使用 Kaggle 数据集(一个 76mb 的文本文件,由 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 分钟的迭代/学习也是如此。我希望看到这样的结果

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 减少了,“正确”总是在 10 次中发生大约 1 次——这是不比随机好!

我尝试了不同的隐藏层长度、各种不同的学习率——但都没有用。

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

更新:

按照建议,我已经使用我的系统尝试学习 XOR 函数 - 具有 2 个输入、1 个包含 2 个神经元的隐藏层和 1 个输出。 也就是说,desired_list 现在是单个元素数组,[1] 或 [0]。输出值似乎是随机的 >0.5 和 < 0.7,与所需输出没有明确关系。只是为了确认,我已经多次手动测试我的前馈和后馈支撑,它们完全按照我链接的教程中的解释工作。

最佳答案

您在此示例中使用了一个隐藏层。错误反向传播能够正确学习一个或两个隐藏层。在评论中,您要求从 0-1 区间进行权重初始化。一旦我尝试从图片中识别一篇论文并获得悲惨的结果。我有 0-1 区间的权重初始化。当我将此改进为 -1 到 1 时,结果非常好。

好的。您的参数:
768 15 10

做同样任务的深度网络参数:
768 500 500 2000 10

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

比如像这样的东西
768 2000 1500 10:)

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

更新: XOR trainig 持续时间长。请尝试 100 000 个纪元。如果结果不好,则说明 BP 实现存在问题。对于 XOR 问题,请将权重从 -1 初始化为 1,并且隐藏和输出单元必须具有偏差。

关于python - 为什么我的神经网络不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40819063/

相关文章:

python - 访问 `.days` 以获得 pandas 时间增量系列

Python:对于每个列表元素,在列表中应用一个函数

image - 深度学习——同时使用图像和它们的描述

neural-network - Style Transfer 和 GAN 之间的关系是什么?

python - 在 pycharm 中将 .py 转换为 .ipynb 文件

azure - Azure 机器学习可以应用于操作吗?

matlab - 如何用对角线以下的点修复 ROC 曲线?

machine-learning - DBSCAN 算法可以创建少于 minPts 的簇吗?

algorithm - 训练神经网络中出现极小或 NaN 值

python - CPython - 在作为参数传递的 C 函数中读取 Python 字典(键/值)