dl学习笔记:(4)简单神经网络
(1)单层正向回归网络
| b | x1 | x2 | z |
| 1 | 0 | 0 | -0.2 |
| 1 | 1 | 0 | -0.05 |
| 1 | 0 | 1 | -0.05 |
| 1 | 1 | 1 | 0.1 |
接下来我们用代码实现这组线性回归数据
import torch
x = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
z = torch.tensor([-0.2, -0.05, -0.05, 0.1])
w = torch.tensor([-0.2,0.15,0.15])
def LinearR(x,w):zhat = torch.mv(x,w)return zhat
zhat = LinearR(x,w)
zhat

下面对这段代码做一个详细说明:
(1)tensor的定义
这里我们需要定义成浮点数的原因,是因为torch中有很多函数不接受两个类型不同的参数传入,例如这里的mv函数,如果我们省略浮点的定义,就会出现报错如下:

这种静态的编程可以说既是pytorch的优点也是缺点,优点在于如果省略了对传入参数的检查处理,就会在运行速度上快很多,尤其是传入数据量大的时候,对每一个数据进行检查是一个很慢的过程。缺点在于你需要人为记住哪些函数是可以不同类型哪些不可以,pytorch没有一个统一的标准,唯一的办法就只有自己多试几次,所以建议大家在定义tensor的时候就默认定义成为float32
另外由于很多pytorch函数不接受一维张量,所以这里我们在定义的时候也养成两个[[的二维张量的习惯
(2)精度问题
如果我们想要查看运行结果是否和答案一致的时候,我们运行下面代码会发现奇怪的现象:

那就是为什么后面三个会是false,这其实就是精度的问题了。
所以当我们人为把精度调高到30位的时候就可以发现问题了:

当数据量大的时候,会因为精度问题产生较大的误差,如果想要控制误差大小,可以使用64位浮点数,唯一的缺点就是会比较占用内存。如果我们想要忽略较小的误差可以使用下面这个函数:


通过shift+tab快捷键来查看函数参数使用,我们也可以通过调整rtol和atol控制误差大小,可以看到这里的默认参数已经挺小的了
(2)torch.nn.Linear
在使用之前,我们先给出pytorch的架构图,包含了常用的类和库

我们先给出代码再进行解释:
import torch
X = torch.tensor([[0,0],[1,0],[0,1],[1,1]], dtype = torch.float32)
output = torch.nn.Linear(2,1)
zhat = output(X)
zhat

首先nn.Linear是一个类,在这里代表了输出层,所以使用output作为变量名,output的这一行相当于是类的实例化过程。里面输入的参数2和1分别指上一层的神经元个数和这一层的神经元个数。
由于nn.Module的子类会在实例化的同时自动生成随机的w和b,所以这里我们上一层就只有两个x,又由于这是回归类模型所以输出层只有一个。我们也可以调用查看随机生成的数:

如果我们不想要bias可以设置成false:output = torch.nn.Linear(2,1,bias = False)
如果我们不想都每次都随机生成不同的权重,可以设置随机数种子:torch.random.manual_seed(250)
(3)逻辑回归
我们学习过线性回归之后,都知道线性回归能够拟合直线的线性关系,但是现实生活中的数据关系往往不是线性的,所以为了更好的拟合曲线关系,统计学家就在线性回归的方程两边加上了联系函数,这种回归也被叫做广义线性回归。而在探索联系函数的过程中,就发现了sigmoid函数。
我们可以运行下面代码来画出sigmoid图像:
import numpy as np
import matplotlib.pyplot as plt# 定义Sigmoid函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 生成x轴数据
x = np.linspace(-10, 10, 400)# 计算y轴数据
y = sigmoid(x)# 绘图
plt.figure(figsize=(8, 6))
plt.plot(x, y, label="Sigmoid Function", color='b')
plt.title("Sigmoid Function")
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.grid(True)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.legend()
plt.show()

首先,我们可以观察函数图像,这是一个将所有数映射到(0,1)之间的函数,x趋于负无穷时,函数值趋近于0,x趋近于正无穷时,函数值趋近于1。
运行下面代码,我们可以画出sigmoid的导数图像:
import numpy as np
import matplotlib.pyplot as plt# 定义Sigmoid函数
def sigmoid(x):return 1 / (1 + np.exp(-x))# 定义Sigmoid函数的导数
def sigmoid_derivative(x):s = sigmoid(x)return s * (1 - s)# 生成x轴数据
x = np.linspace(-10, 10, 400)# 计算Sigmoid函数的导数
y_derivative = sigmoid_derivative(x)# 绘图
plt.figure(figsize=(8, 6))
plt.plot(x, y_derivative, label="Sigmoid Derivative", color='r')
plt.title("Derivative of Sigmoid Function")
plt.xlabel("x")
plt.ylabel("sigmoid'(x)")
plt.grid(True)
plt.axhline(0, color='black',linewidth=0.5)
plt.axvline(0, color='black',linewidth=0.5)
plt.legend()
plt.show()

可以发现在0处取到的导数值最大,往边上走迅速减小,所以它可以快速将数据从0的附近排开。这样的性质,让sigmoid函数拥有将连续型变量转化为离散型变量的力量,这也让它拥有了化回归类问题为分类问题的能力。
当我们将该函数以对数几率的形式表达出来的时候,会发现另一个有趣的地方。
我们神奇地发现,让取对数几率后所得到的值就是我们线性回归的z,因为这个性质,在等号两边加sigmoid 的算法被称为“对数几率回归”,在英文中就是Logistic Regression,就是逻辑回归。
此时 和
之和为1,因此它们可以被我们看作是一对正反例发生的概率,即
是某样本i的标签被预测为1的概率,而
是i的标签被预测为0的概率,相比的结果就是样本i的标签被预测为1的相对概率。基于这种理解,虽然可能不严谨,逻辑回归、即单层二分类神经网络返回的结果一般被当成是概率来看待和使用。
(1)与门的实现:
| x0 | x1 | x2 | andgate |
| 1 | 0 | 0 | 0 |
| 1 | 1 | 0 | 0 |
| 1 | 0 | 1 | 0 |
| 1 | 1 | 1 | 1 |
import torch
X = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32)
andgate = torch.tensor([[0],[0],[0],[1]], dtype = torch.float32)
w = torch.tensor([-0.2,0.15,0.15], dtype = torch.float32)
def LogisticR(X,w):zhat = torch.mv(X,w)sigma = torch.sigmoid(zhat)#sigma = 1/(1+torch.exp(-zhat))andhat = torch.tensor([int(x) for x in sigma >= 0.5], dtype = torch.float32)return sigma, andhat
sigma, andhat = LogisticR(X,w)
andhat
这里我们求sigma的时候用的是库里面的函数,注释的是手动写的。
唯一需要额外解释的是andhat的列表推导式:
sigma >= 0.5 会对 sigma 中的每个元素进行比较,返回一个布尔型张量,并且形状与 sigma 相同举个例子,假设 sigma = torch.tensor([0.2, 0.7, 0.5, 0.3]),那么 sigma >= 0.5 的结果会是:tensor([False, True, True, False])
接下来是列表推导式部分,它会遍历 sigma >= 0.5 中的每个布尔值,并将每个布尔值转化为整数(True 转化为 1,False 转化为 0)。也就是说,这个列表推导式的功能是将布尔值转换为二分类的预测值(0 或 1)。
上面的例子通过列表推导式 [int(x) for x in sigma >= 0.5],会得到:[0, 1, 1, 0]
当然除了sigmoid还有很多经典的函数,例如sign,ReLU,Tanh等函数,这里我们就不再一一列出来了,用到的时候再说。
(2)torch版本实现
import torch
from torch.nn import functional as F
X = torch.tensor([[0,0],[1,0],[0,1],[1,1]], dtype = torch.float32)
torch.random.manual_seed(250) #人为设置随机数种子
dense = torch.nn.Linear(2,1)
zhat = dense(X)
sigma = F.sigmoid(zhat)
y = [int(x) for x in sigma > 0.5]
y

(4)softmax
当我们遇到多分类问题的时候,往往使用softmax来解决

Softmax 是一种常用于多分类问题的激活函数,特别是在神经网络的输出层,它将一组实数转换为一个概率分布。Softmax 是“归一化指数函数”的一种形式,其主要功能是将任意实数向量转换成一个概率分布,使得每个元素的值介于0和1之间,且所有元素的和为1。这对于多分类问题来说非常重要,因为它可以帮助我们得到不同类别的概率,从而进行分类决策。

可是由于指数的缘故,经常会发生溢出的情况,如下:

所以一般我们不手动自己写softmax,一般会调用pytorch内置的函数

你可能会疑惑为什么这个函数不会出现溢出的问题,这是因为使用了一点小技巧。
为了避免溢出,我们可以将每个输入值减去输入向量的最大值
,这样可以确保计算中的指数值不会太大,仍然可以保留同样结果的相对比例。通过以下变换,我们可以得到数值稳定的 Softmax:

另外还需要解释一点的是这里的0是什么,我们可以通过快捷键查看函数的参数发现,第二个参数是维度,也就是说该函数需要你指定沿着哪一个维度进行softmax操作。

这里由于是只有一行,所以就是沿着这一行做softmax,所以维度的索引值为0,下面举几个例子:

如果是二维张量dim=1就是对两个小的张量进行softmax

这意味着 Softmax 没有对每个样本独立处理,而是计算了每个类别在所有样本中的相对比例。
我们再举一个大一点的三维张量的例子:
import torch
import torch.nn.functional as F# 输入一个 3D 张量 (batch_size, channels, height)
z = torch.tensor([[[1.0, 2.0, 3.0, 4.0], # 第一个样本的 4 个特征值[1.0, 2.0, 3.0, 4.0], # 第二个样本的 4 个特征值[1.0, 2.0, 3.0, 4.0]], # 第三个样本的 4 个特征值[[5.0, 6.0, 7.0, 8.0], # 第一个样本的 4 个特征值[5.0, 6.0, 7.0, 8.0], # 第二个样本的 4 个特征值[5.0, 6.0, 7.0, 8.0]]] # 第三个样本的 4 个特征值# 打印输入张量
print("输入张量:")
print(z)
print("\n")# 沿着 dim=2 计算 Softmax(计算每个特征维度的概率)
softmax_dim2 = F.softmax(z, dim=2)
print("沿着 dim=2 计算 Softmax:")
print(softmax_dim2)
print("\n")# 沿着 dim=1 计算 Softmax(计算每个类别的概率)
softmax_dim1 = F.softmax(z, dim=1)
print("沿着 dim=1 计算 Softmax:")
print(softmax_dim1)
print("\n")# 沿着 dim=0 计算 Softmax(计算每个样本的概率)
softmax_dim0 = F.softmax(z, dim=0)
print("沿着 dim=0 计算 Softmax:")
print(softmax_dim0)

由于这是一个shape为(2,3,4)的张量,所以dim=2也就是最后一个维度4的求和,所以是四个元素加起来等于1;dim=1也就是中间维度3,按照列加起来等于1;dim=0第一个维度2,所以是第一个小张量里面的加第二个小张量里面的等于1.
相关文章:
dl学习笔记:(4)简单神经网络
(1)单层正向回归网络 bx1x2z100-0.2110-0.05101-0.051110.1 接下来我们用代码实现这组线性回归数据 import torch x torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype torch.float32) z torch.tensor([-0.2, -0.05, -0.05, 0.1]) w torch.…...
电商项目高级篇08-springCache
电商项目高级篇08-springCache 1、整合springCache2、Cacheable细节设置 1、整合springCache 1、引入依赖 <!--引入springCache--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifa…...
4.1 AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量
AI 大模型应用最佳实践:如何提升 GPT 模型使用效率与质量 随着人工智能技术的不断进步,GPT系列大模型已经成为了自然语言处理领域的核心工具。无论是在文本生成、对话系统,还是内容创作等领域,GPT模型都展现出了强大的能力。然而,要高效、精确地使用这些模型,仍然需要一…...
Linux top命令cpu使用率计算底层原理
在Linux中,top命令通过读取内核提供的统计数据来计算CPU使用率。其底层原理可以概括为以下几步: 1. 读取 /proc/stat top命令主要从/proc/stat文件中获取CPU的统计信息。这个文件包含了每个CPU核心(或所有核心合计)的各种状态下的…...
vue知识点总结
vue2知识点总结 watch: watch 是 Vue 提供的一个选项,它允许你观察 Vue 实例上的数据变化。当观察的数据发生变化时,会执行相应的回调函数,这样你就可以对数据的变化做出响应,执行一些特定的操作。 export default {data() {re…...
[实现Rpc] 环境搭建 | JsonCpp | Mudou库 | callBack()
目录 1. 项目介绍 2. 技术选型 3. 开发环境和环境搭建 Ubuntu-22.04环境搭建 1. 安装 wget(一般情况下默认会自带) 2. 更换国内软件源 ① 备份原始 /etc/apt/sources.list 文件 ② 编辑软件源文件 ③ 更新软件包列表 3. 安装常用工具 3.1 安装…...
llamafactory使用8张昇腾910b算力卡lora微调训练qwen2-72b大模型
说明 我需要在昇腾服务器上对Qwen2-72B大模型进行lora微调,改变其自我认知。 我的环境下是8张910B1卡。显存约512GB。 准备:安装llamafactory 请参考官方方法安装llamafactory:https://github.com/hiyouga/LLaMA-Factory 特别强调下&…...
C++,设计模式,【目录篇】
文章目录 1. 简介2. 设计模式的分类2.1 创建型模式(Creational Patterns):2.2 结构型模式(Structural Patterns):2.3 行为型模式(Behavioral Patterns): 3. 使用设计模式…...
《目标检测数据集下载地址》
一、引言 在计算机视觉的广袤领域中,目标检测宛如一颗璀璨的明星,占据着举足轻重的地位。它宛如赋予计算机一双锐利的 “眼睛”,使其能够精准识别图像或视频中的各类目标,并确定其位置,以边界框的形式清晰呈现。这项技…...
C 语言的void*到底是什么?
一、void* 的类型任意性 void* 是一种通用指针类型。它可以指向任意类型的数据。例如,它可以指向一个整数(int)、一个浮点数(float)、一个字符(char)或者一个结构体等。在C语言中,当…...
Linux中的文件上传和下载
Linux中的文件上传和下载 一、连接 SFTP 在 SecureCRT 中,将鼠标移动到连接窗口的标题上,按鼠标右键,选择“连接 SFTP”标签,即可进入 SFTP 模式。 二、基本指令及用途 1. 显示当前目录 显示本地当前目录:lpwd 示例…...
DDD - 微服务落地的技术实践
文章目录 Pre概述如何发挥微服务的优势怎样提供微服务接口原则微服务的拆分与防腐层的设计 去中心化的数据管理数据关联查询的难题Case 1Case 2Case 3 总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服…...
fgets、scanf存字符串应用
题目1 夺旗(英语:Capture the flag,简称 CTF)在计算机安全中是一种活动,当中会将“旗子”秘密地埋藏于有目的的易受攻击的程序或网站。参赛者从其他参赛者或主办方偷去旗子。 非常崇拜探姬的小学妹最近迷上了 CTF&am…...
鸿蒙动态路由实现方案
背景 随着CSDN 鸿蒙APP 业务功能的增加,以及为了与iOS、Android 端统一页面跳转路由,以及动态下发路由链接,路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理,类似于 iOS与Android的实…...
Spring-boot3.4最新版整合swagger和Mybatis-plus
好家伙,今天终于开始用spring-boot3开始写项目了,以后要彻底告别1.x和2.x了,同样的jdk也来到了最低17的要求了,废话不多说直接开始 这是官方文档的要求jdk最低是17 maven最低是3.6 一. 构建工程,这一步就不需要给大家解释了吧 二. 整合Knife4j 1.大于…...
基于Java的高校实习管理平台
基于Java的高校实习管理平台是一个专为高校设计的信息化管理工具,旨在通过信息化手段简化实习管理流程,提高管理效率,增强学校、企业与学生之间的沟通与协作。: 一、系统背景与意义 随着教育体系的不断完善和就业市场的日益竞争…...
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之一维数组(应用技巧)
二、一维数组应用技巧2:打标记 实战训练1—开关灯 问题描述: 有 M个从1到M依次编号的人参加一项游戏。将K 盏从1到K依次编号的灯(K和M均为正整数,M≤K≤5000)进行一系列的熄灭与打开的操作,游戏开始时均处于亮灯的状态…...
【2024年华为OD机试】 (B卷,100分)- 路灯照明问题(Java JS PythonC/C++)
一、问题描述 路灯照明问题 题目描述 在一条笔直的公路上安装了 ( N ) 个路灯,从位置 0 开始安装,路灯之间间距固定为 100 米。每个路灯都有自己的照明半径。请计算第一个路灯和最后一个路灯之间,无法照明的区间的长度和。 输入描述 第一…...
SVGAPlayer error 处理
提示错误 Call to undeclared function OSAtomicCompareAndSwapPtrBarrier; ISO C99 and later do not support implicit function declarations Conflicting types for OSAtomicCompareAndSwapPtrBarrier Declaration of OSAtomicCompareAndSwapPtrBarrier must be imported …...
2024年12月电子学会青少年机器人技术等级考试(二级)实际操作试卷
2024.12 青少年机器人技术等级考试(二级)实际操作试卷 一、多选题 第 1 题 关于后轮驱动车说法正确的有哪些?( ) A.起步加速表现比前轮驱动好 B.容易转向过度 C.车身重量比前轮驱动更均衡 D.造价比前轮驱动车更高…...
3步解锁多平台资源下载:res-downloader全平台资源捕获实战指南
3步解锁多平台资源下载:res-downloader全平台资源捕获实战指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader re…...
Qt表格入门(优化篇)恢
1. 前言 本文详细介绍如何使用 kylin v10 iso 文件构建出 docker image,docker 版本为 20.10.7。 2. 构建 yum 离线源 2.1. 挂载 ISO 文件 mount Kylin-Server-V10-GFB-Release-030-ARM64.iso /media 2.2. 添加离线 repo 文件 在/etc/yum.repos.d/下创建kylin-local…...
信号发生器的核心电路模块解析与波形生成机制
1. 信号发生器的模块化架构设计 信号发生器就像电子世界的"乐器",能演奏出不同波形的"音符"。现代信号发生器普遍采用模块化设计,这种设计思路就像搭积木——每个功能模块独立工作又相互配合。我拆解过十几款不同型号的信号发生器&a…...
3步掌握XUnity.AutoTranslator:Unity游戏实时翻译实战指南
3步掌握XUnity.AutoTranslator:Unity游戏实时翻译实战指南 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator是一款专为Unity游戏设计的智能实时翻译插件,能够…...
mbino:Arduino上实现mbed HAL的轻量级嵌入式抽象层
1. 项目概述mbino 是一个面向 Arduino 平台的轻量级嵌入式抽象层移植库,其核心目标是将 mbed OS 2 的标准化硬件抽象 API(Hardware Abstraction Layer, HAL)无缝引入以 AVR 8-bit 微控制器(如 ATmega328P、ATmega2560)…...
基于eNSP的企业级网络规划与高可用性设计实战:从需求分析到配置验证
1. 企业级网络规划的核心挑战与eNSP价值 刚接手公司网络改造项目时,我最头疼的就是如何在纸上方案和真实环境之间架起桥梁。直到接触华为eNSP模拟器,才发现这个神器完美解决了网络工程师的三大痛点: 真实设备价格昂贵的问题被彻底化解。用笔记…...
一维最佳快递站问题(暴力 + DP 两种解法,专业版)
一、题目描述(CSP-J 入门难度)一条笔直公路上分布 n 个村庄,各村庄按坐标 1、2、…、n 依次排列,相邻村庄间距为 1。每个村庄有固定人口(权值),需在某一村庄建立快递站,使得所有村庄…...
Polycide vs. Salicide vs. Silicide: 工艺选择与电阻优化的深度解析
1. 半导体工艺中的硅化物技术:从基础到实战 在芯片制造过程中,金属硅化物技术就像电路中的"高速公路收费站",直接影响着电流的通行效率。想象一下,当你开车经过收费站时,如果收费窗口太少或者收费员动作太慢…...
Nunchaku FLUX.1 CustomV3效果展示:长宽比灵活适配(4:3/16:9/1:1)输出稳定性
Nunchaku FLUX.1 CustomV3效果展示:长宽比灵活适配(4:3/16:9/1:1)输出稳定性 1. 开篇:惊艳的图片生成新体验 你是否曾经遇到过这样的困扰:想要生成一张特定比例的图片,却发现AI模型总是输出不稳定的结果&…...
DeepWiki 优化实战:代码行号与确定性目录生成踊
一、环境准备 Free Spire.Doc for Python 是免费 Python 文档处理库,无需依赖 Microsoft Word,支持 Word 文档的创建、编辑、转换等操作,其中内置的 Markdown 解析能力,能高效实现 Markdown 到 Doc/Docx 格式的转换,且…...
