PyTorch使用教程(2)-torch包

1、简介

torch包是PyTorch框架最外层的包,主要是包含了张量的创建和基本操作、随机数生成器、序列化、局部梯度操作的上下文管理器等等,内容很多。我们基础学习的时候,只有关注张量的创建、序列化,随机数、张量的数学数学计算等常用的点即可。
在这里插入图片描述

2、什么是张量

在PyTorch中,张量(Tensor)是一个核心概念,它是深度学习和科学计算的基础数据结构。在PyTorch的整个计算过程中,所有的数据结构都是以张量的形式表现。例如输入的图像、标签,输出的结构等,最终都是以张量的形式进入PyTorch的计算图。

  1. 定义:张量是一个多维数组,可以看作是标量、向量、矩阵的高维扩展。
  2. 性质
    • 张量具有任意维度,可以是0维(标量)、1维(向量)、2维(矩阵)或更高维度。
    • 张量支持各种数学运算,包括加法、乘法、卷积等,这些运算可以高效地在CPU或GPU上执行。
    • 张量可以跟踪计算图,并通过反向传播计算梯度,这对于深度学习中的优化任务至关重要。
  3. 张量的属性
    • 形状(shape):张量的形状定义了其维度和每个维度上的大小,如形状为(2, 3, 4)的张量表示具有2个深度、每个深度包含3行4列的3D数组。
    • 数据类型(dtype):张量中的元素具有特定的数据类型,如浮点数(float32float64)或整数(int32int64)等。
    • 设备(device):张量可以存储在CPU或GPU上,通过指定设备参数可以在不同设备之间创建或移动张量。

3、torch包的张量操作

3.1 张量创建

1. 创建全0的张量

torch.zeros(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor

参数

  • size (int…) – 定义输出张量形状的整数序列。可以是可变数量的参数或类似列表或元组的集合。

示例

>>> torch.zeros(2, 3)
tensor([[ 0.,  0.,  0.],
        [ 0.,  0.,  0.]])
>>> torch.zeros(5)
tensor([ 0.,  0.,  0.,  0.,  0.])

2. 创建全1的张量

torch.ones(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor

参数

  • size (int…) – 定义输出张量形状的一系列整数。可以是可变数量的参数或类似列表或元组的集合。

示例

>>> torch.ones(2, 3)
tensor([[ 1.,  1.,  1.],
        [ 1.,  1.,  1.]])

>>> torch.ones(5)
tensor([ 1.,  1.,  1.,  1.,  1.])

3. 创建未初始化数据的张量

torch.empty(*size, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, pin_memory=False, memory_format=torch.contiguous_format) → Tensor

参数

  • size (int…) – 定义输出张量形状的整数序列。可以是可变数量的参数或集合,如列表或元组。

示例

>>> torch.empty((2,3), dtype=torch.int64)
tensor([[ 9.4064e+13,  2.8000e+01,  9.3493e+13],
        [ 7.5751e+18,  7.1428e+18,  7.5955e+18]])

4. 创建对角线上的元素为1的二维张量

torch.eye(n, m=None, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor

参数

  • n (int) – 行数

示例

>>> torch.eye(3)
tensor([[ 1.,  0.,  0.],
        [ 0.,  1.,  0.],
        [ 0.,  0.,  1.]])

5. 创建填充指定值的张量

torch.full(size, fill_value, *, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor

参数

  • size (int…) – 定义输出张量形状的整数列表、元组或 torch.Size。
  • fill_value (标量) – 用于填充输出张量的值。

示例

>>> torch.full((2, 3), 3.141592)
tensor([[ 3.1416,  3.1416,  3.1416],
        [ 3.1416,  3.1416,  3.1416]])

6. 从NumPy 数组创建的张量:from_numpy
示例

>>> a = numpy.array([1, 2, 3])
>>> t = torch.from_numpy(a)
>>> t
tensor([ 1,  2,  3])
>>> t[0] = -1
>>> a
array([-1,  2,  3])

7. 判断一个Obj是不是张量:is_tensor
示例

>>> x = torch.tensor([1, 2, 3])
>>> torch.is_tensor(x)
True

3.2 张量操作

1. reshape操作

torch.reshape(input, shape) → Tensor

参数

  • input (Tensor) – 需要形状改变的张量
  • shape (tuple of int) – 新形状

示例

>>> a = torch.arange(4.)
>>> torch.reshape(a, (2, 2))
tensor([[ 0.,  1.],
        [ 2.,  3.]])
>>> b = torch.tensor([[0, 1], [2, 3]])
>>> torch.reshape(b, (-1,))
tensor([ 0,  1,  2,  3])

2. cat操作
在给定的维度上连接给定的张量序列。所有张量必须具有相同的形状(连接维度除外),或者是一个大小为 (0,) 的一维空张量。

torch.cat(tensors, dim=0, *, out=None) → Tensor

参数

  • tensors (sequence of Tensors) – 任何相同类型的张量 Python 序列。提供的非空张量必须具有相同的形状,连接维度除外。
  • dim (int, optional) – 连接张量的维度
    示例
>>> x = torch.randn(2, 3)
>>> x
tensor([[ 0.6580, -1.0969, -0.4614],
        [-0.1034, -0.5790,  0.1497]])
>>> torch.cat((x, x, x), 0)
tensor([[ 0.6580, -1.0969, -0.4614],
        [-0.1034, -0.5790,  0.1497],
        [ 0.6580, -1.0969, -0.4614],
        [-0.1034, -0.5790,  0.1497],
        [ 0.6580, -1.0969, -0.4614],
        [-0.1034, -0.5790,  0.1497]])
>>> torch.cat((x, x, x), 1)
tensor([[ 0.6580, -1.0969, -0.4614,  0.6580, -1.0969, -0.4614,  0.6580,
         -1.0969, -0.4614],
        [-0.1034, -0.5790,  0.1497, -0.1034, -0.5790,  0.1497, -0.1034,
         -0.5790,  0.1497]])

3. squeeze操作
返回一个张量,其中所有指定维度的 input 大小为 1 的维度都被移除。

torch.squeeze(input, dim=None) → Tensor

示例

>>> x = torch.zeros(2, 1, 2, 1, 2)
>>> x.size()
torch.Size([2, 1, 2, 1, 2])
>>> y = torch.squeeze(x)
>>> y.size()
torch.Size([2, 2, 2])
>>> y = torch.squeeze(x, 0)
>>> y.size()
torch.Size([2, 1, 2, 1, 2])
>>> y = torch.squeeze(x, 1)
>>> y.size()
torch.Size([2, 2, 1, 2])
>>> y = torch.squeeze(x, (1, 2, 3))
torch.Size([2, 2, 2])

4、 随机数

4.1随机数发生器配置

1. seed操作
将所有设备上生成随机数的种子设置为非确定性随机数。返回用于为 RNG 播种的 64 位数字。
示例

>>> torch.seed()
269874079427000

2. 手动设置随机数的种子值:manual_seed
设置所有设备上生成随机数的种子。
示例

>>> torch.manual_seed(torch.seed())
<torch._C.Generator object at 0x0000022952198270>

4.2 创建随机张量

1. torch.rand
创建一个张量,其中填充了来自 [0,1) 区间上的均匀分布的随机数。

torch.rand(*size, *, generator=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False, pin_memory=False) → Tensor

参数

  • size (int…) – 定义输出张量形状的整数序列。可以是可变数量的参数或像列表或元组这样的集合。

示例

>>> torch.rand(4)
tensor([ 0.5204,  0.2503,  0.3525,  0.5673])
>>> torch.rand(2, 3)
tensor([[ 0.8237,  0.5781,  0.6879],
        [ 0.3816,  0.7249,  0.0998]])

2. randint
创建一个张量,其中填充了在 low(包含)和 high(不包含)之间均匀生成的随机整数。

torch.randint(low=0, high, size, \*, generator=None, out=None, dtype=None, layout=torch.strided, device=None, requires_grad=False) → Tensor

参数

  • low (int, 可选) – 从分布中抽取的最低整数。默认值:0。
  • high (int) – 从分布中抽取的最高整数加 1。
  • size (tuple) – 定义输出张量形状的元组。

示例

>>> torch.randint(3, 5, (3,))
tensor([4, 3, 4])

>>> torch.randint(10, (2, 2))
tensor([[0, 2],
        [5, 5]])

>>> torch.randint(3, 10, (2, 2))
tensor([[4, 5],
        [6, 7]])

5、张量的保存和加载

1. 保存
将张量保存到磁盘文件。

torch.save(obj, f, pickle_module=pickle, pickle_protocol=DEFAULT_PROTOCOL, _use_new_zipfile_serialization=True)

PyTorch 的常见约定是使用 .pt 文件扩展名保存张量。

参数

  • obj (对象) – 保存的对象
  • f -保存的命名

示例

>>> x = torch.tensor([0, 1, 2, 3, 4])
>>> torch.save(x, "tensor.pt")

2. 加载
从文件中加载使用 torch.save() 保存的对象。

torch.load(f, map_location=None, pickle_module=pickle, *, weights_only=False, mmap=None, **pickle_load_args)

参数

  • f 类文件对象(必须实现 read()、readline()、tell() 和 seek()),或包含文件名的字符串或 os.PathLike 对象
  • map_location (可选[联合[可调用[[Storage, str], Storage], device, str, Dict[str, str]]]) – 一个函数、torch.device、字符串或一个字典,指定如何重新映射存储位置

当在包含 GPU 张量文件上调用torch.load()时,默认情况下,这些张量将加载到 GPU。可以调用torch.load(…, map_location=‘cpu’),然后load_state_dict()来避免在加载模型检查时出现 GPU 内存激增。

load函数的用法较多,可以通过pick_module参数传入自定义的序列化和反序列化的模块,可以通过字节流、文件对象等进行张量加载。详细的用法可以访问官网的API文档进行查看:https://pytorch.ac.cn/docs/stable/generated/torch.load.html#torch.load。

示例

# 加载张量至CPU
>>> torch.load("tensors.pt", map_location=torch.device("cpu"), weights_only=True)
# 加载张量至 GPU 1
>>> torch.load(
...     "tensors.pt",
...     map_location=lambda storage, loc: storage.cuda(1),
...     weights_only=True,
... )  # type: ignore[attr-defined]

6、张量的基础数学计算

张量的数学计算部分主要是包含了逐元素的线性计算、统计信息计算、比较操作、FFT相关的频域操作等等。
在这里插入图片描述
1. 绝对值

torch.abs(input, *, out=None) → Tensor

示例

>>> torch.abs(torch.tensor([-1, -2, 3]))
tensor([ 1,  2,  3])

2. 三角函数相关
cos、acos、sin、asin、tan、atan、atan2等等。
示例

>>> a = torch.randn(4)
>>> a
tensor([-0.5461,  0.1347, -2.7266, -0.2746])
>>> torch.sin(a)
tensor([-0.5194,  0.1343, -0.4032, -0.2711])

3. 统计信息相关
和值sum、均值标准差std_mean、中值median、最大值max、最小值min等等。

>>> a = torch.tensor(
...     [[ 0.2035,  1.2959,  1.8101, -0.4644],
...      [ 1.5027, -0.3270,  0.5905,  0.6538],
...      [-1.5745,  1.3330, -0.5596, -0.6548],
...      [ 0.1264, -0.5080,  1.6420,  0.1992]])
>>> torch.std_mean(a, dim=0, keepdim=True)
(tensor([[1.2620, 1.0028, 1.0957, 0.6038]]),
 tensor([[ 0.0645,  0.4485,  0.8707, -0.0665]]))

7、小结

主要介绍了PyTorch框架中torch包的常用组件,包含张量的创建和基本操作、张量的保存和加载以及随机数、张量的基础数学运算等相关操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-距离的度量方法

文章目录 一. 欧式距离二. 曼哈顿距离三. 切比雪夫距离四. 闵式距离1. p不同取值,表示不同距离2. 当 ( p → ∞ ) ( p \to \infty ) (p→∞) 时&#xff0c;为什么闵式距离变为切比雪夫距离 五. 总结 一. 欧式距离 欧式距离&#xff08;Euclidean distance&#xff09;:多维空…

ComfyUI 矩阵测试指南:用三种方法,速优项目效果

在ComfyUI中&#xff0c;矩阵测试也叫xyz图表测试&#xff0c;作用是通过控制变量的方式来对Lora模型以及各种参数开展测试&#xff0c;并进行有效区分。其中测试方法有很多种&#xff0c;可以通过借助插件也可以自行搭建工作流实现&#xff0c;下面介绍3种方式&#xff1a; 1…

内存与缓存:保姆级图文详解

文章目录 前言1、计算机存储设备1.1、硬盘、内存、缓存1.2、金字塔结构1.3、数据流通过程 2、数据结构内存效率3、数据结构缓存效率 前言 亲爱的家人们&#xff0c;创作很不容易&#xff0c;若对您有帮助的话&#xff0c;请点赞收藏加关注哦&#xff0c;您的关注是我持续创作的…

UllnnovationHub,一个开源的WPF控件库

目录 UllnnovationHub1.项目概述2.开发环境3.使用方法4.项目简介1.WPF原生控件1.Button2.GroupBox3.TabControl4.RadioButton5.SwitchButton6.TextBox7.PasswordBox8.CheckBox9.DateTimePicker10.Expander11.Card12.ListBox13.Treeview14.Combox15.Separator16.ListView17.Data…

【STM32-学习笔记-10-】BKP备份寄存器+时间戳

文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换&#xff08;time.h函数介绍&#xff09;Ⅰ、time()Ⅱ、mktime()…

Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批

文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的…

mongoose 支持https踩坑纪实

简述 mongoose是C编写的嵌入式web服务&#xff0c;它能够支持https协议&#xff0c;可以简单的部署&#xff0c;但要做到完美部署&#xff0c;不是那么容易。 部署方法 本人使用的是最新的7.16版&#xff0c;以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…

深入内核讲明白Android Binder【二】

深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢&#xff1f;2.1 Binder驱动程序为服务创建binder…

玩转大语言模型——使用graphRAG+Ollama构建知识图谱

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用graphRAGOllama构建知识图谱 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…

新星杯-ESP32智能硬件开发--ESP32系统

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; 1、ESP32芯片和系统架构进行描述&#xff0c;给出ESP32系统的地址映射规则。 2、介绍ESP32复位及时钟定时具体功能&#xff0c;方便后续开发。 3、介绍基于ESP32开发板使用的底层操作系统&#xff0c;对ESP32应用程序开…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换

形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀&#xff08;Erosion&#xff09; 腐蚀操作通过消除图像边界来减少图像中的白色区域&#xff08;前景&#xff09;&#xff0c;使物体的边…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI

通义灵码是基于阿里巴巴通义大模型研发的AI 智能编码助手&#xff0c;在通义灵码 1.0 时代&#xff0c;我们针对代码的生成、补全和问答&#xff0c;通过高效果、低时延&#xff0c;研发出了国内最受欢迎的编码助手。 在通义灵码 2.0 发布会上&#xff0c;阿里云通义实验室自然…

Linux网络_套接字_UDP网络_TCP网络

一.UDP网络 1.socket()创建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET网络 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;适用于 IPv4 协议。用于网络通信AF_INET6&#xff1a;IPv6 地址族&a…

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…