【发布时间】:2011-08-16 09:50:03
【问题描述】:
我正在尝试使一个简单的人工神经网络与反向传播算法一起工作。我已经创建了一个 ANN,并且我相信我已经正确地实现了 BP 算法,但我当然可能是错的。
现在,我正在尝试通过给它两个介于 0 和 0.5 之间的随机数 (a, b) 并让它相加来训练网络。然后,当然,每次网络给出的输出都会与 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。我实现了“Worked example 3.1”并得到了与他们完全相同的结果,所以我认为我的实现是正确的,至少就他们而言是正确的。
【问题讨论】:
-
由于神经网络建立在连接的神经元之上,并且每个神经元本身都是带有加权输入的加法器,因此我认为您试图达到的目标在某种程度上是错误定义的。因此,要添加两个数字,网络的权重必须设置为“1”,并且在使用标准 sigmoid 函数时输出只能介于 0 或 1 之间。
标签: c++ neural-network