深度学习入门--神经网络
初学,若有错误,恳请指正。
目录
初学,若有错误,恳请指正。
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 设置 涉及…...
Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
DeepSeek越强,Kimi越慌?
被DeepSeek吊打的Kimi,还有多少人在用? 去年,月之暗面创始人杨植麟别提有多风光了。90后清华学霸,国产大模型六小虎之一,手握十几亿美金的融资。旗下的AI助手Kimi烧钱如流水,单月光是投流就花费2个亿。 疯…...
k8s从入门到放弃之Pod的容器探针检测
k8s从入门到放弃之Pod的容器探针检测 在Kubernetes(简称K8s)中,容器探测是指kubelet对容器执行定期诊断的过程,以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...
【大厂机试题解法笔记】矩阵匹配
题目 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式 N M K N*M矩阵 输…...
C++ Saucer 编写Windows桌面应用
文章目录 一、背景二、Saucer 简介核心特性典型应用场景 三、生成自己的项目四、以Win32项目方式构建Win32项目禁用最大化按钮 五、总结 一、背景 使用Saucer框架,开发Windows桌面应用,把一个html页面作为GUI设计放到Saucer里,隐藏掉运行时弹…...
Neo4j 完全指南:从入门到精通
第1章:Neo4j简介与图数据库基础 1.1 图数据库概述 传统关系型数据库与图数据库的对比图数据库的核心优势图数据库的应用场景 1.2 Neo4j的发展历史 Neo4j的起源与演进Neo4j的版本迭代Neo4j在图数据库领域的地位 1.3 图数据库的基本概念 节点(Node)与关系(Relat…...





