【PyTorch学习笔记 - 01】 Tensors(张量)

最近项目需要优化一下目标检测网络,在这个过程中发现还是得增加对框架底层的掌握才可行。于是准备对pytorch的一些基本概念做一些再理解。参考PyTorch的wiki,对自己的学习过程做个记录。

Tensors 是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量对模型的输入、输出以及模型参数进行编码。

张量类似于 NumPy 的 ndarray不同之处在于张量可以在 GPU 或其他硬件加速器上运行。事实上,张量和 NumPy 数组通常可以共享相同的底层内存,从而无需复制数据。张量还针对自动求导进行了优化。如果你熟悉 ndarray,那么使用张量 API 会得心应手。如果不熟悉,也别担心,跟着学就行!

import torch
import numpy as np

一、怎么初始化 Tensors

张量可以通过多种方式初始化。

1.直接从数据中获取
张量可以直接从数据创建。数据类型会自动推断。

data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)

2.从NumPy数组
张量可以从NumPy数组创建:

np_array = np.array(data)
x_np = torch.from_numpy(np_array)

3.从另一个张量:
新的张量将保留参数张量的属性(形状、数据类型),除非被显式覆盖。

x_ones = torch.ones_like(x_data) # retains the properties of x_data
print(f"Ones Tensor: \n {x_ones} \n")x_rand = torch.rand_like(x_data, dtype=torch.float) # overrides the datatype of x_data
print(f"Random Tensor: \n {x_rand} \n")

4.使用随机值或常数值:
shape 是张量维度的元组。在以下函数中,它决定了输出张量的维度。

shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)print(f"Random Tensor: \n {rand_tensor} \n")
print(f"Ones Tensor: \n {ones_tensor} \n")
print(f"Zeros Tensor: \n {zeros_tensor}")

二、张量的属性

张量属性描述了它们的形状、数据类型以及存储它们的设备。

tensor = torch.rand(3,4)
print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}")

在这里插入图片描述

三、张量运算

这里全面介绍了1200多种张量运算,包括算术运算、线性代数、矩阵操作(转置、索引、切片)、采样等等。

这些操作中的每一项都可以在CPU和加速器(如CUDA、MPS、MTIA或XPU)上运行。

默认情况下,张量是在CPU上创建的。我们需要使用.to方法(在检查加速器可用性之后)显式地将张量移动到加速器上。wiki提醒,跨设备复制大张量在时间和内存方面的开销可能很大

# We move our tensor to the current accelerator if available
if torch.accelerator.is_available():tensor = tensor.to(torch.accelerator.current_accelerator())

在这里插入图片描述

尝试列表中的一些操作。如果你熟悉NumPy API,那么使用Tensor API对你来说将轻而易举。

标准的类似numpy的索引和切片操作:

tensor = torch.ones(4, 4)
print(f"First row: {tensor[0]}")
print(f"First column: {tensor[:, 0]}")
print(f"Last column: {tensor[..., -1]}")
tensor[:,1] = 0
print(tensor)

拼接张量 你可以使用 torch.cat 沿着给定维度拼接一系列张量。另请参阅 torch.stack,这是另一个与 torch.cat 略有不同的张量拼接操作符

t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)

算术运算

# This computes the matrix multiplication between two tensors. y1, y2, y3 will have the same value
# ``tensor.T`` returns the transpose of a tensor
y1 = tensor @ tensor.T
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(y1)
torch.matmul(tensor, tensor.T, out=y3)# This computes the element-wise product. z1, z2, z3 will have the same value
z1 = tensor * tensor
z2 = tensor.mul(tensor)z3 = torch.rand_like(tensor)
torch.mul(tensor, tensor, out=z3)

单元素张量 如果你有一个单元素张量,例如通过将张量的所有值聚合为一个值,你可以使用 item() 将其转换为Python数值:

agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))

原地操作将结果存储到操作数中的操作称为原地操作。它们以 _ 后缀表示。例如:x.copy_(y)x.t_() 会改变 x

print(f"{tensor} \n")
tensor.add_(5)
print(tensor)

就地操作节省了一些内存,但在计算导数时可能会出现问题,因为会立即丢失历史信息。因此,不建议使用它们。节省了一些内存,但在计算导数时可能会出现问题,因为会立即丢失历史信息。因此,不建议使用它们。

四、与NumPy的桥接

CPU 上的张量和 NumPy 数组可以共享它们的底层内存位置,改变其中一个也会改变另一个。

t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")

张量的变化会反映在NumPy数组中。

t.add_(1)
print(f"t: {t}")
print(f"n: {n}")

NumPy数组转换为张量

n = np.ones(5)
t = torch.from_numpy(n)

NumPy数组中的变化会反映在张量中。

张量转换为NumPy数组

这是YOLO12推理时,将后端可视化的操作。将Tensor格式的检测结果,从gpu取到cpu上,转为numpy数组。
在这里插入图片描述
再使用opencv的函数进行检测结果可视化(检测框绘制和标签绘制)。
在这里插入图片描述
最终的结果如下图:
在这里插入图片描述

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

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

相关文章

【C/C++】(struct test*)0->b 讲解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、什么是结构体成员的偏移量? 二、为什么需要计算偏移量? 三、如何计算偏移量? 四、总结 一、什么是结构体成员的偏移量&#…

使用Pytest进行接口自动化测试(三)

(一)YAML 之前在项目中,我们也是用过YAML来做配置文件,他用于以人类可读的形式存储信息, 特点: 一种简易的可读语言,用于人和计算机交换数据 通常用来存储配置信息 跟python类似&…

算法训练营day46 647. 回文子串、516.最长回文子序列、动态规划总结篇

今天是动态规划的最后一篇内容了,本篇主要是针对回文字符串这种“与众不同”的递推规律来进行讲解 647. 回文子串 统计并返回这个字符串中 回文子串 的数目 暴力解法 两层for循环,遍历区间起始位置和终止位置,然后还需要一层遍历判断这个区…

Qt界面优化

1.QSS在网页前端开发领域中,CSS 是一个至关重要的部分,描述了一个网页的 “样式”,从而起到对网页美化的作用。所谓样式,包括不限于大小、位置、颜色、背景、间距、字体等等。网页开发作为 GUI 的典型代表,也对于其他客…

week1+2+3

408 计组 1.基本组成2.数据的表示和运算定点数:把数字分为定点整数和定点小数分开存储 浮点数:用科学计数法存储 原码 -全部取反-> 反码 反码 1->补码 补码 -符号位取反->移码带余除法:设x,m∈Z,m>0则存在唯一的整数q…

java8中javafx包缺少报错

今天拉取一个jdk1.8的项目里面有一个代码用到了javafx,这个我记得是jdk中的包,正常不应该报错的。然后发现jdk中还真没有,查了一下是因为版本问题。 Java 8 及之前:Oracle JDK 自带 JavaFX,OpenJDK 通常不包含Java 9 …

day072-代码检查工具-Sonar与maven私服-Nexus

文章目录0. 老男孩思想-选对池塘钓美人鱼1. 代码回滚方案2. SonarQube2.1 代码检查工具2.2 部署sonarqube2.2.1 软件要求2.2.2 安装软件2.2.3 启动sonar2.2.4 部署插件2.3 sonar检查java代码2.3.1 创建sona项目2.3.2 分析java代码2.3.3 Jenkins结合sonar检查代码2.4 sonar检查非…

【前端基础】15、列表元素、表格元素、表单元素(注:极其粗略的记载。)

一、列表元素 1、什么是列表元素2、有序列表(ol、li) ol有序列表 直接子元素只能是li。 li列表中的每一项。3、无序列表(ul、li) ol无序列表 直接子元素只能是li。 li列表中的每一项。4、定义列表(dl、dt、dd&#xff…

IRFBG30PBF Vishay威世MOSFET场效应管

IRFBG30PBF Vishay威世:超快MOSFET 场效应管一、产品定位IRFBG30PBF 是Vishay威世推出的600V/30A N沟道功率MOSFET,采用第五代TrenchFET技术,专为开关电源、电机驱动、新能源逆变器等高功率场景设计。以85mΩ超低导通电阻和超快反向恢复&…

【07-AGI的讨论】

AI ANI:artificial narrow intelligence; 如 智能音箱;自动驾驶汽车,网络搜索,其他用于专业特定事项的工具; AGI:artificial general intelligence; building AI systems that could do anything a typical…

[激光原理与应用-225]:机械 - 3D图与2D图各自的作用

在机械设计与加工领域,3D图和2D图是两种核心的工程表达方式,它们在产品设计、制造、装配及维护等环节中扮演不同角色,具有互补性。以下是它们各自的作用及具体应用场景的详细解析:一、3D图的作用1. 直观展示产品全貌三维可视化&am…

【从零开始java学习|第一篇】java中的名词概念(JDK、JVM、JRE等等)

目录 一、核心运行环境三要素(JVM/JRE/JDK) 二、常用开发指令(JDK 自带工具) 三、一些其他概念 四、总结核心逻辑链 要入门 Java,理解核心概念之间的关系是基础。以下是 Java 中最核心的基础概念、工具及相关名词的…

UVa12345 Dynamic len(set(a[L:R]))

[TOC](UVa12345 Dynamic len(set(a[L:R]))) 题目链接 UVA - 12345 Dynamic len(set(a[L:R])) 题意 有编号从 0 到 n−1 的 n 个数,有两种操作: Q L R 询问编号 L 到编号 R−1 的数中有多少个不同的数字。M X Y 将编号为 X 的数字改为 Y。 你的任务就是…

[Ubuntu] VNC连接Linux云服务器 | 实现GNOME图形化

将桌面环境修改为 GNOME 并通过 VNC 远程访问的步骤 & TightVNC 的安装与配置说明:1. 安装 GNOME 桌面环境 sudo apt update sudo apt install ubuntu-gnome-desktop -y2. 安装 TightVNC 服务器 sudo apt install tightvncserver -y3. 初始化 VNC Server 并设置…

进程、网络通信方法

一、进程间通信(IPC)方法 适用于同一台主机上的进程间数据交换。 管道(Pipe) 匿名管道:单向通信,仅用于父子进程。 命名管道(FIFO):通过文件系统路径访问,支持无亲缘关系进程。 消息队列(Message Queue) 结构化消息(类型+数据),按类型读取,支持异步通信。…

[激光原理与应用-241]:设计 - 266n皮秒深紫外激光器,哪些因素影响激光器紫外光的输出功率?

一、短期稳定性266nm皮秒深紫外激光器紫外光输出功率的稳定性受非线性晶体性能、光学系统设计、热管理效果、重复频率与脉冲能量匹配度、环境干扰控制等因素影响,具体分析如下:1. 非线性晶体性能晶体选择与状态:BBO(偏硼酸钡&…

Django配置sqllite之外的数据库

当连接到其他数据库后端时,如 MariaDB、MySQL、Oracle 或 PostgreSQL,将需要额外的连接参数。请参阅下面的 ENGINE 配置,了解如何指定其他数据库类型。这个例子是针对 PostgreSQL: 在django项目的settings.py文件里,关…

银河通用招人形机器人强化学习算法工程师了

人形强化学习算法工程师(26届)(岗位信息已通过jobleap.cn授权,可在csdn发布)银河通用机器人 北京收录时间: 2025年08月11日职位描述1. 研发基于深度强化学习的足式机器人运动控制算法,提升机器…

使用MongoDB存储和计算距离

一、MongoDB 计算距离的优势 优势说明原生地理空间索引支持 2dsphere 索引,高效处理地理坐标查询(毫秒级响应)。内置地理计算函数提供 $near、$geoWithin、$geoNear 等操作符,无需手动实现复杂计算。高性能基于B树索引优化&#…

鸿蒙开发-ArkUI中@Type作用详细解答

在鸿蒙(HarmonyOS)应用开发中,Type 是 ArkUI 框架中用于 类型定义和类型检查 的关键注解(装饰器)。它的主要作用是为自定义组件的属性提供明确的类型约束,确保数据传递的类型安全性。 核心作用解析&#xf…