首页 > 解决方案 > C++ 神经网络实现 XOR.Output 总是接近 0.5

问题描述

我正在尝试在 C++ 上实现简单的神经网络。但是,在使用 HOR 对其进行测试时,它总是给出接近 0.5 的输出。我尝试改变 bies 神经元的学习率、动量、值,但没有任何帮助。

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

struct Neuron
{
    vector<double> weights;
    vector<double> deltaWeights;
    vector<double> gradient;
    double value;
    double delta;
};

typedef vector<Neuron> Layer;

class Network
{
    public:
    Network(vector<unsigned>& Topology);
    double Sigmoid(double& x) { return 1 / (1 + exp(-x)); };
    double SigmoidDerivative(double& x) { return Sigmoid(x) * (1 - Sigmoid(x)); };
    double RandomWeights() { return ((double)rand() / RAND_MAX); };
    double ErrorFactor(vector<double>& TargetVals);
    void FeedForward(vector<double>& inputVals);
    void BackPropagation(vector<double>& targetVals);
private:
    vector<Layer> Net;
    const double alpha = 0.15; //learning rate
    const double epsilon = 0.3; //momentum
};

我尝试使用 const 权重进行前馈,我认为反向传播算法存在错误

反向传播算法:

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];
            }
        }
    }
}

标签: c++neural-network

解决方案


推荐阅读