深度学习入门--神经网络
初学,若有错误,恳请指正。
目录
初学,若有错误,恳请指正。
3.1 从感知机到神经网络
3.1.1 神经网络的例子
3.1.2 复习感知机
3.1.3 激活函数登场
3.2 激活函数
3.2.1 sigmoid 函数
3.2.2 阶跃函数的实现
3.2.3 阶跃函数的图形
3.2.4 sigmoid 函数的实现
3.2.5 sigmoid 函数和阶跃函数的比较
3.2.6 非线性函数
3.2.7 ReLU 函数
3.3 多维数组的运算
3.3.1 多维数组
3.3.2 矩阵乘法
3.3.3 神经网络的内积
3.4 3层神经网络的实现
3.4.1 符号确认
3.4.2 各层间信号传递的实现
3.5 输出层的设计
3.5.1 恒等函数和 softmax 函数
3.5.2 实现 softmax 函数时的注意事项
3.5.3 softmax 函数的特征
3.5.4 输出层的神经元数量
3.6 手写数字识别
3.6.1 MNIST 数据集
3.6.2 神经网络的推理处理
3.6.3 批处理
3.7 小结
3.1 从感知机到神经网络
3.1.1 神经网络的例子
在神经元的连接上面,神经网络和感知机是一样的:
3.1.2 复习感知机
前面我们说过,感知机可以将输入的多个信号再加入各自的权重之后输出为一个信号。主要的概念有偏置b,权重w。
如何根据输入信号转换出输出信号呢?这里就需要提到激活函数。
3.1.3 激活函数登场
既然叫激活函数,那么我们就可以将上述感知机的表达式转换为和函数相关的式子。
从上面的3.1式可以看出来,输出为0还是1是通过这一串来决定的,那么我们把他整体设为x,然后引入一个h(x)
让他转换为输出y,这里的h(x)就被称为是激活函数。
3.2 激活函数
输入和输出是有一定的映射关系,激活函数就是将神经元输入映射到输出。
3.2.1 sigmoid 函数
其中exp(-x) 表示求e的-x次方。e 是纳皮尔常数 2.7182 . . .
3.2.2 阶跃函数的实现
阶跃函数就是当阈值超过某个值时,改变输出的函数。例如前面说的感知机,在不超过阈值的时候为0,超过阈值之后输出为1,这就是一种阶跃函数的体现。
根据上述例子,写一串代码来实现阶跃函数:
def step_function(x): if x > 0: return 1 else: return 0
上述是最简单的方式,但是他只能处理单个值,无法处理NumPy 数组。要想处理NumPy 数组,就需要考虑到我们学过的一些小细节,在numpy数组和0比较之后,输出的结果会是布尔型,但是我们需要的结果是数值型,所以需要引进astype()方法来实现数据类型的转化,例如:
def step_function(x): y=x>0 return y.astype(np.int)
这样就把返回值转换成了整型,以方便后续的调用。
3.2.3 阶跃函数的图形
根据上面的理解,写代码来实现阶跃函数:
import numpy as np
import matplotlib.pyplot as pltdef step_function(x):y = x > 0return y.astype(int) #np.int在较高版本的numpy中已经废弃了,所以直接使用intx = np.arange(-5.0,5.0,0.1)
y = step_function(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()
这里的阶跃函数中的两句话也可以直接合并:
return np.array(x>0,type(int))
表示将输入的数组x中的元素与0进行比较,大于0为True,否则为False,然后将布尔类型转换为整型。
结果图如下:
3.2.4 sigmoid 函数的实现
原理上只是表达式不同,所以直接修改表达式:
import numpy as np
import matplotlib.pyplot as pltdef sigmoid(x):return 1/(1+np.exp(-x))x = np.arange(-5.0,5.0,0.1)
y = sigmoid(x)plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()
结果图如下:
3.2.5 sigmoid 函数和阶跃函数的比较
可以从图像中看出,阶跃函数是在到达一个值后直接跳转,但是sigmoid函数是一个平滑的曲线,也就是说,sigmoid函数还可以得到的0.几这样的结果。
这两者也有共同点,就是在输入比较小时,输出越接近0;输入大时,输出越接近1。也就是说,当输入信号为重要时, 它们都会输出较大的值;当输入信号为不重要的信息时, 两者都输出较小的值。还有一个共同点是,不管输入信号有多小,或者有多大,输出信号的值都在 0 到 1 之间。
3.2.6 非线性函数
前面我们提到过,线性函数是一条直线,从图像上可以看出,上面我们提到的两个激活函数均为非线性函数。
除此之外,前面我们也说过,多层感知机是需要通过非线性函数来形成的,所以可以说,激活函数是为了引进非线性属性,激活函数是连接单层感知机和神经网络的桥梁。
3.2.7 ReLU 函数
relu函数是当输入大于0时,输出该数,否则输出0。表达式如下:
所以要实现relu函数就要比较,输入数和0的大小,输出较大的值,使用maximum()函数:
import numpy as np
import matplotlib.pyplot as pltdef relu(x):return np.maximum(0,x)x = np.arange(-5.0,5.0,0.1)
y = relu(x)plt.plot(x,y)
plt.ylim(-1,5.5)
plt.show()
结果如下:
3.3 多维数组的运算
3.3.1 多维数组
数组的维度从0开始,0维可以认为是标量,然后就是一维(向量)、二维(矩阵)、三维(及以上称为多维)。
数组的维度可以使用np.ndim()函数得知,数组的形状使用shape()方法得知。
3.3.2 矩阵乘法
两个矩阵相乘的前后顺序也是有要求的,是第一个矩阵的某行元素乘以第二个数组的某列元素,然后各个元素相乘相加得到结果的某个值。
这就要求第一个元素的列数等于第二个元素的行数,否则会出错。
矩阵的乘法使用np.dot()函数实现。
可以从上图得知,结果的行数和列数是和第一个矩阵的行数和第二个矩阵的列数相同的。
3.3.3 神经网络的内积
直接将输入和权重设置成矩阵,那么神经网络的内积就可以直接按照上面矩阵的乘法进行运算了。
3.4 3层神经网络的实现
3.4.1 符号确认
输入信号的符号不变,权重的符号重点关注下标,是后一个神经元的标号前一个神经元的标号,如上图。
3.4.2 各层间信号传递的实现
根据表达式,可以求出a:
那么将输入,权重等设置成矩阵,得到如下的表达式:
上面的这个疑问是我刚看的时候提出的,但是看3.9表达式就可以得到解答,X是两行一列的一个矩阵,所以要想权重矩阵和它能够相乘,就需要有两列,所以就得到了上面的W的矩阵。
知道了上述的计算方式之后,就按照三层神经网络的结构进行写代码,使用的激活函数是sigmoid函数,最后一层使用恒等函数(就是不变直接输出,所以没必要另外写这个函数)
要实现这个神经网络,首先需要定义使用的参数,大写的字母表示矩阵,那么就需要设置X,W1,W2,W3,B,A1,Z1(Z表示通过激活函数转换的结果),A2,Z2,A3。将这些矩阵初始化之后存到字典当中,方便后续的使用。
然后再定义一个函数,实现正向传播的过程。
得到的代码如下:
import numpy as npdef sigmoid(x):return 1/(1+np.exp(-x))def init_network():network = {}network['W1'] = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])network['b1'] = np.array([0.1, 0.2, 0.3])network['W2'] = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])network['b2'] = np.array([0.1, 0.2])network['W3'] = np.array([[0.1, 0.3], [0.2, 0.4]])network['b3'] = np.array([0.1, 0.2])return networkdef forward(network,x):W1,W2,W3 = network['W1'],network['W2'], network['W3']b1, b2, b3 = network['b1'], network['b2'], network['b3']a1 = np.dot(x,W1) + b1z1 = sigmoid(a1)a2 = np.dot(z1,W2) + b2z2 = sigmoid(a2)a3 = np.dot(z2,W3) + b3return a3x = np.array([1.0,0.5])
network = init_network()
y = forward(network,x)
print(y)
3.5 输出层的设计
3.5.1 恒等函数和 softmax 函数
一般恒等函数用于回归模型(通过输入预测输出),softmax用于分类(将数据分成几种)。
softmax函数表达式如下:
分子是求输入信号k的指数,分母是求所有输入信号的指数和。
import numpy as npdef softmax(x):a = np.exp(x)b = np.sum(a) #这里输入的也是个数组,所以直接求和就可以return a/bx = np.array([0.3, 2.9, 4.0])
print(softmax(x))
结果:
3.5.2 实现 softmax 函数时的注意事项
可能会出现溢出问题(计算机处理“数”时,数值必须在 4 字节或 8 字节的有限数据宽度内。 这意味着数存在有效位数,也就是说,可以表示的数值范围是有 限的。因此,会出现超大值无法表示的问题。这个问题称为溢出, 在进行计算机的运算时必须(常常)注意。),所以一般都是在求指数前减去数组中的最大值,然后再计算。
import numpy as npdef softmax(x):c = np.max(x)a = np.exp(x-c)b = np.sum(a)return a/bx = np.array([0.3, 2.9, 4.0])
print(softmax(x))
输出结果不变,原因如下:
3.5.3 softmax 函数的特征
输出总和为 1。
import numpy as npdef softmax(x):c = np.max(x)a = np.exp(x-c)b = np.sum(a)return a/bx = np.array([0.3, 2.9, 4.0])
y = softmax(x)
print(y)
print(np.sum(y))
正因为有了这个性质,我们才可以把 softmax 函数的输出解释为“概率”。
神经网络只把输出值最大的神经元所对应的类别作为识别结果。
3.5.4 输出层的神经元数量
输出层的神经元数量需要根据待解决的问题来决定。比如,如果要将一批数据分为0……9这10类,那么输出层的神经元数量就是10。
输出值最大的即为网络预测的类别。
3.6 手写数字识别
3.6.1 MNIST 数据集
MNIST 数据集是由 0 到 9 的数字图像构成的。MNIST 的图像数据是 28 像素 × 28 像素的灰度图像(1通道),各个像素的取值在 0 到 255 之间。每个图像数据都相应地标有“7”“2”“1”等标签。
首先就是数据集的读入,使用的是load_mnist()函数。
这里就不运行了,我就先学习里面的一些基本概念以及表示了:
MNIST 数据读入:
from dataset.mnist import load_mnist
#表示从 dataset 包中的 mnist 子模块导入 load_mnist 函数,用于加载 MNIST 数据集。
load_mnist 函数以“( 训练图像 , 训练标签 ),( 测试图像,测试标签 )”的 形式返回读入的 MNIST 数据,例如:
(x_train, t_train), (x_test, t_test) = load_mnist(flatten=True, normalize=False,one_hot_label=False)
fatten表示是否将输入数组展平为一维数组。
normalize表示是否将输入图像正规化为 0.0~1.0 的值。(将各个像素值除以 255,是简单的正规化)
one_hot_label表示是否将标签设置为0,1这样。若为False,则直接按照图像中的数值设置,比如图像中为7,则标签为7;若为True,则仅正确解标签为 1,错误的为0。
显示 MNIST 图像:
reshape() 方法的参数指定期望的形状,更改 NumPy 数组的形状。
把保存为 NumPy 数组的图像数据转换为 PIL 用的数据对象,这个转换处理由 Image.fromarray() 来完成。
3.6.2 神经网络的推理处理
init_network() 会读入保存在 pickle 文件 sample_weight.pkl 中的学习到的权重参数 A。这个文件中以字典变量的形式保存了权重和偏置参数。(应该就是和前面我们写的那个network那样)
识别精度:能在多大程度上正确分类
首先获得 MNIST 数据集,生成网络。接着,用 for 语句逐一取出保存在 x 中的图像数据,用 predict() 函数进行分类。predict() 函数以 NumPy 数组的形式输出各个标签对应的概率。然后,我们取出这个概率列表中的最大值的索引(第几个元素的概率最高),作为预测结果。可以用 np.argmax(x) 函数取出数组中的最大值的索引,np.argmax(x) 将获取被赋给参数 x 的数组中的最大值元素的索引。最后,比较神经网络所预测的答案和正确解标签,将回答正确的概率作为识别精度。
3.6.3 批处理
若同时处理100张,就可以称为批处理(batch_size)
实现代码如下:
axis=1表示在每一组y_batch中分别找出值最大的索引,例如:
每一组中最大的分别为0.8,0.6,0.5,0.8,那么索引就是1,2,1,0(索引从0开始)。
accuracy_cnt += np.sum(p == t[i:i+batch_size])则表示找出i到i+batch_size中标签正确的总数。
3.7 小结
神经网络中使用的是平滑变化的 sigmoid函数,而感知机中使用的是信号急剧变化的阶跃函数。
因为时间的原因,没有自己把手写数字识别打一遍,只是大致的过了一遍,后面有时间的话就自己试一遍,没时间就先这样吧,明天学习第四章,神经网络的学习。
相关文章:

深度学习入门--神经网络
初学,若有错误,恳请指正。 目录 初学,若有错误,恳请指正。 3.1 从感知机到神经网络 3.1.1 神经网络的例子 3.1.2 复习感知机 3.1.3 激活函数登场 3.2 激活函数 3.2.1 sigmoid 函数 3.2.2 阶跃函数的实现 3.2.3 阶跃函数…...

pycharm 调试 debug 进入 remote_sources
解决办法1: pycharm函数跳转到remote_sources中的文件中_pycharm修改remotesource包存放地址-CSDN博客 file->settings->project structure将项目文件夹设为"Sources"(此时文件夹会变为蓝色)。 解决方法2 Debug:使用Pychar…...

【复习】计算机网络
网络模型 OSI 应用层:给应用程序提供统一的接口表示层:把数据转换成兼容另一个系统能识别的格式会话层:负责建立、管理、终止表示层实体之间的通信会话传输层:负责端到端的数据传输网络层:负责数据的路由、转发、分片…...
CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望
CentOS停服后的替代选择:openEuler、Rocky Linux及其他系统的未来展望 引言CentOS停服的背景华为openEuler:面向未来的开源操作系统1. 简介2. 特点3. 发展趋势 Rocky Linux:CentOS的精神继承者1. 简介2. 特点3. 发展趋势 其他可选的替代系统1…...

ollama+open-webui,本地部署自己的大模型
目录 一、效果预览 二、部署ollama 1.ollama说明 2.安装流程 2.1 windows系统 2.1.1下载安装包 2.1.2验证安装结果 2.1.3设置模型文件保存地址 2.1.4拉取大模型镜像 2.2linux系统 2.2.1下载并安装ollama 2.2.2设置环境变量 2.2.3拉取模型文件 三、部署open-webui…...
Oracle EBS 12.1和APEX 集成时 Apache的配置代理
在有些场景下,apex的前端服务不是和oracle EBS 应用部署在同一个服务器上或者要求apex和访问地址和EBS公用同一个域名同一个端口,那么怎么才能做到用EBS 的域名和端口来实现对apex的访问呢 通过配置代理规则解决,以Oracle EBS 12.1.3 为例&am…...
hive开窗函数边界值ROWS BETWEEN 和 RANGE BETWEEN区别
目录 一、概念 1.rows between ... and ... 2.range between ... and ... 二、语法 1.关键词含义 一、概念 1.rows between ... and ... rows:指以行号来决定frame的范围,是物理意义上的行。 2.range between ... and ... range:指以当…...

HTML第一节
一.HTML标签 注意:1.双标签是要包裹内容的 (单标签单独记) 二.HTML骨架 1.骨架规则 注意:1.title为网页的名字 2.VS code自动生成骨架 注意:1.先输入感叹号(必须为英文) 再按回车 三.标签间的…...
Google第三方库详解------ProtoBuf详解 + 样例(5万字详解!)
目录 前言: 提示: 插件 入门: ProtoBuf普通字段类型: 编译命令: 序列化与反序列化: Proto3语法: 字段规则:数组类型 应用 将通讯录数据序列化后写入文件 工具介绍&#x…...
机器学习数学通关指南——泰勒公式
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 泰勒公式是用多…...
如果后台的Long类型的数据返回是null,那么Android客户端的数据bean的kotlin的Long类型的字段接受到数据后是null空指针吗?
如果后台的Long类型的数据返回是null,那么Android客户端的数据bean的kotlin的Long类型的字段接受到数据后是null空指针吗? DeepSeek R1 思考 35 秒 思考过程 好的,用户的问题是关于在Android客户端使用Kotlin处理后台返回的Long类型数据为n…...

ai-financial-agent - 为金融投资打造的AI代理
探索人工智能在投资研究中的应用。本项目仅用于**教育**目的,不用于真实交易或投资。 作者声明: 本项目仅用于教育和研究目的。 不用于真实交易或投资不提供任何保证或担保过去的表现并不代表未来的结果Creator 对经济损失不承担任何责任咨询财务顾问…...

学习路程三 数据加载及向量化
前序 之前简单粗暴将LangChain分了几块,现在就挨着了解学习每块内容。今天主要从文档这条路来看。 本地文档这一条链路,通过加载,分割,向量化,再存储数据库 ps:看到这里还想继续实操下去,可以…...

基于GWO灰狼优化的WSN网络最优节点部署算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 无线传感器网络(Wireless Sensor Network, WSN)由大量分布式传感器节点组成,用于监测物理或环境状况。节点部署是 WSN 的关键问…...

保姆级! 本地部署DeepSeek-R1大模型 安装Ollama Api 后,Postman本地调用 deepseek
要在Postman中访问Ollama API并调用DeepSeek模型,你需要遵循以下步骤。首先,确保你有一个有效的Ollama服务器实例运行中,并且DeepSeek模型已经被加载。 可以参考我的这篇博客 保姆级!使用Ollama本地部署DeepSeek-R1大模型 并java…...
架构对比分析
您提到的两种架构描述本质上遵循相同的分层设计理念,但存在差异的原因在于 视角不同 和 硬件平台特性。以下是详细解析: 一、架构对比分析 1. 逻辑分层(通用软件设计视角) 应用层(UI/用户交互)↓ 业务逻辑…...

【每日八股】Redis篇(二):数据结构
Redis 数据类型? 主要有 STRING、LIST、ZSET、SET 和 HASH。 STRING String 类型底层的数据结构实现主要是 SDS(简单动态字符串),其主要应用场景包括: 缓存对象:可以用 STRING 缓存整个对象的 JSON&…...

windows使用命令解压jar包,替换里面的文件。并重新打包成jar包,解决Failed to get nested archive for entry
有一个jar包,需要替换里面的文件,使用解压工具打开项目,然后找到对应的子包,再次打开,然后进行手工替换重新压缩成jar包后,发现启动服务报错Failed to get nested archive for entry。 使用下面的命令可实…...
2025电商与跨境贸易实战全解析:DeepSeek赋能细分领域深度指南(附全流程案例)
🚀 2025电商与跨境贸易实战全解析:DeepSeek赋能细分领域深度指南(附全流程案例)🚀 📚 目录 DeepSeek在电商与跨境贸易中的核心价值选品与市场分析:AI驱动的精准决策Listing优化与多语言营销:提升转化率的秘密物流与供应链管理:AI赋能的效率革命客户服务与私域运营:…...

驱动开发系列39 - Linux Graphics 3D 绘制流程(二)- 设置渲染管线
一:概述 Intel 的 Iris 驱动是 Mesa 中的 Gallium 驱动,主要用于 Intel Gen8+ GPU(Broadwell 及更新架构)。它负责与 i915 内核 DRM 驱动交互,并通过 Vulkan(ANV)、OpenGL(Iris Gallium)、或 OpenCL(Clover)来提供 3D 加速。在 Iris 驱动中,GPU Pipeline 设置 涉及…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...