C++简易神经网络关键代码注释

先上公式:
这里写图片描述
这里写图片描述

    //Forward:一层一层向输出层方向算
    void Net::forward()
    {
        for (int i = 0; i < layer_neuron_num.size() - 1; ++i)
        {
            cv::Mat product = weights[i] * layer[i] + bias[i];//线性运算
            layer[i + 1] = activationFunction(product, activation_function);激活函数的非线性运算
        }
        calcLoss(layer[layer.size() - 1], target, output_error, loss);
    }

    //Backward:一层一层往输入层方向算
    void Net::backward()
    {
        //move this function to the end of the forward().
        //calcLoss(layer[layer.size() - 1], target, output_error, loss);
        deltaError();
        updateWeights();
    }

    //Compute delta error
    void Net::deltaError()
    {
        delta_err.resize(layer.size() - 1);
        for (int i = delta_err.size() - 1; i >= 0; i--)//一层一层往输入层方向算
        {
            delta_err[i].create(layer[i + 1].size(), layer[i + 1].type());
            //cv::Mat dx = layer[i+1].mul(1 - layer[i+1]);
            cv::Mat dx = derivativeFunction(layer[i + 1], activation_function);
            //计算输出层delta error
            if (i == delta_err.size() - 1)
            {
                delta_err[i] = dx.mul(output_error);//激活函数导数乘output_error
            }
            else  //计算隐藏层delta error
            {
                cv::Mat weight = weights[i];
                cv::Mat weight_t = weights[i].t();
                cv::Mat delta_err_1 = delta_err[i];
                delta_err[i] = dx.mul((weights[i + 1]).t() * delta_err[i + 1]);//注意i层和i+1层的关系
            }
        }
    }

    //更新weights和bias
    void Net::updateWeights()
    {
        for (int i = 0; i < weights.size(); ++i)
        {
            cv::Mat delta_weights = learning_rate * (delta_err[i] * layer[i].t());
            cv::Mat delta_bias = learning_rate*delta_err[i];
            weights[i] = weights[i] + delta_weights;
            bias[i] = bias[i] + delta_bias;
        }
    }

代码出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值