神经网络极简入门

神经网络是深度学习的基础,正是深度学习的兴起,让停滞不前的人工智能再一次的取得飞速的发展。

其实神经网络的理论由来已久,灵感来自仿生智能计算,只是以前限于硬件的计算能力,没有突出的表现,直至谷歌的AlphaGO的出现,才让大家再次看到神经网络相较于传统机器学习的优异表现。

本文主要介绍神经网络中的重要基础概念,然后基于这些概念手工实现一个简单的神经网络。希望通过理论结合实践的方式让大家更容易的理解神经网络。

1. 神经网络是什么

神经网络就像人脑一样,整体看上去非常复杂,但是其基础组成部分并不复杂。其组成部分中最重要的就是神经元neural),sigmod函数layer)。

1.1. 神经元

神经元(neural)是神经网络最基本的元素,一个神经元包含3个部分:

  • 获取输入:获取多个输入的数据

  • 数学处理:对输入的数据进行数学计算

  • 产生输出:计算后多个输入数据变成一个输出数据

image.png

从上图中可以看出,神经元中的处理有2个步骤。第一个步骤:从蓝色框变成红色框,是对输入的数据进行加权计算后合并为一个值(N)。N=x1w1+x2w2𝑁=𝑥1𝑤1+𝑥2𝑤2 其中,w1,w2𝑤1,𝑤2分别是输入数据x1,x2𝑥1,𝑥2的权重。一般在计算N𝑁的过程中,除了权重,还会加上一个偏移参数b𝑏,最终得到:N=x1w1+x2w2+b𝑁=𝑥1𝑤1+𝑥2𝑤2+𝑏

第二个步骤:从红色框变成绿色框,通过sigmoid函数是对N进一步加工得到的神经元的最终输出(M)。

1.2. sigmoid函数

sigmoid函数也被称为S函数,因为的形状类似S形

image.png

它是神经元中的重要函数,能够将输入数据的值映射到(0,1)(0,1)之间。最常用的sigmoid函数是 f(x)=11+e−x𝑓(𝑥)=11+𝑒−𝑥,当然,不是只有这一种sigmoid函数。

至此,神经元通过两个步骤,就把输入的多个数据,转换为一个(0,1)(0,1)之间的值。

1.3. 层

多个神经元可以组合成一层,一个神经网络一般包含一个输入层和一个输出层,以及多个隐藏层。

image.png

比如上图中,有2个隐藏层,每个隐藏层中分别有4个和2个神经元。实际的神经网络中,隐藏层数量和其中的神经元数量都是不固定的,根据模型实际的效果来进行调整。

1.4. 网络

通过神经元和层的组合就构成了一个网络,神经网络的名称由此而来。神经网络可大可小,可简单可复杂,不过,太过简单的神经网络模型效果一般不会太好。

因为一只果蝇就有10万个神经元,而人类的大脑则有大约1000亿个神经元,这就是为什么训练一个可用的神经网络模型需要庞大的算力,这也是为什么神经网络的理论1943年就提出了,但是基于深度学习的AlphaGO却诞生于2015年

2. 实现一个神经网络

了解上面的基本概念只能形成一个感性的认知。下面通过自己动手实现一个最简单的神经网络,来进一步认识神经元sigmoid函数以及隐藏层是如何发挥作用的。

2.1. 准备数据

数据使用sklearn库中经典的鸢尾花数据集,这个数据集中有3个分类的鸢尾花,每个分类50条数据。为了简化,只取其中前100条数据来使用,也就是取2个分类的鸢尾花数据。

from sklearn.datasets import load_irisds = load_iris(as_frame=True, return_X_y=True)
data = ds[0].iloc[:100]
target = ds[1][:100]print(data)
print(target)

image.png

变量data100条数据,每条数据包含4个属性,分别是花萼的宽度和长度,花瓣的宽度和长度。

image.png

变量target中也是100条数据,只有0和1两种值,表示两种不同种类的鸢尾花。

2.2. 实现神经元

准备好了数据,下面开始逐步实现一个简单的神经网络。首先,实现最基本的单元--神经元。本文第一节中已经介绍了神经元中主要的2个步骤,分别计算出N𝑁和M𝑀。

image.png

计算N𝑁时,依据每个输入元素的权重(w1,w2𝑤1,𝑤2)和整体的偏移b𝑏;计算M𝑀时,通过sigmoid函数。

def sigmoid(x):return 1 / (1 + np.exp(-1 * x))@dataclass
class Neuron:weights: list[float] = field(default_factory=lambda: [])bias: float = 0.0N: float = 0.0M: float = 0.0def compute(self, inputs):self.N = np.dot(self.weights, inputs) + self.biasself.M = sigmoid(self.N)return self.M

上面的代码中,Neuron类表示神经元,这个类有4个属性:其中属性weightsbias是计算N𝑁时的权重和偏移;属性NM分别是神经元中两步计算的结果。

Neuron类的compute方法根据输入的数据计算神经元的输出。

2.3. 实现神经网络

神经元实现之后,下面就是构建神经网络。我们的输入数据是带有4个属性(花萼的宽度和长度,花瓣的宽度和长度)的鸢尾花数据,所以神经网络的输入层有4个值(x1,x2,x3,x4𝑥1,𝑥2,𝑥3,𝑥4)。

为了简单起见,我们的神经网络只构建一个隐藏层,其中包含3个神经元。最后就是输出层,输出层最后输出一个值,表示鸢尾花的种类。

由此形成的简单神经网络如下图所示:

image.png

实现的代码:

@dataclass
class MyNeuronNetwork:HL1: Neuron = field(init=False)HL2: Neuron = field(init=False)HL3: Neuron = field(init=False)O1: Neuron = field(init=False)def __post_init__(self):self.HL1 = Neuron()self.HL1.weights = np.random.dirichlet(np.ones(4))self.HL1.bias = np.random.normal()self.HL2 = Neuron()self.HL2.weights = np.random.dirichlet(np.ones(4))self.HL2.bias = np.random.normal()self.HL3 = Neuron()self.HL3.weights = np.random.dirichlet(np.ones(4))self.HL3.bias = np.random.normal()self.O1 = Neuron()self.O1.weights = np.random.dirichlet(np.ones(3))self.O1.bias = np.random.normal()def compute(self, inputs):m1 = self.HL1.compute(inputs)m2 = self.HL2.compute(inputs)m3 = self.HL3.compute(inputs)output = self.O1.compute([m1, m2, m3])return output

MyNeuronNetwork类是自定义的神经网络,其中的属性是4个神经元HL1HL2HL3隐藏层的3个神经元;O1输出层的神经元。

__post__init__函数是为了初始化各个神经元。因为输入层是4个属性(x1,x2,x3,x4𝑥1,𝑥2,𝑥3,𝑥4),所以神经元HL1HL2HL3weights初始化为4个随机数组成的列表,偏移(bias)用一个随时数来初始化。

对于神经元O1,它的输入是隐藏层的3个神经元,所以它的weights初始化为3个随机数组成的列表,偏移(bias)还是用一个随时数来初始化。

最后还有一个compute函数,这个函数描述的就是整个神经网络的计算过程。首先,根据输入层(x1,x2,x3,x4𝑥1,𝑥2,𝑥3,𝑥4)的数据计算隐藏层的神经元(HL1HL2HL3);然后,以隐藏层的神经元(HL1HL2HL3)的输出作为输出层的神经元(O1)的输入,并将O1的计算结果作为整个神经网络的输出。

2.4. 训练模型

上面的神经网络中各个神经元的中的参数(主要是weightsbias)都是随机生成的,所以直接使用这个神经网络,效果一定不会很好。所以,我们需要给神经网络(MyNeuronNetwork类)加一个训练函数,用来训练神经网络中各个神经元的参数(也就是个各个神经元中的weightsbias)。

@dataclass
class MyNeuronNetwork:# 略...def train(self, data: pd.DataFrame, target: pd.Series):## 使用 随机梯度下降算法来训练pass

上面的train函数有两个参数data(训练数据)和target(训练数据的标签)。我们使用随机梯度下降算法来训练模型的参数。这里略去了具体的代码,完整的代码可以在文章的末尾下载。

此外,再实现一个预测函数predict,传入测试数据集,然后用我们训练好的神经网络模型来预测测试数据集的标签。

@dataclass
class MyNeuronNetwork:# 略...def predict(self, data: pd.DataFrame):results = []for idx, row in enumerate(data.values):pred = self.compute(row)results.append(round(pred))return results

2.5. 验证模型效果

最后就是验证模型的效果。

def main():# 加载数据ds = load_iris(as_frame=True, return_X_y=True)# 只用前100条数据data = ds[0].iloc[:100]target = ds[1][:100]# 划分训练数据,测试数据# test_size=0.2 表示80%作为训练数据,20%作为测试数据X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=0.2)# 创建神经网络nn = MyNeuronNetwork()# 用训练数据集来训练模型nn.train(X_train, y_train)# 检验模型# 用训练过的模型来预测测试数据的标签results = nn.predict(X_test)df = pd.DataFrame()df["预测值"] = resultsdf["实际值"] = y_test.valuesprint(df)

运行结果可以看出,模型的效果还不错,20条测试数据的预测结果都正确。

image.png

3. 总结

本文中的的神经网络示例是为了介绍神经网络的一些基本概念,所以对神经网络做了尽可能的简化,为了方便去手工实现。

而实际环境中的神经网络,不仅神经元的个数,隐藏层的数量极其庞大,而且其计算和训练的方式也很复杂,手工去实现不太可能,一般会借助TensorFlowKerasPyTorch等等知名的python深度学习库来帮助我们实现。

文章转载自:wang_yb

原文链接:https://www.cnblogs.com/wang_yb/p/18176563

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

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

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

相关文章

AI数据中心网络技术选型,InfiniBand与RoCE对比分析

InfiniBand与RoCE对比分析:AI数据中心网络选择指南 随着 AI 技术的蓬勃发展,其对数据中心网络的要求也日益严苛。低延迟、高吞吐量的网络对于处理复杂的数据密集型工作负载至关重要。本文分析了 InfiniBand 和 RoCE 两种数据中心网络技术,帮助…

MySQL数据库练习——视图

schooldb库——utf8字符集——utf8_general_ci排序规则 先创建库,再去使用下列的DDL语句。 DDL CREATE TABLE student (id int(11) NOT NULL AUTO_INCREMENT COMMENT 学号,createDate datetime DEFAULT NULL COMMENT 创建时间,modifyDate datetime DEFAULT NULL …

(四)JVM实战——GC垃圾回收

垃圾回收算法 垃圾的判别 引用计数法:实现简单,判定效率高,回收没有延迟;无法解决循环引用的问题;可达性分析算法(根搜索算法):没有循环引用的问题,防止内存泄漏 GCRo…

​​【收录 Hello 算法】3.3 数字编码

目录 3.3 数字编码 3.3.1 原码、反码和补码 3.3.2 浮点数编码 3.3 数字编码 Tip 在本书中,标题带有 * 符号的是选读章节。如果你时间有限或感到理解困难,可以先跳过,等学完必读章节后再单独攻克。 3.3.1 原码、反码和补码 在…

证券基金信创联盟研讨会:YashanDB分享金融核心数据库技术实践

4月26日,由证券基金行业信息技术应用创新联盟主办、WG3稽核风控系统工作组承办、国信证券股份有限公司协办的信创联盟2024年度系列研讨会第三期-稽核风控系统信创实践成功举办。国内头部企业国信证券、申万宏源证券、信达证券、国金证券、广发证券等单位共计300余人…

net lambda 、 匿名函数 以及集合(实现IEnumerable的 如数组 、list等)

匿名函数:》》》 Action a1 delegate(int i) { Console.WriteLine(i); }; Lambda:>>> Aciont a1 (int i) > { Console.WriteLine(i); }; 可以简写 (编译器会自动根据委托类型 推断) Action a1 (i)> {…

C语言 | Leetcode C语言题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; bool searchMatrix(int** matrix, int matrixSize, int* matrixColSize, int target) {int m matrixSize, n matrixColSize[0];int low 0, high m * n - 1;while (low < high) {int mid (high - low) / 2 low;int x matrix[mid /…

RISCV 外部GCC 工具链安装@FreeBSD15

在交叉编译的时候&#xff0c;可以使用FreeBSD15默认的工具链&#xff1a;LLVM 也可以使用GCC工具链&#xff0c;GCC可以使用现成pkg包安装&#xff0c;也可以编译安装。 LLVM的特点是高移植性和高效&#xff0c;但学习成本高。GCC的特点是成熟稳定&#xff0c;但优化能力有限…

【第6节课笔记】LagentAgentLego

Lagent 最中间部分的是LLM&#xff0c;即为大语言模型模块&#xff0c;他可以思考planning和调用什么action&#xff0c;再将其转发给动作执行器action executer执行。 支持的工具如下&#xff1a; Arxiv 搜索 Bing 地图 Google 学术搜索 Google 搜索 交互式 IPython 解释器 IP…

指针再学习笔记

概念 示例 类型 示例 作用 注意&#xff1a;有些内存地址可能系统不会允许任意访问 运算 示例 空指针

cmake install命令无法覆盖同名文件

文章目录 1. 问题记录2. 原因排查3. 解决方案 1. 问题记录 我有两个同名文件test.txt&#xff0c;它们内容不同&#xff0c;但时间戳相同&#xff08;文件属性中的修改时间相同&#xff09; 我希望在cmake中利用install命令&#xff0c;将${PATH_SRC}/test.txt替换${PATH_DES…

Delta lake with Java--利用spark sql操作数据1

今天要解决的问题是如何使用spark sql 建表&#xff0c;插入数据以及查询数据 1、建立一个类叫 DeltaLakeWithSparkSql1&#xff0c;具体代码如下&#xff0c;例子参考Delta Lake Up & Running第3章内容 import org.apache.spark.sql.SaveMode; import org.apache.spark.…

AT32 雅特力CAN详细使用说明配置细则

CAN 过滤器使用说明 CAN 过滤器相当于关卡&#xff0c;每当收到一条报文时&#xff0c;CAN 要先将收到的报文从这些过滤器上"过滤"一下&#xff0c;能通 过的报文是有效报文&#xff0c;收进相关联 FIFO&#xff08;FIFO0 或 FIFO1&#xff09;&#xff0c;不能通过的…

【贪心算法】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法Python实现时间复杂性 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图&#xff0c; E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] [ w ] c[v][w] c[v][w]如果 G G G的一个子图 G ′ G^{} G′是…

聪明与诚实:社会信任的桥梁

在现代社会中&#xff0c;我们经常听到这样的评价&#xff1a;“某人真聪明。”然而&#xff0c;当我们深入思考时&#xff0c;会发现“聪明”这个词背后所承载的含义并不单一。聪明和狡诈往往被混淆&#xff0c;而诚实的价值却时常被忽视。在一个高度诚信的社会里&#xff0c;…

Arduino控制继电器,制作智能浇水系统

所需硬件材料 Arduino模块、继电器、直流电机、3-6v电池&#xff08;这个是必须的&#xff0c;电机不能直接接在arduino的5v引脚上&#xff0c;会引起电压不足&#xff09;、杜邦线 实现效果&#xff1a; 电机转动一秒停一秒 将硬件连接如下&#xff1a; 将电机连接到继电…

【电路笔记】-RC振荡器电路

RC振荡器电路 文章目录 RC振荡器电路1、概述2、RC 相移网络3、基本RC振荡器电路4、运算放大器RC振荡器5、运算放大器相位滞后RC振荡器电路6、RC振荡器示例11、概述 RC 振荡器使用放大器和 RC 反馈网络的组合,由于级之间的相移而产生输出振荡。 当单级晶体管放大器作为共发射…

使用API有效率地管理Dynadot域名,设置所有域名默认whois信息

关于Dynadot Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮…

asp.net成绩查询系统

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net成绩查询系统 学生功能有查看成绩和修改账号密码等 后台管理员可以进行用户管理 管理员添加管理员查询注…

【unocss】自用

unocss中文官网1 不知道简写的可以在这里查 第一步 npm install -D unocss第二步 // vite.config.ts import UnoCSS from unocss/vite import { defineConfig } from viteexport default defineConfig({plugins: [UnoCSS()] })// main.ts import virtual:uno.css第三步 在…