神经网络为不同的输入提供相同的输出,不学习
Neural Network gives same output for different inputs, doesn't learn
我有一个用标准c++ 11编写的神经网络,我相信它正确地遵循反向传播算法(基于此)。然而,如果我在算法的每一步中输出误差,它似乎会随着时间的推移而振荡而不衰减。我试过完全去除动量并选择一个非常小的学习率(0.02),但它仍然以每个网络大致相同的振幅振荡(每个网络在一定范围内具有不同的振幅)。
此外,所有输入都会产生相同的输出(这是我之前在这里发现的一个问题,尽管是针对不同的语言。作者还提到,他从来没有让它工作。
代码可以在这里找到。
总结一下我是如何实现网络的:
-
Neuron
s保存了前面神经元的当前权值、这些权值之前的变化以及所有输入的和。 -
Neuron
可以访问它们的值(所有输入的和),也可以通过给定的激活函数输出传递该值的结果。 -
NeuronLayer
s作为Neuron
容器,建立与下一层的实际连接。 -
NeuronLayer
s可以将实际输出发送到下一层(而不是从上一层提取)。 -
FFNeuralNetwork
s作为NeuronLayer
s的容器,管理前向传播、误差计算和反向传播。它们也可以简单地处理输入。 -
FFNeuralNetwork
的输入层将其加权值(value * weight)发送给下一层。每层中的每个神经元随后输出激活函数的加权结果,除非它是一个偏差,或者该层是输出层(偏差输出加权值,输出层只是通过激活函数传递总和)。
我在实现中犯了一个根本性的错误(对理论的误解),还是有一些我还没有发现的简单错误?如果它是一个bug,它会在哪里?
为什么即使在非常低的学习率下,误差也会以它所做的量(大约+-(0.2 +-学习率))振荡?为什么不管输入是什么,所有的输出都是一样的?
我已经看了大部分了,所以我可能会跳过一些东西,但是我想我可能对这个理论有一个明显的误解。
原来我只是盯着FFNeuralNetwork部分看得太多了,不小心用了错误的输入集来确认网络的正确性。它实际上在正确的学习率、动量和迭代次数下正确地工作。
具体来说,在main
中,我使用inputs
而不是较小的数组in
来测试网络的输出。
相关文章:
- 递归函数计算序列中的平方和(并输出过程)
- 如何使用 < 和 > 命令获取 c++ 中的输入和输出?
- 请解释"函数1(p1,p2,p3);"的输出
- C++:将控制台输出存储在宏中更好吗
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 为什么我的代码在输出中增加了93天
- 如何从void函数输出字符串
- 输入到文件并输出到另一个文件,并将流文件传递给函数
- AES加密到解密未正确输出
- 如何将c++程序的一些输出传递给shell,以便在shell中使用
- 使用C++程序合并排序没有得到正确的输出
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++格式化输出问题
- 将值从二维数组输出到文本文件
- 如何在C++中可视化 Caffe 深度学习过程的各个层输出?
- 学习C++,在结构中输出变量
- 学习使用Boost共享指针,控制台输出正确吗
- 神经网络为不同的输入提供相同的输出,不学习
- 通过阅读GCC输出学习汇编