C++;神经网络实现异或。输出总是接近0.5 我正在尝试在C++上实现简单的神经网络。但是,当用HOR测试时,它总是给出接近0.5的输出。我试图改变bies神经元的学习速度、动量和价值,但毫无帮助

C++;神经网络实现异或。输出总是接近0.5 我正在尝试在C++上实现简单的神经网络。但是,当用HOR测试时,它总是给出接近0.5的输出。我试图改变bies神经元的学习速度、动量和价值,但毫无帮助,c++,neural-network,C++,Neural Network,网络本身是结构的二维向量(神经元) 结构神经元 { 向量权重; 向量三角加权; 矢量梯度; 双重价值; 双三角洲; }; typedef矢量层; 班级网络 { 公众: 网络(矢量和拓扑); 双Sigmoid(double&x){return 1/(1+exp(-x));}; 双乙状结肠竞争(双&x){return Sigmoid(x)*(1-Sigmoid(x));}; 双随机权重(){return((double)rand()/rand_MAX);}; 双误差因子(矢量和目标值); 无效前馈(

网络本身是结构的二维向量(神经元)

结构神经元 { 向量权重; 向量三角加权; 矢量梯度; 双重价值; 双三角洲; }; typedef矢量层; 班级网络 { 公众: 网络(矢量和拓扑); 双Sigmoid(double&x){return 1/(1+exp(-x));}; 双乙状结肠竞争(双&x){return Sigmoid(x)*(1-Sigmoid(x));}; 双随机权重(){return((double)rand()/rand_MAX);}; 双误差因子(矢量和目标值); 无效前馈(矢量和输入); 无效反向传播(向量和目标值); 私人: 矢量网; 常数double alpha=0.15;//学习率 常数双ε=0.3;//动量 }; 我尝试用常量权重进行前馈,我认为反向传播算法存在错误

反向传播算法:

void Network::BackPropagation(vector<double>& targetVals)
{
    for (unsigned i = 0; i < Net.back().size() - 1; i++) //delta for output neurons
    {
        Net.back()[i].delta = (targetVals[i] - Net.back()[i].value)  * SigmoidDerivative(Net.back()[i].value);
    }
    for (int i = Net.size()-2; i >= 0; i--) //delta for hiden neurons
    {
        for (unsigned j = 0; j < Net[i].size(); j++)
        {
            Net[i][j].delta = 0;

            for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
            {
                Net[i][j].delta += (Net[i][j].weights[l] * Net[i + 1][l].delta);
            }

            Net[i][j].delta *= SigmoidDerivative(Net[i][j].value);
        }
    }

    for (unsigned i = 0; i < Net.size() - 1; i++) //gradient
    {
        for (unsigned j = 0; j < Net[i].size(); j++)
        {
            for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
            {
                Net[i][j].gradient[l] = Net[i][j].value * Net[i + 1][l].delta;
            }
        }
    }

    for (unsigned i = 0; i < Net.size() - 1; i++) //changing weigths
    {
        for (unsigned j = 0; j < Net[i].size(); j++)
        {
            for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
            {
                Net[i][j].deltaWeights[l] = (Net[i][j].gradient[l] * epsilon + Net[i][j].deltaWeights[l] * alpha);
                Net[i][j].weights[l] += Net[i][j].deltaWeights[l];
            }
        }
    }
}
void网络::反向传播(向量和目标值)
{
对于(无符号i=0;i=0;i--)//隐藏神经元的增量
{
对于(无符号j=0;j
当您使用调试器运行程序时,您看到了什么?这就是调试器的用途。如果您不知道如何使用调试器,这是一个很好的机会,可以学习如何使用调试器一次运行一行程序,监视所有变量及其值的变化,并分析程序的逻辑执行流。了解如何使用调试器是每个C++开发人员所需的技能,没有例外。在调试器的帮助下,您应该能够快速找到此程序和您编写的所有未来程序中的所有错误,而无需向任何人寻求帮助。当您提出问题时,发布一个而不仅仅是代码片段是一个非常好的主意。
void Network::BackPropagation(vector<double>& targetVals)
{
    for (unsigned i = 0; i < Net.back().size() - 1; i++) //delta for output neurons
    {
        Net.back()[i].delta = (targetVals[i] - Net.back()[i].value)  * SigmoidDerivative(Net.back()[i].value);
    }
    for (int i = Net.size()-2; i >= 0; i--) //delta for hiden neurons
    {
        for (unsigned j = 0; j < Net[i].size(); j++)
        {
            Net[i][j].delta = 0;

            for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
            {
                Net[i][j].delta += (Net[i][j].weights[l] * Net[i + 1][l].delta);
            }

            Net[i][j].delta *= SigmoidDerivative(Net[i][j].value);
        }
    }

    for (unsigned i = 0; i < Net.size() - 1; i++) //gradient
    {
        for (unsigned j = 0; j < Net[i].size(); j++)
        {
            for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
            {
                Net[i][j].gradient[l] = Net[i][j].value * Net[i + 1][l].delta;
            }
        }
    }

    for (unsigned i = 0; i < Net.size() - 1; i++) //changing weigths
    {
        for (unsigned j = 0; j < Net[i].size(); j++)
        {
            for (unsigned l = 0; l < Net[i][j].weights.size(); l++)
            {
                Net[i][j].deltaWeights[l] = (Net[i][j].gradient[l] * epsilon + Net[i][j].deltaWeights[l] * alpha);
                Net[i][j].weights[l] += Net[i][j].deltaWeights[l];
            }
        }
    }
}