gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 15:23:48 28 4
gpt4 key购买 nike

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

现在,我正在尝试通过给网络提供两个介于 0 和 0.5 之间的随机数 (a, b) 并将它们相加来训练网络。然后,当然,每次将网络给出的输出与 a + b 的理论答案进行比较(这将始终可以通过 sigmoid 函数实现)。

奇怪的是,输出总是收敛到 0 到 1 之间的数字(由于 sigmoid 函数,它必须如此),但我输入的随机数似乎对它没有影响。

编辑:抱歉,它似乎没有收敛。这是输出的图像:

enter image description here

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

我还尝试给它两个常量 (0.35,0.9) 并尝试训练它吐出 0.5。这非常有效并且收敛到 0.5。如果我给它 0 和 1 之间的任意两个随机数,我还训练它吐出 0.5,这也有效。

如果相反,我的目标是:

vector<double> target;
target.push_back(.5);

然后它收敛得非常快,即使是随机输入:

enter image description here

我已经尝试了几个不同的网络,因为我可以很容易地向我的网络添加层。我使用的标准是一个有两个输入,一层有 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”并得到了与他们完全相同的结果,所以我认为我的实现是正确的,至少就他们而言是这样。

最佳答案

正如@macs 所述,标准 sigmoid 的最大输出是 1,因此,如果您尝试从 [0, 1] 中添加 n 个数字,那么您的目标应该被归一化,即 sum(A1, A2, ... , 安)/n.

关于c++ - 简单人工神经网络的问题——添加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5847803/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com