我想用简单的人工神经网络与反向传播算法一起工作。我创建了一个ANN,我相信我已经正确实施了BP算法,但我当然可能会错。简单的人工神经网络的问题 - 加入
现在,我试图通过给它两个随机数(a,b)在0和0.5之间来训练网络,并让它添加它们。然后,当然,每次网络输出的结果都与a + b的理论答案相比较(这总是可以通过sigmoid函数实现)。
奇怪的是,输出总是收敛到0和1之间的数字(因为它必须,因为sigmoid函数),但是我输入的随机数似乎对它没有影响。
编辑:对不起,它似乎没有收敛。下面是输出的图像:
的权重是随机分布的-1和1之间,但我还试图0和1之间
我还试图给它两个恒定数(0.35,0.9),并试图训练它吐出0.5。这工作并收敛到0.5。如果我给它0和1之间的任意两个随机数,我也训练它吐出0.5,这也是有效的。
如果相反,我的目标是:
vector<double> target;
target.push_back(.5);
然后收敛速度非常快,甚至与随机输入:
我已经尝试了几个不同的网络,因为我做到了非常容易为我的网络添加图层。我正在使用的标准一个是有两个输入,一个是2个神经元,另一个是只有一个神经元(输出神经元)。不过,我也尝试添加几个图层,并向它们添加神经元。它似乎没有改变任何东西。我的学习速率等于1.0,但我试过它等于0.5,并没有太大的不同。
有没有人有任何想法我可以尝试?
这甚至是ANN的能力吗?我无法想象它不会,因为他们可以被训练去做这样复杂的事情。
有什么建议吗?谢谢!
这里是我训练它:
//Initialize it. This will be one with 2 layers, the first having 2 Neurons and the second (output layer) having 1.
vector<int> networkSize;
networkSize.push_back(2);
networkSize.push_back(1);
NeuralNetwork myNet(networkSize,2);
for(int i = 0; i<5000; i++){
double a = randSmallNum();
double b = randSmallNum();
cout << "\n\n\nInputs: " << a << ", " << b << " with expected target: " << a + b;
vector<double> myInput;
myInput.push_back(a);
myInput.push_back(b);
vector<double> target;
target.push_back(a + b);
cout << endl << "Iteration " << i;
vector<double> output = myNet.backPropagate(myInput,target);
cout << "Output gotten: " << output[0];
resultPlot << i << "\t" << abs(output[0] - target[0]) << endl;
}
编辑:设置我的网络,并从本指南中一直遵循:A pdf。我实现了“工作示例3.1”并得到了与他们相同的确切结果,所以我认为我的实现是正确的,至少就他们而言是如此。
由于神经网络是建立在连接的神经元和每个神经元是加法器本身加权投入,我认为你试图达到的目标有点不明确。因此,要添加两个数字,必须将网络的权重设置为“1”,并且使用标准S形函数时,输出只能在0或1之间。 – 2011-05-01 12:09:37