C++实现神经网络:二分类模型及功能需求
C++神经网络实现:二分类模型
该代码实现了一个简单的二分类神经网络模型,包含以下功能:
-
神经网络类(Network): - 初始化网络的超参数(训练次数和学习率)和参数(权重和偏置)。 - 定义激活函数(sigmoid)和其导数(deriv_sigmoid)。 - 实现前向传播函数(forward)来计算输出值。 - 实现训练函数(train)来更新网络的参数。 - 实现预测函数(predict)来对给定的数据进行预测并计算准确率。
-
均方误差计算函数(getMSEloss): - 用于在训练过程中计算损失值。
-
主函数示例: - 定义训练数据(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
// 得出预测结论: 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
原文地址: https://www.cveoy.top/t/topic/qsnt 著作权归作者所有。请勿转载和采集!