Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 神经网络不学习-MNIST数据-手写识别_C++_Image Processing_Machine Learning_Neural Network_Gradient - Fatal编程技术网

C++ 神经网络不学习-MNIST数据-手写识别

C++ 神经网络不学习-MNIST数据-手写识别,c++,image-processing,machine-learning,neural-network,gradient,C++,Image Processing,Machine Learning,Neural Network,Gradient,我写了一个神经网络程序。它适用于逻辑门,但当我试图用它来识别手写数字时,它根本无法学习 请查找以下代码: //这是一个单一的神经元;这可能是理解其余代码所必需的 typedef struct SingleNeuron { double outputValue; std::vector<double> weight; std::vector<double> deltaWeight; doubl

我写了一个神经网络程序。它适用于逻辑门,但当我试图用它来识别手写数字时,它根本无法学习

请查找以下代码:

//这是一个单一的神经元;这可能是理解其余代码所必需的

typedef struct SingleNeuron
{
    double                  outputValue;
    std::vector<double>     weight;
    std::vector<double>     deltaWeight;
    double                  gradient;
    double                  sum;
}SingleNeuron;
我观察到的一件事是,若我使用标准的S形函数作为传递函数,若我将神经元的输出传递给传递函数,结果就是无穷大。但是tanh(x)可以很好地处理这个值

因此,如果我使用1/1+e^(-x)作为传递函数,我必须传递净输入的总和,并且以tanh作为传递函数,我必须传递当前神经元的输出

我不完全理解为什么会这样,可能这需要一个不同的问题

但这个问题实际上是关于其他方面的:网络用于逻辑门,但不用于字符识别

我尝试了许多不同的变化/组合,包括
学习率
加速
隐藏层
它们的大小
。请查看以下结果:

AvgErr: 0.299399          #Pass799
AvgErr : 0.305071         #Pass809
AvgErr : 0.303046         #Pass819
AvgErr : 0.299569         #Pass829
AvgErr : 0.30413          #Pass839
AvgErr : 0.304165         #Pass849
AvgErr : 0.300529         #Pass859
AvgErr : 0.302973         #Pass869
AvgErr : 0.299238         #Pass879
AvgErr : 0.304708         #Pass889
AvgErr : 0.30068          #Pass899
AvgErr : 0.302582         #Pass909
AvgErr : 0.301767         #Pass919
AvgErr : 0.303167         #Pass929
AvgErr : 0.299551         #Pass939
AvgErr : 0.301295         #Pass949
AvgErr : 0.300651         #Pass959
AvgErr : 0.297867         #Pass969
AvgErr : 0.304221         #Pass979
AvgErr : 0.303702         #Pass989
查看结果后,您可能会觉得这家伙只是陷入了局部极小值,但请等待并通读:

Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = 0.0910903, 0.105674, 0.064575, 0.0864824, 0.128682, 0.0878434, 0.0946296, 0.154405, 0.0678767, 0.0666924

Input = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Output = 0.0916106, 0.105958, 0.0655508, 0.086579, 0.126461, 0.0884082, 0.110953, 0.163343, 0.0689315, 0.0675822

Input = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]          
Output = 0.105344, 0.105021, 0.0659517, 0.0858077, 0.123104, 0.0884107, 0.116917, 0.161911, 0.0693426, 0.0675156

Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = , 0.107113, 0.101838, 0.0641632, 0.0967766, 0.117149, 0.085271, 0.11469, 0.153649, 0.0672772, 0.0652416
上面是历元#996、#997、#998和#999的输出

所以简单地说,网络不是学习。例如,我使用了ALPHA=0.4,ETA=0.7,10个隐藏层,每层100个神经元,平均超过10个时代。如果您担心学习率为0.4或如此多的隐藏层,我已经尝试过它们的变化。例如,学习率为0.1和4个隐藏层-每层16个

Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = 0.0883238, 0.0983253, 0.0613749, 0.0809751, 0.124972, 0.0897194, 0.0911235, 0.179984, 0.0681346, 0.0660039

Input = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]          
Output = 0.0868767, 0.0966924, 0.0612488, 0.0798343, 0.120353, 0.0882381, 0.111925, 0.169309, 0.0676711, 0.0656819

Input = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]          
Output = 0.105252, 0.0943837, 0.0604416, 0.0781779, 0.116231, 0.0858496, 0.108437, 0.1588, 0.0663156, 0.0645477

Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = 0.102023, 0.0914957, 0.059178, 0.09339, 0.111851, 0.0842454, 0.104834, 0.149892, 0.0651799, 0.063558
我非常肯定我错过了什么。我想不出来。我已经读过汤姆·米切尔的算法很多次了,但我不知道哪里出了问题。无论我用手解决什么样的问题,都很有效!(请不要要求我手动解决MNIST数据图像;)我不知道在哪里更改代码,该怎么办。。请帮忙

编辑--根据评论中的建议上载更多数据 --还是没有学问

预期输出——输入是介于0-9之间的图像,所以一个简单的向量描述哪个是当前图像,该位为1,所有其他位均为0。因此,我希望该特定位的输出尽可能接近1,而其他位的输出接近0,例如,如果输入是
input=[0,0,0,0,0,0,1,0,0,0,0,0]
我希望输出类似
output=0.002023,0.0914957,0.059178,0.09339,0.011851,0.0842454,0.924834,0.049892,0.0651799,0.063558
(这是模糊的、手工生成的)

以下是其他研究人员工作的链接

这简直是个图书馆

不仅是这两个,还有很多网站展示了演示

如果我像他们那样设置我的网络参数(Alpha,ETA),我就不会得到像他们那样的结果,所以这可以保证我的代码有问题

编辑2 添加更多失败案例

在上述两种情况下,隐藏层均为3层,每层32个神经元。

此答案摘自OP对该问题的评论


我解决了这个难题。我犯了最严重的错误。我输入错误。我使用opencv扫描图像,而不是使用
重塑
,我使用
调整大小
,因此输入是图像的线性插值。所以我的输入是错误的。代码没有任何错误。我的网络是
784-65-10
给出96.43%的准确率。

我没有剖析你的代码,但是你的
TransferFunctionDerivative
对于非常大的负输入可能会溢出。最好根据sigmoid定义导数。如果
s(x)
是sigmoid值,那么
ds/dx=s(x)[1-s(x)]
。首先要做的是删除10个隐藏层中的9个。即使编码正确,深网也会非常不合作。因此,请留下1个隐藏层,让我们知道会发生什么(1个隐藏层NN至少可以将MNIST求解到合理的93%精度)。我解决了这个难题。我犯了最严重的错误。我输入了错误。我使用opencv扫描图像,而不是使用
重塑
,我使用
调整大小
,因此输入是图像的线性插值。所以我的输入是错误的。代码没有任何错误。我的网络是
784-65-10
giving 96.43%准确率。我由衷地为浪费您的时间而道歉。从下一次开始,我将尽力处理此类问题。特别感谢Denis!@Adorn您应该添加此作为答案。@Adorn如果问题解决,请添加并接受您自己的答案。
AvgErr: 0.299399          #Pass799
AvgErr : 0.305071         #Pass809
AvgErr : 0.303046         #Pass819
AvgErr : 0.299569         #Pass829
AvgErr : 0.30413          #Pass839
AvgErr : 0.304165         #Pass849
AvgErr : 0.300529         #Pass859
AvgErr : 0.302973         #Pass869
AvgErr : 0.299238         #Pass879
AvgErr : 0.304708         #Pass889
AvgErr : 0.30068          #Pass899
AvgErr : 0.302582         #Pass909
AvgErr : 0.301767         #Pass919
AvgErr : 0.303167         #Pass929
AvgErr : 0.299551         #Pass939
AvgErr : 0.301295         #Pass949
AvgErr : 0.300651         #Pass959
AvgErr : 0.297867         #Pass969
AvgErr : 0.304221         #Pass979
AvgErr : 0.303702         #Pass989
Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = 0.0910903, 0.105674, 0.064575, 0.0864824, 0.128682, 0.0878434, 0.0946296, 0.154405, 0.0678767, 0.0666924

Input = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]
Output = 0.0916106, 0.105958, 0.0655508, 0.086579, 0.126461, 0.0884082, 0.110953, 0.163343, 0.0689315, 0.0675822

Input = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]          
Output = 0.105344, 0.105021, 0.0659517, 0.0858077, 0.123104, 0.0884107, 0.116917, 0.161911, 0.0693426, 0.0675156

Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = , 0.107113, 0.101838, 0.0641632, 0.0967766, 0.117149, 0.085271, 0.11469, 0.153649, 0.0672772, 0.0652416
Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = 0.0883238, 0.0983253, 0.0613749, 0.0809751, 0.124972, 0.0897194, 0.0911235, 0.179984, 0.0681346, 0.0660039

Input = [1, 0, 0, 0, 0, 0, 0, 0, 0, 0]          
Output = 0.0868767, 0.0966924, 0.0612488, 0.0798343, 0.120353, 0.0882381, 0.111925, 0.169309, 0.0676711, 0.0656819

Input = [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]          
Output = 0.105252, 0.0943837, 0.0604416, 0.0781779, 0.116231, 0.0858496, 0.108437, 0.1588, 0.0663156, 0.0645477

Input = [0, 0, 0, 0, 0, 0, 1, 0, 0, 0]          
Output = 0.102023, 0.0914957, 0.059178, 0.09339, 0.111851, 0.0842454, 0.104834, 0.149892, 0.0651799, 0.063558