C++神经网络实现:二分类模型

该代码实现了一个简单的二分类神经网络模型,包含以下功能:

  1. 神经网络类(Network): - 初始化网络的超参数(训练次数和学习率)和参数(权重和偏置)。 - 定义激活函数(sigmoid)和其导数(deriv_sigmoid)。 - 实现前向传播函数(forward)来计算输出值。 - 实现训练函数(train)来更新网络的参数。 - 实现预测函数(predict)来对给定的数据进行预测并计算准确率。

  2. 均方误差计算函数(getMSEloss): - 用于在训练过程中计算损失值。

  3. 主函数示例: - 定义训练数据(data)和标签(label)。 - 创建一个神经网络对象(network)并设置超参数。 - 使用训练数据和标签来训练神经网络。 - 定义测试数据(testdata)和标签(testlabel)。 - 使用训练好的神经网络对测试数据进行预测,并计算准确率。

代码示例:c++#include #include #include

using namespace std;

// 获取误差:double getMSEloss(double x1, double x2) { return (x1 - x2) * (x1 - x2);}

class Network {private: int epoches; // 训练次数。 double learning_rate; // 学习率。 double w1, w2, w3, w4, w5, w6; // 权重。 double b1, b2, b3; // 参数。

public: // 超参数、参数初始化: Network(int es, double lr) : epoches(es), learning_rate(lr) { w1 = w2 = w3 = w4 = w5 = w6 = 0; b1 = b2 = b3 = 0; }

// 激活函数:    double sigmoid(double x) {        return 1 / (1 + exp(-x));    }

// 激活函数求导:    double deriv_sigmoid(double x) {        double y = sigmoid(x);        return y * (1 - y);    }

// 前向传播:    double forward(vector<double> data) {        double sum_h1 = w1 * data[0] + w2 * data[1] + b1;        double h1 = sigmoid(sum_h1);        double sum_h2 = w3 * data[0] + w4 * data[1] + b2;        double h2 = sigmoid(sum_h2);        double sum_o1 = w5 * h1 + w6 * h2 + b3;        return sigmoid(sum_o1);    }

// 训练数据数组:    void train(vector<vector<double>> data, vector<double> label) {        for (int epoch = 0; epoch < epoches; ++epoch) {            int total_n = data.size();            for (int i = 0; i < total_n; ++i) {                vector<double> x = data[i];                double sum_h1 = w1 * x[0] + w2 * x[1] + b1;                double h1 = sigmoid(sum_h1);                double sum_h2 = w3 * x[0] + w4 * x[1] + b2;                double h2 = sigmoid(sum_h2);                double sum_o1 = w5 * h1 + w6 * h2 + b3;                double o1 = sigmoid(sum_o1);                double pred = o1;

            // 反向算法更新神经网络参数:                double d_loss_pred = -2 * (label[i] - pred);                double d_pred_w5 = h1 * deriv_sigmoid(sum_o1);                double d_pred_w6 = h2 * deriv_sigmoid(sum_o1);                double d_pred_b3 = deriv_sigmoid(sum_o1);                double d_pred_h1 = w5 * deriv_sigmoid(sum_o1);                double d_pred_h2 = w6 * deriv_sigmoid(sum_o1);                double d_h1_w1 = x[0] * deriv_sigmoid(sum_h1);                double d_h1_w2 = x[1] * deriv_sigmoid(sum_h1);                double d_h1_b1 = deriv_sigmoid(sum_h1);                double d_h2_w3 = x[0] * deriv_sigmoid(sum_h2);                double d_h2_w4 = x[1] * deriv_sigmoid(sum_h2);                double d_h2_b2 = deriv_sigmoid(sum_h2);

            w1 -= learning_rate * d_loss_pred * d_pred_h1 * d_h1_w1;                w2 -= learning_rate * d_loss_pred * d_pred_h1 * d_h1_w2;                b1 -= learning_rate * d_loss_pred * d_pred_h1 * d_h1_b1;                w3 -= learning_rate * d_loss_pred * d_pred_h2 * d_h2_w3;                w4 -= learning_rate * d_loss_pred * d_pred_h2 * d_h2_w4;                b2 -= learning_rate * d_loss_pred * d_pred_h2 * d_h2_b2;                w5 -= learning_rate * d_loss_pred * d_pred_w5;                w6 -= learning_rate * d_loss_pred * d_pred_w6;                b3 -= learning_rate * d_loss_pred * d_pred_b3;            }            if (epoch % 10 == 0) {                double loss = 0;                for (int i = 0; i < total_n; ++i) {                    double pred = forward(data[i]);                    loss += getMSEloss(pred, label[i]);                }                // 输出训练次数与误差:                cout << 'Epoch:' << epoch << '  Loss: ' << loss << endl;            }        }    }

// 预测数据数组:    void predict(vector<vector<double>> testdata, vector<double> testlabel) {        int n = testdata.size();        double temp = 0;        for (int i = 0; i < n; ++i) {            double pred = forward(testdata[i]);            pred = pred > 0.5 ? 1 : 0;            temp += (testlabel[i] == pred);        }        // 输出判断的正确率:        cout << '正确率:' << temp / n * 100 << '%' << endl;    }};

int main() { // 训练: vector<vector> data = {{-5, -3}, {7, 28}, {14, 9}, {-25, -11}}; vector label = {1, 0, 0, 1}; Network network = Network(2000, 0.1); network.train(data, label);

// 得出预测结论:    vector<vector<double>> testdata = {{-5, -7}, {-1, -15}, {17, 5}, {-23, -7}, {8, 14}};    vector<double> testlabel = {1, 1, 0, 1, 0};    network.predict(testdata, testlabel);

return 0
C++实现神经网络:二分类模型及功能需求

原文地址: https://www.cveoy.top/t/topic/qsnt 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录