C++:多层神经网络(附带源码)

项目背景详细介绍

随着人工智能与机器学习的快速发展,神经网络(Neural Network)已经成为现代计算机科学中不可或缺的核心技术之一。

在工业级项目中,人们往往直接使用:

  • TensorFlow

  • PyTorch

  • ONNX Runtime

  • 各类推理框架

但对于C++ 学习者和算法初学者来说,如果一开始就依赖这些“黑盒框架”,往往会产生几个严重问题:

  • 不清楚神经网络内部到底做了什么

  • 不了解前向传播与反向传播的本质

  • 无法将数学公式与代码建立对应关系

  • 难以在底层系统、嵌入式、游戏引擎中灵活应用

而在很多真实工程场景中,例如:

  • 游戏 AI

  • 智能决策系统

  • 嵌入式设备推理

  • 算法教学与科研验证

  • 面试与基础能力考察

从零手写一个多层神经网络,反而是一项极具价值的能力。

因此,本项目将以教学与理解为第一目标,在不使用任何第三方机器学习库的前提下,完整实现一个:

支持多层结构、前向传播、反向传播、梯度下降训练的 C++ 神经网络

该项目非常适合作为博客长文、人工智能课程、算法与 C++ 综合训练项目


项目需求详细介绍

本项目的目标需求如下:

1. 功能需求

  1. 使用 C++ 实现多层前馈神经网络

  2. 支持输入层、隐藏层、输出层

  3. 支持 Sigmoid 激活函数

  4. 支持前向传播(Forward Propagation)

  5. 支持反向传播(Backpropagation)

  6. 支持基于梯度下降的权重更新

  7. 能够完成简单监督学习任务

2. 网络结构要求

  • 全连接网络(Fully Connected)

  • 任意层数(示例使用 1 个隐藏层)

  • 使用矩阵 / 向量计算(手动实现)

3. 教学与工程要求

  1. 数学概念与代码一一对应

  2. 代码结构清晰,便于逐层理解

  3. 不追求极致性能,追求可读性

  4. 可扩展为更复杂网络结构


相关技术详细介绍

1. 神经网络基本组成

一个典型的前馈神经网络由以下部分组成:

  1. 神经元(Neuron)

  2. 权重(Weight)

  3. 偏置(Bias)

  4. 激活函数(Activation Function)

数学表达式为:

y = f( Σ(wi * xi) + b )


2. 前向传播(Forward Propagation)

前向传播是指:

从输入层开始,逐层计算,直到输出层得到预测结果

这是**推理(Inference)**的核心过程。


3. 反向传播(Backpropagation)

反向传播是神经网络学习的核心算法,其本质是:

  • 利用链式法则

  • 从输出层向前逐层计算误差

  • 更新权重和偏置


4. 梯度下降(Gradient Descent)

权重更新公式为:

weight = weight - learning_rate * gradient

这是神经网络“学习”的本质。


实现思路详细介绍

整体实现思路如下:

  1. 封装神经网络类

    • 保存权重矩阵与偏置

    • 管理网络层结构

  2. 实现前向传播

    • 输入 → 隐藏层 → 输出层

  3. 实现反向传播

    • 输出层误差

    • 隐藏层误差

    • 权重与偏置更新

  4. 训练循环

    • 输入样本

    • 前向计算

    • 反向更新

    • 多轮迭代收敛

该结构与所有深度学习框架的底层原理完全一致


完整实现代码

/**************************************************** * File: NeuralNetwork.h ****************************************************/ #pragma once #include <vector> class NeuralNetwork { public: NeuralNetwork(int input, int hidden, int output, double lr); std::vector<double> predict(const std::vector<double>& input); void train(const std::vector<double>& input, const std::vector<double>& target); private: double learningRate; std::vector<std::vector<double>> weightsIH; std::vector<std::vector<double>> weightsHO; std::vector<double> biasH; std::vector<double> biasO; static double sigmoid(double x); static double dsigmoid(double y); }; /**************************************************** * File: NeuralNetwork.cpp ****************************************************/ #include "NeuralNetwork.h" #include <cmath> #include <cstdlib> static double randomWeight() { return ((double)rand() / RAND_MAX) * 2.0 - 1.0; } NeuralNetwork::NeuralNetwork(int input, int hidden, int output, double lr) : learningRate(lr) { weightsIH.resize(hidden, std::vector<double>(input)); weightsHO.resize(output, std::vector<double>(hidden)); biasH.resize(hidden); biasO.resize(output); for (auto& row : weightsIH) for (auto& w : row) w = randomWeight(); for (auto& row : weightsHO) for (auto& w : row) w = randomWeight(); for (auto& b : biasH) b = randomWeight(); for (auto& b : biasO) b = randomWeight(); } double NeuralNetwork::sigmoid(double x) { return 1.0 / (1.0 + exp(-x)); } double NeuralNetwork::dsigmoid(double y) { return y * (1.0 - y); } std::vector<double> NeuralNetwork::predict(const std::vector<double>& input) { std::vector<double> hidden(biasH); for (size_t i = 0; i < hidden.size(); i++) for (size_t j = 0; j < input.size(); j++) hidden[i] += weightsIH[i][j] * input[j]; for (auto& h : hidden) h = sigmoid(h); std::vector<double> output(biasO); for (size_t i = 0; i < output.size(); i++) for (size_t j = 0; j < hidden.size(); j++) output[i] += weightsHO[i][j] * hidden[j]; for (auto& o : output) o = sigmoid(o); return output; } void NeuralNetwork::train(const std::vector<double>& input, const std::vector<double>& target) { // 前向传播 std::vector<double> hidden(biasH); for (size_t i = 0; i < hidden.size(); i++) for (size_t j = 0; j < input.size(); j++) hidden[i] += weightsIH[i][j] * input[j]; for (auto& h : hidden) h = sigmoid(h); std::vector<double> output(biasO); for (size_t i = 0; i < output.size(); i++) for (size_t j = 0; j < hidden.size(); j++) output[i] += weightsHO[i][j] * hidden[j]; for (auto& o : output) o = sigmoid(o); // 输出层误差 std::vector<double> outputErrors(output.size()); for (size_t i = 0; i < output.size(); i++) outputErrors[i] = target[i] - output[i]; // 隐藏层误差 std::vector<double> hiddenErrors(hidden.size(), 0.0); for (size_t i = 0; i < hidden.size(); i++) for (size_t j = 0; j < output.size(); j++) hiddenErrors[i] += weightsHO[j][i] * outputErrors[j]; // 更新权重 HO for (size_t i = 0; i < weightsHO.size(); i++) for (size_t j = 0; j < weightsHO[i].size(); j++) weightsHO[i][j] += learningRate * outputErrors[i] * dsigmoid(output[i]) * hidden[j]; // 更新偏置 O for (size_t i = 0; i < biasO.size(); i++) biasO[i] += learningRate * outputErrors[i] * dsigmoid(output[i]); // 更新权重 IH for (size_t i = 0; i < weightsIH.size(); i++) for (size_t j = 0; j < weightsIH[i].size(); j++) weightsIH[i][j] += learningRate * hiddenErrors[i] * dsigmoid(hidden[i]) * input[j]; // 更新偏置 H for (size_t i = 0; i < biasH.size(); i++) biasH[i] += learningRate * hiddenErrors[i] * dsigmoid(hidden[i]); } /**************************************************** * File: main.cpp ****************************************************/ #include "NeuralNetwork.h" #include <iostream> int main() { NeuralNetwork nn(2, 4, 1, 0.1); // 训练 XOR for (int i = 0; i < 5000; i++) { nn.train({0, 0}, {0}); nn.train({0, 1}, {1}); nn.train({1, 0}, {1}); nn.train({1, 1}, {0}); } std::cout << "0 XOR 0 = " << nn.predict({0, 0})[0] << std::endl; std::cout << "0 XOR 1 = " << nn.predict({0, 1})[0] << std::endl; std::cout << "1 XOR 0 = " << nn.predict({1, 0})[0] << std::endl; std::cout << "1 XOR 1 = " << nn.predict({1, 1})[0] << std::endl; return 0; }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1147206.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫抓Cat-Catch视频下载工具:零基础快速掌握的7大实用技巧

猫抓Cat-Catch视频下载工具&#xff1a;零基础快速掌握的7大实用技巧 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法下载网页视频而烦恼吗&#xff1f;猫抓Cat-Catch这款智能浏览器扩展就…

DoL-Lyra整合包终极使用手册:5分钟快速精通秘籍

DoL-Lyra整合包终极使用手册&#xff1a;5分钟快速精通秘籍 【免费下载链接】DoL-Lyra Degrees of Lewdity 整合 项目地址: https://gitcode.com/gh_mirrors/do/DoL-Lyra 还在为Degrees of Lewdity游戏的各种Mod安装烦恼吗&#xff1f;DoL-Lyra整合包彻底改变了传统Mod管…

5分钟快速上手:BooruDatasetTagManager图片标签批量管理完整指南

5分钟快速上手&#xff1a;BooruDatasetTagManager图片标签批量管理完整指南 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 你是否曾经面对数千张需要标注的AI训练图片感到手足无措&#xff1f;手工逐…

C++:FTP文件上传下载(附带源码)

项目背景详细介绍在传统企业系统、工业控制、内网工具以及大量遗留系统中&#xff0c;FTP&#xff08;File Transfer Protocol&#xff09; 依然被广泛用于文件传输任务&#xff0c;例如&#xff1a;自动化日志上传程序更新文件分发服务器配置同步内网设备文件交换嵌入式系统文…

2025终极方案:video-subtitle-extractor快速实现视频字幕提取自动化

2025终极方案&#xff1a;video-subtitle-extractor快速实现视频字幕提取自动化 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域…

深蓝词库转换终极指南:5步搞定20+输入法词库无缝迁移

深蓝词库转换终极指南&#xff1a;5步搞定20输入法词库无缝迁移 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为换输入法就要重新积累词库而烦恼吗&#xff1f…

深蓝词库转换工具:输入法词库转换的终极解决方案

深蓝词库转换工具&#xff1a;输入法词库转换的终极解决方案 【免费下载链接】imewlconverter ”深蓝词库转换“ 一款开源免费的输入法词库转换程序 项目地址: https://gitcode.com/gh_mirrors/im/imewlconverter 还在为不同输入法间词库格式不兼容而烦恼吗&#xff1f;…

NS-USBLoader终极指南:告别Switch文件传输困扰的完整解决方案

NS-USBLoader终极指南&#xff1a;告别Switch文件传输困扰的完整解决方案 【免费下载链接】ns-usbloader Awoo Installer and GoldLeaf uploader of the NSPs (and other files), RCM payload injector, application for split/merge files. 项目地址: https://gitcode.com/g…

Python网络自动化终极指南:从零构建智能预约工具

Python网络自动化终极指南&#xff1a;从零构建智能预约工具 【免费下载链接】auto_commemorative_coin_booking 项目地址: https://gitcode.com/gh_mirrors/au/auto_commemorative_coin_booking 在数字化时代&#xff0c;网络自动化技术正成为提升工作效率的关键利器。…

Bypass Paywalls Clean终极指南:一键解锁全球150+付费新闻网站

Bypass Paywalls Clean终极指南&#xff1a;一键解锁全球150付费新闻网站 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean Bypass Paywalls Clean是一款功能强大的浏览器扩展工具&…

告别手工标注:智能图片标注工具如何让效率提升300%

告别手工标注&#xff1a;智能图片标注工具如何让效率提升300% 【免费下载链接】BooruDatasetTagManager 项目地址: https://gitcode.com/gh_mirrors/bo/BooruDatasetTagManager 你是否曾经面对堆积如山的图片素材&#xff0c;却要为每一张手工添加标签&#xff1f;从今…

基于深度学习的视频硬字幕自动提取技术指南

基于深度学习的视频硬字幕自动提取技术指南 【免费下载链接】video-subtitle-extractor 视频硬字幕提取&#xff0c;生成srt文件。无需申请第三方API&#xff0c;本地实现文本识别。基于深度学习的视频字幕提取框架&#xff0c;包含字幕区域检测、字幕内容提取。A GUI tool for…

ScreenTranslator终极指南:一键截屏翻译让外语内容秒变中文

ScreenTranslator终极指南&#xff1a;一键截屏翻译让外语内容秒变中文 【免费下载链接】ScreenTranslator Screen capture, OCR and translation tool. 项目地址: https://gitcode.com/gh_mirrors/sc/ScreenTranslator 还在为看不懂的外语内容烦恼吗&#xff1f;Screen…

网页视频资源捕获工具深度解析:从技术原理到实战应用

网页视频资源捕获工具深度解析&#xff1a;从技术原理到实战应用 【免费下载链接】cat-catch 猫抓 chrome资源嗅探扩展 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 还在为无法保存心仪的在线视频而烦恼吗&#xff1f;现代网页视频资源捕获工具彻底改变…

BBDown终极指南:5分钟掌握免费B站视频下载神器

BBDown终极指南&#xff1a;5分钟掌握免费B站视频下载神器 【免费下载链接】BBDown Bilibili Downloader. 一款命令行式哔哩哔哩下载器. 项目地址: https://gitcode.com/gh_mirrors/bb/BBDown 想要轻松保存B站视频却苦于找不到合适的工具&#xff1f;BBDown这款专业级B站…

Bypass Paywalls Clean 完整使用教程:免费解锁付费内容

Bypass Paywalls Clean 完整使用教程&#xff1a;免费解锁付费内容 【免费下载链接】bypass-paywalls-chrome-clean 项目地址: https://gitcode.com/GitHub_Trending/by/bypass-paywalls-chrome-clean Bypass Paywalls Clean 是一款功能强大的浏览器扩展工具&#xff0…

NCM格式解密终极指南:简单方法实现网易云音乐文件转换

NCM格式解密终极指南&#xff1a;简单方法实现网易云音乐文件转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐的NCM加密文件无法在其他设备播放而烦恼吗&#xff1f;&#x1f914; 今天我们就来分享一个完整的解…

MusicFree插件系统终极指南:解锁无限音乐可能

MusicFree插件系统终极指南&#xff1a;解锁无限音乐可能 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins 在音乐流媒体服务日益碎片化的今天&#xff0c;你是否曾为在不同平台间切换而烦恼&#x…

ScreenTranslator屏幕翻译工具:零基础入门到精通完全指南

ScreenTranslator屏幕翻译工具&#xff1a;零基础入门到精通完全指南 【免费下载链接】ScreenTranslator Screen capture, OCR and translation tool. 项目地址: https://gitcode.com/gh_mirrors/sc/ScreenTranslator 还在为看不懂的外语内容而烦恼吗&#xff1f;Screen…

League Akari英雄联盟智能工具完全实战指南:从配置到精通

League Akari英雄联盟智能工具完全实战指南&#xff1a;从配置到精通 【免费下载链接】LeagueAkari ✨兴趣使然的&#xff0c;功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari Leagu…