PyTorch使用教程(2)-torch包

news2025/3/1 18:08:36

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包的常用组件,包含张量的创建和基本操作、张量的保存和加载以及随机数、张量的基础数学运算等相关操作。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

idea gradle compiler error: package xxx does not exist

idea 编译运行task时报项目内的包不存在&#xff0c;如果你试了网上的其它方法还不能解决&#xff0c;应该是你更新了新版idea&#xff0c;项目用的是旧版jdk&#xff0c;请在以下编译器设置中把项目JDK字节码版本设为8&#xff08;jdk1.8&#xff0c;我这里是17请自行选择&…

Nmap之企业漏洞扫描(Enterprise Vulnerability Scanning for Nmap)

简介 Namp是一个开源的网络连接端扫描软件&#xff0c;主要用于网络发现和安全审核。‌它可以帮助用户识别网络上的设备、分析它们的服务、检测操作系统类型&#xff0c;甚至发现潜在的安全漏洞。Nmap由Fyodor开发&#xff0c;最初是为了满足网络管理员的需求&#xff0c;但随…

RabbitMQ前置概念

文章目录 1.AMQP协议是什么&#xff1f;2.rabbitmq端口介绍3.消息队列的作用和使用场景4.rabbitmq工作原理5.整体架构核心概念6.使用7.消费者消息推送限制&#xff08;work模型&#xff09;8.fanout交换机9.Direct交换机10.Topic交换机&#xff08;推荐&#xff09;11.声明队列…

RabbitMQ---TTL与死信

&#xff08;一&#xff09;TTL 1.TTL概念 TTL又叫过期时间 RabbitMQ可以对队列和消息设置TTL&#xff0c;当消息到达过期时间还没有被消费时就会自动删除 注&#xff1a;这里我们说的对队列设置TTL,是对队列上的消息设置TTL并不是对队列本身&#xff0c;不是说队列过期时间…

MySQL8数据库全攻略:版本特性、下载、安装、卸载与管理工具详解

大家好&#xff0c;我是袁庭新。 MySQL作为企业项目中的主流数据库&#xff0c;其5.x和8.x版本尤为常用。本文将详细介绍MySQL 8.x的特性、下载、安装、服务管理、卸载及管理工具&#xff0c;旨在帮助用户更好地掌握和使用MySQL数据库。 1.MySQL版本及下载 企业项目中使用的…

хорошо哈拉少wordpress俄语主题

хорошо哈拉少wordpress俄语主题 wordpress俄文网站模板&#xff0c;推荐做俄罗斯市场的外贸公司建俄语独立站使用。 演示 https://www.jianzhanpress.com/?p7360

【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()…

Python毕业设计选题:基于python的酒店推荐系统_django+hadoop

开发语言&#xff1a;Python框架&#xff1a;djangoPython版本&#xff1a;python3.7.7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;PyCharm 系统展示 管理员登录 管理员功能界面 用户管理 酒店客房管理 客房类型管理 客房预定管理 用户…

【c++继承篇】--继承之道:在C++的世界中编织血脉与传承

目录 引言 一、定义二、继承定义格式2.1定义格式2.2继承关系和访问限定符2.3继承后子类访问权限 三、基类和派生类赋值转换四、继承的作用域4.1同名变量4.2同名函数 五、派生类的默认成员构造函数5.1**构造函数调用顺序&#xff1a;**5.2**析构函数调用顺序&#xff1a;**5.3调…

Elasticsearch:Jira 连接器教程第二部分 - 6 个优化技巧

作者&#xff1a;来自 Elastic Gustavo Llermaly 将 Jira 连接到 Elasticsearch 后&#xff0c;我们现在将回顾最佳实践以升级此部署。 在本系列的第一部分中&#xff0c;我们配置了 Jira 连接器并将对象索引到 Elasticsearch 中。在第二部分中&#xff0c;我们将回顾一些最佳实…

【狂热算法篇】探秘图论之 Floyd 算法:解锁最短路径的神秘密码(通俗易懂版)

&#xff1a; 羑悻的小杀马特.-CSDN博客羑悻的小杀马特.擅长C/C题海汇总,AI学习,c的不归之路,等方面的知识,羑悻的小杀马特.关注算法,c,c语言,青少年编程领域.https://blog.csdn.net/2401_82648291?spm1010.2135.3001.5343 在本篇文章中&#xff0c;博主将带大家去学习所谓的…

npm的包管理

从哪里下载包 国外有一家 IT 公司&#xff0c;叫做 npm,Inc.这家公司旗下有一个非常著名的网站: https://www.npmjs.com/&#xff0c;它是全球最大的包共享平台&#xff0c;你可以从这个网站上搜索到任何你需要的包&#xff0c;只要你有足够的耐心!到目前位置&#xff0c;全球约…

GitLab:添加SSH密钥之前,您不能通过SSH来拉取或推送项目代码

1、查看服务器是否配置过 [rootkingbal-ecs-7612 ~]# cd .ssh/ [rootkingbal-ecs-7612 .ssh]# ls authorized_keys id_ed25519 id_ed25519.pub id_rsa id_rsa.pub2、创建密钥 $ ssh-keygen -t rsa -C kingbalkingbal.com # -C 后写你的邮箱 一路回车 3、复制密钥 [rootk…

为ARM64架构移植Ubuntu20.04换源的发现

在为ARM64架构(RK3566)移植ubuntu20.04的时候发现在更换为国内源之后&#xff0c;无法正常完成apt update,报错为: Ign:25 http://mirrors.aliyun.com/ubuntu focal-updates/main arm64 Packages …

LARGE LANGUAGE MODELS ARE HUMAN-LEVEL PROMPT ENGINEERS

题目 大型语言模型是人类级别的提示工程师 论文地址&#xff1a;https://arxiv.org/abs/2211.01910 项目地址&#xff1a;https://github.com/keirp/automatic_prompt_engineer 摘要 通过对自然语言指令进行调节&#xff0c;大语言模型 (LLM) 显示了作为通用计算机的令人印象深…

Redisson发布订阅学习

介绍 Redisson 的消息订阅功能遵循 Redis 的发布/订阅模式&#xff0c;该模式包括以下几个核心概念&#xff1a; 发布者&#xff08;Publisher&#xff09;&#xff1a;发送消息到特定频道的客户端。在 Redis 中&#xff0c;这通过 PUBLISH 命令实现。 订阅者&#xff08;Sub…

git操作(Windows中GitHub)

使用git控制GitHub中的仓库版本&#xff0c;并在Windows桌面中创建与修改代码&#xff0c;与GitHub仓库进行同步。 创建自己的GitHub仓库 创建一个gen_code实验性仓库用来学习和验证git在Windows下的使用方法&#xff1a; gen_code仓库 注意&#xff0c;创建仓库时不要设置…

【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接

背景 当服务器建立好节点&#xff0c;一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的&#xff0c;所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接&#xff01; sudo apt update sudo apt in…

KubeSphere部署安装,接入KubeKey安装的k8s集群

KubeSphere安装接入KubeKey安装的k8s集群 文章目录 KubeSphere安装接入KubeKey安装的k8s集群 一.NFS安装配置1.服务器安装NFS服务2.下载并部署 NFS Subdir External Provisioner1).下载部署文件2).创建 NameSpace3).创建 RBAC 资源4).配置 deployment.yaml5).部署 Storage Clas…

基于智能物联网的肉鸡舍控制器:设计、实施、性能评估与优化

英文标题&#xff1a; Smart IoT-Based Broiler Room Controller: Design, Implementation, Performance Evaluation, and Optimization 作者信息 Shamsu Sabo Department of Computer Science, National Open University of Nigeria, Fagge Study Center, Nigeria Email: 144…