简单人工神经网络的问题 - 添加

Mas*_*Zob 11 c++ neural-network

我试图用反向传播算法制作一个简单的人工神经网络.我已经创建了一个ANN,我相信我已经正确地实现了BP算法,但我当然可能是错的.

现在,我试图训练网络,给它两个0到0.5之间的随机数(a,b),然后添加它们.然后,当然,每次网络给出的输出都与a + b的理论答案进行比较(这将始终由sigmoid函数实现).

奇怪的是,输出总是收敛到介于0和1之间的数字(因为它必须是因为S形函数),但是我输入的随机数似乎对它没有影响.

编辑:对不起,它似乎没有收敛.这是输出的图像:

在此输入图像描述

权重随机分布在-1和1之间,但我也尝试过0到1之间.

我也尝试给它两个常数(0.35,0.9)并尝试训练它吐出0.5.这可以很快地收敛到0.5.如果我在0和1之间给它任意两个随机数,我也训练它吐出0.5,这也有效.

相反,我的目标是:

vector<double> target;
target.push_back(.5);
Run Code Online (Sandbox Code Playgroud)

然后它很快收敛,即使是随机输入:

在此输入图像描述

我尝试了几个不同的网络,因为我很容易在我的网络中添加图层.我使用的标准是一个有两个输入,一个是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;
}
Run Code Online (Sandbox Code Playgroud)

编辑:我建立了我的网络并一直关注本指南:PDF格式.我实现了"Worked example 3.1"并得到了他们所做的相同的结果,所以我认为我的实现是正确的,至少就他们而言.

vin*_*nes 2

正如 @macs 所说,标准 sigmoid 的最大输出是 1,因此,如果您尝试将 [0, 1] 中的 n 个数字相加,那么您的目标应该标准化,即 sum(A1, A2, ..., An) / n。