#include<iostream>\n#include<vector>\n#include<cmath>\n\nusing namespace std;\n//获取误差:\ndouble getMSEloss(double x1, double x2)\n{\n return (x1 - x2) * (x1 - x2);\n}\nclass Network{\nprivate:\n int epoches;//训练次数。\n double learning_rate;//学习率。\n double w1, w2, w3, w4, w5, w6;//权重。\n double b1, b2, b3;//参数。\npublic:\n // 超参数、参数初始化: \n Network(int es, double lr) :epoches(es), learning_rate(lr)\n {\n w1 = w2 = w3 = w4 = w5 = w6 = 0;\n b1 = b2 = b3 = 0;\n }\n // 激活函数: \n double sigmoid(double x)\n {\n return 1 / (1 + exp(-x));\n }\n // 激活函数求导: \n double deriv_sigmoid(double x)\n {\n double y = sigmoid(x);\n return y * (1 - y);\n }\n // 前向传播: \n double forward(vector<double> data)\n {\n double sum_h1 = w1 * data[0] + w2 * data[1] + b1;\n double h1 = sigmoid(sum_h1);\n double sum_h2 = w3 * data[0] + w4 * data[1] + b2;\n double h2 = sigmoid(sum_h2);\n double sum_o1 = w5 * h1 + w6 * h2 + b3;\n return sigmoid(sum_o1);\n }\n //训练数据数组:\n void train(vector<vector<double>> data, vector<double> label)\n {\n for (int epoch = 0; epoch < epoches; ++epoch)\n {\n int total_n = data.size();\n for (int i = 0; i < total_n; ++i)\n {\n vector<double> x = data[i];\n double sum_h1 = w1 * x[0] + w2 * x[1] + b1;\n double h1 = sigmoid(sum_h1);\n double sum_h2 = w3 * x[0] + w4 * x[1] + b2;\n double h2 = sigmoid(sum_h2);\n double sum_o1 = w5 * h1 + w6 * h2 + b3;\n double o1 = sigmoid(sum_o1);\n double pred = o1;\n //反向算法更新神经网络参数:\n double d_loss_pred = -2 * (label[i] - pred);\n double d_pred_w5 = h1 * deriv_sigmoid(sum_o1);\n double d_pred_w6 = h2 * deriv_sigmoid(sum_o1);\n double d_pred_b3 = deriv_sigmoid(sum_o1);\n double d_pred_h1 = w5 * deriv_sigmoid(sum_o1);\n double d_pred_h2 = w6 * deriv_sigmoid(sum_o1);\n double d_h1_w1 = x[0] * deriv_sigmoid(sum_h1);\n double d_h1_w2 = x[1] * deriv_sigmoid(sum_h1);\n double d_h1_b1 = deriv_sigmoid(sum_h1);\n double d_h2_w3 = x[0] * deriv_sigmoid(sum_h2);\n double d_h2_w4 = x[1] * deriv_sigmoid(sum_h2);\n double d_h2_b2 = deriv_sigmoid(sum_h2);\n\n w1 -= learning_rate * d_loss_pred * d_pred_h1 * d_h1_w1;\n w2 -= learning_rate * d_loss_pred * d_pred_h1 * d_h1_w2;\n b1 -= learning_rate * d_loss_pred * d_pred_h1 * d_h1_b1;\n w3 -= learning_rate * d_loss_pred * d_pred_h2 * d_h2_w3;\n w4 -= learning_rate * d_loss_pred * d_pred_h2 * d_h2_w4;\n b2 -= learning_rate * d_loss_pred * d_pred_h2 * d_h2_b2;\n w5 -= learning_rate * d_loss_pred * d_pred_w5;\n w6 -= learning_rate * d_loss_pred * d_pred_w6;\n b3 -= learning_rate * d_loss_pred * d_pred_b3;\n }\n if (epoch % 10 == 0)\n {\n double loss = 0;\n for (int i = 0; i < total_n; ++i)\n {\n double pred = forward(data[i]);\n loss += getMSEloss(pred, label[i]);\n }\n //输出训练次数与误差:\n cout << "Epoch:" << epoch << " Loss: " << loss << endl;\n }\n }\n }\n //预测数据数组:\n void predict(vector<vector<double>> testdata, vector<double> testlabel)\n {\n int n = testdata.size();\n double temp = 0;\n for (int i = 0; i < n; ++i)\n {\n double pred = forward(testdata[i]);\n pred = pred > 0.5 ? 1 : 0;\n temp += (testlabel[i] == pred);\n }\n //输出判断的正确率:\n cout << "正确率:" << temp / n *100<<"%" << endl;\n }\n};\n\nint main()\n{\n //训练:\n vector<vector<double>> data = { {1,2},{3,4},{5,6},{-7,-8} };\n vector<double> label = { 0,0,0,1 };\n Network network = Network(2000, 0.1);\n network.train(data, label);\n //得出预测结论:\n vector<vector<double>> testdata = { {8,7},{-5,-6},{-2,-5},{6,8},{-5,-1} };\n vector<double> testlabel = { 0,1,1,0,1 };\n network.predict(testdata, testlabel);\n return 0;\n

C++实现简单的两层全连接神经网络,附带训练和预测功能

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

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