c++神经网络算法实现

这篇具有很好参考价值的文章主要介绍了c++神经网络算法实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

#include <iostream>
#include <vector>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#include <Eigen/Dense>

using namespace std;
using namespace Eigen;

// 定义常量
const int INPUT_NUM = 784; // 输入层节点数
const int HIDDEN_NUM = 100; // 隐藏层节点数
const int OUTPUT_NUM = 10; // 输出层节点数
const double LEARNING_RATE = 0.1; // 学习率
const int EPOCH_NUM = 20; // 迭代次数
const int BATCH_SIZE = 100; // 批量大小

// 定义神经网络类
class NeuralNetwork {
public:
    NeuralNetwork(int inputNum, int hiddenNum, int outputNum) {
        inputNum_ = inputNum;
        hiddenNum_ = hiddenNum;
        outputNum_ = outputNum;

        // 初始化权重和偏置
        srand(time(NULL));
        for (int i = 0; i < inputNum_; i++) {
            for (int j = 0; j < hiddenNum_; j++) {
                w1_(i, j) = (rand() / double(RAND_MAX)) * 2 - 1;
            }
        }
        for (int i = 0; i < hiddenNum_; i++) {
            for (int j = 0; j < outputNum_; j++) {
                w2_(i, j) = (rand() / double(RAND_MAX)) * 2 - 1;
            }
        }
        for (int i = 0; i < hiddenNum_; i++) {
            b1_[i] = (rand() / double(RAND_MAX)) * 2 - 1;
        }
        for (int i = 0; i < outputNum_; i++) {
            b2_[i] = (rand() / double(RAND_MAX)) * 2 - 1;
        }
    }

    // 前向传播
    void forwardPropagation(MatrixXd& x) {
        for (int i = 0; i < hiddenNum_; i++) {
            double z = 0;
            for (int j = 0; j < inputNum_; j++) {
                z += x(j, 0) * w1_(j, i);
            }
            z += b1_[i];
            h_(i, 0) = sigmoid(z);
        }
        for (int i = 0; i < outputNum_; i++) {
            double z = 0;
            for (int j = 0; j < hiddenNum_; j++) {
                z += h_(j, 0) * w2_(j, i);
            }
            z += b2_[i];
            y_(i, 0) = softmax(z);
        }
    }

    // 反向传播
    void backwardPropagation(MatrixXd& x, int t) {
        MatrixXd delta2 = y_ - oneHot(t);
        MatrixXd delta1 = (w2_ * delta2).cwiseProduct(h_.array() * (1 - h_.array())).matrix();
        w2_ -= LEARNING_RATE * h_ * delta2.transpose();
        w1_ -= LEARNING_RATE * x * delta1.transpose();
        b2_ -= LEARNING_RATE * delta2;
        b1_ -= LEARNING_RATE * delta1.col(0);
    }

    // 训练
    void train(vector<MatrixXd>& xTrain, vector<int>& tTrain) {
        for (int epoch = 0; epoch < EPOCH_NUM; epoch++) {
            shuffle(xTrain, tTrain); // 打乱训练集
            for (int i = 0; i < xTrain.size(); i += BATCH_SIZE) {
                int batchSize = min(BATCH_SIZE, int(xTrain.size() - i));
                for (int j = 0; j < batchSize; j++) {
                    forwardPropagation(xTrain[i + j]);
                    backwardPropagation(xTrain[i + j], tTrain[i + j]);
                }
            }
            double accuracy = test(xTrain, tTrain); // 计算准确率
            cout << "Epoch: " << epoch + 1 << ", Accuracy: " << accuracy << endl;
        }
    }

    // 预测
    int predict(MatrixXd& x) {
        forwardPropagation(x);
        int maxIndex = 0;
        double maxValue = y_(0, 0);
        for (int i = 1; i < outputNum_; i++) {
            if (y_(i, 0) > maxValue) {
                maxIndex = i;
                maxValue = y_(i, 0);
            }
        }
        return maxIndex;
    }

private:
    int inputNum_, hiddenNum_, outputNum_;
    MatrixXd w1_ = MatrixXd::Zero(INPUT_NUM, HIDDEN_NUM), w2_ = MatrixXd::Zero(HIDDEN_NUM, OUTPUT_NUM);
    VectorXd b1_ = VectorXd::Zero(HIDDEN_NUM), b2_ = VectorXd::Zero(OUTPUT_NUM);
    MatrixXd h_ = MatrixXd::Zero(HIDDEN_NUM, 1), y_ = MatrixXd::Zero(OUTPUT_NUM, 1);

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

    // 激活函数 softmax
    double softmax(double x) {
        return exp(x) / exp(1);
    }

    // 打乱训练集
    void shuffle(vector<MatrixXd>& xTrain, vector<int>& tTrain) {
        for (int i = 0; i < xTrain.size(); i++) {
            int j = rand() % xTrain.size();
            swap(xTrain[i], xTrain[j]);
            swap(tTrain[i], tTrain[j]);
        }
    }

    // 测试
    double test(vector<MatrixXd>& xTest, vector<int>& tTest) {
        int correctCount = 0;
        for (int i = 0; i < xTest.size(); i++) {
            if (predict(xTest[i]) == tTest[i]) {
                correctCount++;
            }
        }
        return double(correctCount) / xTest.size();
    }

    // one-hot编码
    MatrixXd oneHot(int t) {
        MatrixXd oneHotVec = MatrixXd::Zero(outputNum_, 1);
        oneHotVec(t, 0) = 1;
        return oneHotVec;
    }
};

// 测试函数
void test() {
    vector<MatrixXd> xTrain, xTest;
    vector<int> tTrain, tTest;
    int row, col;
    cin >> row >> col;
    MatrixXd input(row, col);
    for (int i = 0; i < row; i++) {
        for (int j = 0; j < col; j++)

{
 cin >> input(i, j);
 } 
} 
xTrain.push_back(input.col(col - 1));
 // 将最后一列作为训练数据
 tTrain.push_back(0); 
// 标签为0
 NeuralNetwork nn(INPUT_NUM, HIDDEN_NUM, OUTPUT_NUM); nn.train(xTrain, tTrain); int prediction = nn.predict(xTrain[0]); cout << "Prediction: " << prediction << endl; }

int main() {

test();

return 0;

}文章来源地址https://www.toymoban.com/news/detail-465074.html

到了这里,关于c++神经网络算法实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于遗传算法的BP神经网络优化算法(matlab实现)

            BP网络是一类多层的前馈神经网络。它的名字源于在网络训练的过程中,调整网络的权值的算法是误差的反向传播的学习算法,即为BP学习算法。BP算法是Rumelhart等人在1986年提出来的。由于它的结构简单,可调整的参数多,训练算法也多,而且可操作性好,BP神经网

    2024年01月16日
    浏览(58)
  • (转载)神经网络遗传算法函数极值寻优(matlab实现)

            对于未知的非线性函数,仅通过函数的输入输出数据难以准确寻找函数极值。这类问题可以通过神经网络结合遗传算法求解,利用神经网络的非线性拟合能力和遗传算法的非线性寻优能力寻找函数极值。本章用神经网络遗传算法寻优如下非线性函数极值,该函数表达式

    2024年02月16日
    浏览(43)
  • 算法介绍及实现——基于遗传算法改进的BP神经网络算法(附完整Python实现)

    目录 一、算法介绍 1.1 遗传算法 1.2 为什么要使用遗传算法进行改进 二、算法原理 三、算法实现 3.1 算子选择 3.2 代码实现          遗传算法是受启发于自然界中生物对于自然环境 “适者生存”的强大自适应能力,通过对生物演化过程模拟和抽象,构建了以自然界生物演

    2024年02月03日
    浏览(116)
  • 基于遗传算法GA算法优化BP神经网络(Python代码实现)

        BP-GA算法的设计︰基于遗传算法的BP神经网络算法(以下简称BP-GA)就是在BP神经网络的学习过程中,将权重和阀值描述为染色体,并选取适宜的适应函数,然后进行GA迭代,直到某种意义上的收敛.与普通BP学习算法相比,算法 BP一GA的优势在于可以处理一些传统方法不能处理的例子

    2024年02月09日
    浏览(54)
  • Matlab实现神经网络SOM算法(附上完整仿真源码)

    神经网络SOM算法是一种基于自组织的无监督学习算法,其全称为Self-Organizing Map,可以用来对数据进行聚类和可视化。本文将介绍如何使用Matlab实现神经网络SOM算法。 在使用Matlab实现神经网络SOM算法之前,需要先安装Matlab软件,并且需要下载Matlab的神经网络工具箱。在Matlab中

    2024年02月17日
    浏览(48)
  • Python实战演练之python实现神经网络模型算法

        python实现神经网络模型算法     今天,厾罗和大家分享用Python实现神经网络模型算法,仅用于技术学习交流。   实现技巧   1.导入依赖库 主要是安装相关的依赖库。本文实现的环境为:python 3.7。 2.构建BP神经网络类 主要是构建三层反向传播神经网络类。 3.读取数据并进

    2024年02月03日
    浏览(39)
  • 自己动手实现一个深度学习算法——三、神经网络的学习

    这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程 。为了使神经网络能进行学习,将导入 损失函数 这一指标。而学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。为了找出尽可能小的损失函数的值,利用了 函数斜率的梯度法 。

    2024年02月05日
    浏览(52)
  • 【深度学习】3-4 神经网络的学习- 学习算法的实现

    神经网络的学习步骤如下所示: 步骤1(mini-batch) 从训练数据中随机选出一部分数据,目标是减小mini-batch的损失函数的值 步骤2(计算梯度) 为了减小mini-batch的损失函数的值,需要求出各个权重参数的梯度 步骤3(更新参数) 将权重参数沿梯度方向进行微小更新. 步骤4(重复) 重复步

    2024年02月09日
    浏览(40)
  • 基于Matlab实现神经网络算法(附上100多个案例源码)

    神经网络是一种模仿人类神经系统,以处理信息为目的的计算模型。它由大量节点(或称神经元)和连接它们的边组成,每个节点代表一个变量,边表示变量之间的关系。在神经网络中,信息通过节点之间的连接传递,并在各个节点之间进行处理和转换。 Matlab是一种常用的科

    2024年01月25日
    浏览(38)
  • Python实现BP神经网络算法详解与源代码

    Python实现BP神经网络算法详解与源代码 BP神经网络是一种常用的人工神经网络。它通过误差逆向传播来训练模型。本文将介 绍BP神经网络的基本原理及其Python实现。 一. BP神经网络的基本原理 BP神经网络由输入层、隐藏层和输出层组成。其中,输入层接受原始数据,隐藏层进行

    2024年02月16日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包