C#构建一个简单的前馈神经网络

1. 神经网络的基本概念

神经网络是一种模拟人脑神经元结构的计算模型,由多个神经元(节点)组成,这些神经元通过连接(边)相互作用。每个连接都有一个权重,用于表示连接的重要性。神经网络通常分为输入层、隐藏层和输出层。

2. 神经元

神经元是神经网络的基本单元,它接收输入信号,通过激活函数处理这些信号,然后产生输出。常见的激活函数包括Sigmoid、ReLU、Tanh等。

3. 前向传播

前向传播是从输入层到输出层的信号传递过程。每个神经元的输出作为下一层神经元的输入,直到最终产生输出。

4. 反向传播

反向传播是训练神经网络的关键步骤,通过计算损失函数的梯度并调整权重,使得网络的预测误差最小化。

using System;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace Project.NeuralNetwork
{/// <summary>/// 构建神经网络/// 简单的前馈神经网络/// </summary>public class NeuralNetwork{/// <summary>/// 定义神经网络的层数和每层的神经元数量/// </summary>private readonly int[] layers;/// <summary>/// 存储每层的神经元值/// </summary>private double[][] neurons;/// <summary>/// 存储每层之间的权重/// </summary>private double[][][] weights;/// <summary>/// 存储每层的偏置/// </summary>private double[][] biases;/// <summary>/// 初始化/// </summary>/// <param name="layers"></param>public NeuralNetwork(int[] layers){this.layers = layers;InitializeNeurons();InitializeWeightsAndBiases();}/// <summary>/// 初始化神经元数组/// </summary>private void InitializeNeurons(){neurons = new double[layers.Length][];for (int i = 0; i < layers.Length; i++){neurons[i] = new double[layers[i]];}}/// <summary>/// 随机初始化权重和偏置/// </summary>private void InitializeWeightsAndBiases(){Random random = new Random();weights = new double[layers.Length - 1][][];biases = new double[layers.Length - 1][];for (int i = 0; i < layers.Length - 1; i++){weights[i] = new double[layers[i]][];for (int j = 0; j < layers[i]; j++){weights[i][j] = new double[layers[i + 1]];for (int k = 0; k < layers[i + 1]; k++){weights[i][j][k] = random.NextDouble() * 2 - 1;}}biases[i] = new double[layers[i + 1]];for (int j = 0; j < layers[i + 1]; j++){biases[i][j] = random.NextDouble() * 2 - 1;}}}/// <summary>/// sigmoid激活函数/// </summary>/// <param name="x"></param>/// <returns></returns>private double Sigmoid(double x){return 1.0 / (1.0 + Math.Exp(-x));}/// <summary>/// sigmoid激活函数的导数/// </summary>/// <param name="x"></param>/// <returns></returns>private double SigmoidDerivative(double x){return x * (1 - x);}/// <summary>/// 前向传播/// </summary>/// <param name="inputs"></param>public void Forward(double[] inputs){Array.Copy(inputs, neurons[0], inputs.Length);for (int i = 1; i < layers.Length; i++){for (int j = 0; j < layers[i]; j++){double sum = biases[i - 1][j];for (int k = 0; k < layers[i - 1]; k++){sum += neurons[i - 1][k] * weights[i - 1][k][j];}neurons[i][j] = Sigmoid(sum);}}}/// <summary>/// 反向传播/// </summary>/// <param name="target"></param>/// <param name="learningRate"></param>public void Backward(double[] target, double learningRate){double[][] deltas = new double[layers.Length - 1][];// 计算输出层deltas[layers.Length - 2] = new double[layers[layers.Length - 1]];for (int i = 0; i < layers[layers.Length - 1]; i++){double error = target[i] - neurons[layers.Length - 1][i];deltas[layers.Length - 2][i] = error * SigmoidDerivative(neurons[layers.Length - 1][i]);}// 计算隐藏层for (int i = layers.Length - 3; i >= 0; i--){deltas[i] = new double[layers[i + 1]];for (int j = 0; j < layers[i + 1]; j++){double error = 0.0;for (int k = 0; k < layers[i + 2]; k++){error += deltas[i + 1][k] * weights[i + 1][j][k];}deltas[i][j] = error * SigmoidDerivative(neurons[i + 1][j]);}}// 更新权重和偏差for (int i = 0; i < layers.Length - 1; i++){for (int j = 0; j < layers[i]; j++){for (int k = 0; k < layers[i + 1]; k++){weights[i][j][k] += learningRate * neurons[i][j] * deltas[i][k];}}for (int j = 0; j < layers[i + 1]; j++){biases[i][j] += learningRate * deltas[i][j];}}}/// <summary>/// 训练神经网络,使用反向传播算法更新权重和偏置/// </summary>/// <param name="inputs">输入</param>/// <param name="targets">目标</param>/// <param name="epochs">数据运算次数</param>/// <param name="learningRate">学习速率</param>public void Train(double[][] inputs, double[][] targets, int epochs, double learningRate){for (int epoch = 0; epoch < epochs; epoch++){for (int i = 0; i < inputs.Length; i++){Forward(inputs[i]);Backward(targets[i], learningRate);}}}/// <summary>/// 使用训练好的模型进行预测/// </summary>/// <param name="input"></param>/// <returns></returns>public double[] Predict(double[] input){Forward(input);return neurons[layers.Length - 1];}}
}
  • 准备训练数据
  • 训练网络
  • 测试网络并输出结果
           //1. 数据准备double[][] inputs = new double[][]{new double[] { 0, 0 },new double[] { 0, 1 },new double[] { 1, 0 },new double[] { 1, 1 }};double[][] targets = new double[][]{new double[] { 0 },new double[] { 1 },new double[] { 1 },new double[] { 0 }};//2. 构建神经网络// 定义神经网络结构:输入层2个神经元,隐藏层3个神经元,输出层1个神经元int[] layers = { 2, 3, 1 };NeuralNetwork model = new NeuralNetwork(layers);//3. 训练和评估//使用训练数据训练神经网络,并评估其性能。model.Train(inputs, targets, 10000, 0.01);//4. 训练神经网络model.Train(inputs, targets, epochs: 10000, learningRate: 0.5);// 预测数据foreach (var input in inputs){double[] prediction = model.Predict(input);Console.WriteLine($"输入: [{string.Join(", ", input)}] => 输出: [{string.Join(", ", prediction)}]");}

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

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

相关文章

百度在下一盘大棋

这两天世界互联网大会在乌镇又召开了。 我看到一条新闻&#xff0c;今年世界互联网大会乌镇峰会发布“2024 年度中国互联网企业创新发展十大典型案例”&#xff0c;百度文心智能体平台入选。 这个智能体平台我最近也有所关注&#xff0c;接下来我就来讲讲它。 百度在下一盘大棋…

UG NX二次开发(C++)-UIStyler-指定平面的对象和参数获取

文章目录 1、前言2、在UG NX中创建平面和一个长方体,3、在UI Styler中创建一个UI界面4、在VS中创建一个工程4.1 创建并添加工程文件4.2 在Update_cb方法中添加选择平面的代码4.3 编译完成并测试效果1、前言 在采用NXOpen C++进行二次开发时,采用Menu/UIStyler是一种很常见的…

【软考】数据库

1. 数据模型 1.1 概念数据模型 概念数据模型一般用 E-R 图表示&#xff0c;常用术语如下&#xff1a; 实体&#xff1a;客观存在的事物&#xff0c;如&#xff1a;一个单位、一个职工、一个部门、一个项目。属性&#xff1a;学生实体有学号、姓名、出生日期等属性。码&#…

【强化学习的数学原理】第04课-值迭代与策略迭代-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、值迭代算法二、策略迭代算法三、截断策略迭代算法四、本节课内容summary 一、值迭代算法 值迭代算法主要包括两部分。 第一…

jupyter notebook的 markdown相关技巧

目录 1 先选择为markdown类型 2 开关技巧 2.1 运行markdown 2.2 退出markdown显示效果 2.3 注意点&#xff1a;一定要 先选择为markdown类型 3 一些设置技巧 3.1 数学公式 3.2 制表 3.3 目录和列表 3.4 设置各种字体效果&#xff1a;加粗&#xff0c;斜体&#x…

Spring Boot3远程调用工具RestClient

Spring Boot3.2之后web模块提供了一个新的远程调用工具RestClient&#xff0c;它的使用比RestTemplate方便&#xff0c;开箱即用&#xff0c;不需要单独注入到容器之中&#xff0c;友好的rest风格调用。下面简单的介绍一下该工具的使用。 一、写几个rest风格测试接口 RestCont…

vscode可以编译通过c++项目,但头文件有红色波浪线的问题

1、打开 VSCode 的设置&#xff0c;可以通过快捷键 Ctrl Shift P 打开命令面板&#xff0c;然后搜索并选择 “C/C: Edit Configurations (JSON)” 命令&#xff0c;这将在 .vscode 文件夹中创建或修改 c_cpp_properties.json 文件 {"configurations": [{"name…

近源渗透|HID ATTACK从0到1

前言 对于“近源渗透”这一术语&#xff0c;相信大家已经不再感到陌生。它涉及通过伪装、社会工程学等手段&#xff0c;实地侵入企业办公区域&#xff0c;利用内部潜在的攻击面——例如Wi-Fi网络、RFID门禁、暴露的有线网口、USB接口等——获取关键信息&#xff0c;并以隐蔽的…

Python爬取豆瓣电影全部分类数据并存入数据库

在当今数字化的时代&#xff0c;网络上丰富的影视资源信息吸引着众多开发者去挖掘和利用。今天&#xff0c;我就来和大家分享一段有趣的代码&#xff0c;它能够从豆瓣电影平台获取相关数据并存储到数据库中哦。 结果展示&#xff08;文末附完整代码&#xff09;&#xff1a; 目…

java: itext8.05 create pdf

只能调用windows 已安装的字体&#xff0c;这样可以在系统中先预装字体&#xff0c;5.0 可以调用自配文件夹的字体文件。CSharp donetItext8.0 可以调用。 /*** encoding: utf-8* 版权所有 2024 ©涂聚文有限公司 言語成了邀功盡責的功臣&#xff0c;還需要行爲每日來值班…

基于Java Springboot公园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

Java中的File和IO流

File对象 File对象本质是一个文件或文件夹&#xff0c;用于写入和读取文件内容 注意&#xff1a;对于相对路径而言&#xff0c;在单元测试方法中的File是相对于Module&#xff0c;在main中的File是相对于Project 构造器 File(String pathname)File file1 new File("D:…

(Keil)MDK-ARM各种优化选项详细说明、实际应用及拓展内容

参考 MDK-ARM各种优化选项详细说明、实际应用及拓展内容 本文围绕MDK-ARM优化选项,以及相关拓展知识(微库、实际应用、调试)进行讲述,希望对你今后开发项目有所帮助。 1 总述 我们所指的优化,主要两方面: 1.代码大小(Size) 2.代码性能(运行时间) 在MDK-ARM中,优…

ssm实战项目──哈米音乐(二)

目录 1、流派搜索与分页 2、流派的添加 3、流派的修改 4、流派的删除 接上篇&#xff1a;ssm实战项目──哈米音乐&#xff08;一&#xff09;&#xff0c;我们完成了项目的整体搭建&#xff0c;接下来进行后台模块的开发。 首先是流派模块&#xff1a; 在该模块中采用分…

STM32的中断(什么是外部中断和其他中断以及中断号是什么)

一、什么是EXTI 和NVIC EXTI&#xff08;External Interrupt/Event Controller&#xff09;EXTI 是外部中断/事件控制器&#xff0c;它负责处理外部信号变化&#xff0c;并将信号传递给中断控制器&#xff08;如 NVIC&#xff09;。主要负责以下功能&#xff1a; 外部事件检测…

5、AI测试辅助-生成测试用例思维导图

AI测试辅助-生成测试用例思维导图 创建测试用例两种方式1、Plantuml思维导图版本 (不推荐&#xff09;2、Markdown思维导图版本&#xff08;推荐&#xff09; 创建测试用例两种方式 完整的测试用例通常需要包含以下的元素&#xff1a; 1、测试模块 2、测试标题 3、前置条件 4、…

IDEA 2024安装指南(含安装包以及使用说明 cannot collect jvm options 问题 四)

汉化 setting 中选择插件 完成 安装出现问题 1.可能是因为之前下载过的idea&#xff0c;找到连接中 文件&#xff0c;卸载即可。

js+jquery实现经典推箱子游戏

纯前端项目&#xff0c;只使用html,css,js,jquery实现经典推箱子游戏&#xff0c;直接下载本地双击index.html即可运行体验。 游戏展示 开始界面 完成游戏 代码展示

《文件操作》

一 . 文本文件和二进制文件 根据数据的组织形式&#xff0c;数据文件被分为了二进制文件和文本文件 数据在内存中是以二进制的形式存储&#xff0c;如果不加转换的输出到外存的文件中&#xff0c;就是二进制文件。 如果要求在外存上以ASCII 码的形式存储&#xff0c;则需要再存…

监控报警系统的指标、规则与执行闭环

随笔 从千万粉丝“何同学”抄袭开源项目说起&#xff0c;为何纯技术死路一条&#xff1f; 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 java 老矣&#xff0c;尚能饭否&#xff1f; 一骑红尘妃子笑&#xff0c;无人知是荔枝来! 有所依 我们如何知道系统交易…