深度学习框架PyTorch——从入门到精通(2)张量

又名:张亮的一生~~

  • 张量(Tensors)
    • 初始化张量
    • 张量的属性
    • 张量上的操作
    • 与NumPy桥接

张量(Tensors)

张量是一种专门的数据结构,类似Python中的数组或者矩阵。在Torch中,我们使用张量来编码模型的输入和输出,以及模型的参数。

张量类似于NumPy库中的的数据类型:ndarray,只是张量可以在GPU或其他硬件加速器上运行。事实上,张量和NumPy数组通常可以共享相同的底层内存,从而无需复制数据(请参阅Bridge with NumPy)。

张量还针对自动微分进行了优化(我们将在稍后的自动求导部分中看到更多信息)。如果您熟悉ndarray,您将对Tensor API了如指掌。如果没有,请继续学习!

在你使用下面的代码测试之前,请先引入包。

import torch
import numpy as np

初始化张量

张量可以通过各种方式初始化。看看下面的例子:

  • 直接来自数据:张量可以直接从数据中创建。数据类型是自动推断的。
data = [[1, 2],[3, 4]]
x_data = torch.tensor(data)
  • 来自NumPy数组:张量可以从NumPy数组创建(反之亦然-请参阅Bridge with NumPy)。
np_array = np.array(data)
x_np = torch.from_numpy(np_array)
  • 来自另一个张量:除非显式覆盖,否则新张量保留参数张量的属性(形状、数据类型)。
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")
# 他们的输出会像下面这样:
Ones Tensor:tensor([[1, 1],[1, 1]])Random Tensor:tensor([[0.8823, 0.9150],[0.3829, 0.9593]])
  • 具有随机或恒定值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}")# 他们的输出会像下面这样:
Random Tensor:tensor([[0.3904, 0.6009, 0.2566],[0.7936, 0.9408, 0.1332]])Ones Tensor:tensor([[1., 1., 1.],[1., 1., 1.]])Zeros Tensor:tensor([[0., 0., 0.],[0., 0., 0.]])

张量的属性

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

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}")# 他们的输出:
Shape of tensor: torch.Size([3, 4])
Datatype of tensor: torch.float32
# 创建张量默认在cpu上,除非指定设备:tensor = torch.rand(3, 4, device=device)或者使用 .to() 方法移动张量
Device tensor is stored on: cpu

张量上的操作

超过1200种张量运算,包括算术、线性代数、矩阵操作(转置、索引、切片)、采样和更全面的描述在这里。

这些操作中的每一个都可以在CPU和加速器上运行,例如CUDA、MPS、MTIA或XPU。如果您使用Colab,请通过转到运行时>更改运行时类型>GPU来分配加速器。

加速器的含义
在PyTorch存储库中,我们将加速器定义为与CPU一起使用以加快计算速度的设备(torch.device)。这些设备使用异步执行方案,使用torch.Stream和torch.Event作为执行同步的主要方式。我们还假设给定主机上一次只能使用一个这样的加速器。这允许使用当前加速器作为相关概念的默认设备,例如:

  • Pinned Memory(固定内存,也称为页锁定内存)
  • Stream device_type(流设备类型)
  • FSDP(Fully Sharded Data Parallel,全分片数据并行)

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

# 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)
# 输出会像是
First row: tensor([1., 1., 1., 1.])
First column: tensor([1., 1., 1., 1.])
Last column: tensor([1., 1., 1., 1.])
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])
  • 连接张量:您可以使用torch.cat沿给定维度连接张量序列。另请参阅torch. stack,另一个张量连接运算符,与torch.cat略有不同。
t1 = torch.cat([tensor, tensor, tensor], dim=1)
print(t1)
# 输出
tensor([[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.],[1., 0., 1., 1., 1., 0., 1., 1., 1., 0., 1., 1.]])
  • 算术运算
tensor = torch.ones(4, 4)
tensor[:,1] = 0
# 下面的代码是在计算两个张量之间的矩阵乘法,并且 y1、y2、y3 的值将相同
# tensor.T 操作会返回张量 tensor 的转置,@表示矩阵之间的乘法。
y1 = tensor @ tensor.T
# 使用张量的 matmul 方法进行矩阵乘法,同样是 tensor 与它的转置相乘,结果赋值给 y2
y2 = tensor.matmul(tensor.T)y3 = torch.rand_like(y1)
# 使用 torch.matmul 函数进行矩阵乘法,并将结果存储在 y3 中。out 参数指定了结果存储的目标张量
torch.matmul(tensor, tensor.T, out=y3)# 下面的代码是在计算两个张量之间的逐元素乘法,并且 z1、z2、z3 的值将相同
z1 = tensor * tensor
# 使用张量的 mul 方法进行逐元素乘法,将 tensor 与自身逐元素相乘,结果赋值给 z2
z2 = tensor.mul(tensor)z3 = torch.rand_like(tensor)
# 使用 torch.mul 函数进行逐元素乘法,并将结果存储在 z3 中。out 参数指定了结果存储的目标张量
torch.mul(tensor, tensor, out=z3)# 可以在y1y2,y3,z1,z2,z3处一一添加输出,y1,y2,y3是全是3的矩阵,z1,z2,z3就是tensor本身。(因为1*1 = 1 0*0 =0)
  • 单元素张量:如果您有一个单元素张量,例如通过将张量的所有值聚合为一个值,您可以使用item()将其转换为Python数值:
agg = tensor.sum()
agg_item = agg.item()
print(agg_item, type(agg_item))
#输出
12.0 <class 'float'>
  • 就地操作:将结果存储到操作数中的操作称为就地操作。它们由_后缀表示。例如:x.copy_(y)x.t_(),将更改x。
    add_:加,copy_:复制,t_:转置.sub_:减法,mul_:乘法,div_:除法,zero_:变0,fill_:所有元素变为指定元素。

    就地操作可以节省一些内存,但在计算导数时可能会出现问题,因为会立即丢失历史记录。因此,不鼓励使用它们。
    
print(f"{tensor} \n")
tensor.add_(5)
print(tensor)
# 输出
tensor([[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.],[1., 0., 1., 1.]])tensor([[6., 5., 6., 6.],[6., 5., 6., 6.],[6., 5., 6., 6.],[6., 5., 6., 6.]])

与NumPy桥接

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

  • 张量到NumPy数组
t = torch.ones(5)
print(f"t: {t}")
n = t.numpy()
print(f"n: {n}")
# 输出
t: tensor([1., 1., 1., 1., 1.])
n: [1. 1. 1. 1. 1.]
此时,张量的变化会反映在NumPy数组中。
t.add_(1)
print(f"t: {t}")
print(f"n: {n}")
# 输出
t: tensor([2., 2., 2., 2., 2.])
n: [2. 2. 2. 2. 2.]
  • NumPy数组到张量
n = np.ones(5)
t = torch.from_numpy(n)
NumPy数组的变化也反映在张量中。
np.add(n, 1, out=n)
print(f"t: {t}")
print(f"n: {n}")
# 输出
t: tensor([2., 2., 2., 2., 2.], dtype=torch.float64)
n: [2. 2. 2. 2. 2.]

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

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

相关文章

方法之笔,驭繁于简.绘场景之魂——方法论引领支撑透明化项目之航

关注作者 项目建设中痛难点剖析&#xff1a; 01 项目策划有缺失&#xff0c;目标风险难管控 ①目标设定不合理&#xff0c;由于项目移交交底不充分&#xff0c;造成项目建设目标与前期立项论证偏差过大&#xff0c;达不到建设预期&#xff1b; ②风险评估不足&#xff0c;未…

【Apache Storm】

一、Storm简介 1、概述 官网地址&#xff1a;https://storm.apache.org/index.html Apache Storm 是一个开源的、分布式的实时计算系统&#xff0c;专为处理流式数据而设计。它能够处理大量数据流并在极低的延迟下提供实时的结果。相比于传统的批处理系统&#xff0c;Storm 具…

【力扣刷题实战】无重复的最长字串

大家好&#xff0c;我是小卡皮巴拉 文章目录 目录 力扣题目&#xff1a; 无重复的最长字串 题目描述 解题思路 问题理解 算法选择 具体思路 解题要点 完整代码&#xff08;C&#xff09; 兄弟们共勉 &#xff01;&#xff01;&#xff01; 每篇前言 博客主页&#x…

联想扬天M590台式机开机卡LOGO不引导故障维修案例分享

故障描述&#xff1a; 用户送修联想扬天M590台式机到站端维修&#xff0c;说是开机不能正常进系统&#xff1b;站端检测开机后卡LOGO、无法加载引导系统&#xff1b; 故障检修&#xff1a; 插拔内存、插拔硬盘&#xff0c;更换内存、更换硬盘均不能解决此故障&#xff1b;调试…

C++刷题(三):string

&#x1f4dd;前言说明&#xff1a; 本专栏主要记录本人的基础算法学习以及刷题记录&#xff0c;使用语言为C。 每道题我会给出LeetCode上的题号&#xff08;如果有题号&#xff09;&#xff0c;题目&#xff0c;以及最后通过的代码。没有题号的题目大多来自牛客网。对于题目的…

PosterRender 实现微信下程序 分享商品生成海报

PosterRender 是什么 PosterRender 是一种专注于生成高质量海报图像的技术或工具&#xff0c;常用于生成静态图片&#xff0c;特别是适合用于营销、宣传和展示的图形设计。它通常用于在服务端或客户端渲染复杂的图像&#xff0c;包括文字、图形、图标、背景等&#xff0c;生成…

Spring Cloud Stream - 构建高可靠消息驱动与事件溯源架构

一、引言 在分布式系统中&#xff0c;传统的 REST 调用模式往往导致耦合&#xff0c;难以满足高并发和异步解耦的需求。消息驱动架构&#xff08;EDA, Event-Driven Architecture&#xff09;通过异步通信、事件溯源等模式&#xff0c;提高了系统的扩展性与可观测性。 作为 S…

Houdini制作非均匀细分的柱体

近期看见一非均匀细分的做法&#xff0c;觉得不错将其拆开以笔记分享。效果如下&#xff1a; 1.创建Geometry节点&#xff0c;并在该节点内部创建line节点样条线&#xff0c;设置合适长度并添加resample节点。 2.此时若无法看见顶点与顶点编号显示&#xff0c;可按快捷键D&am…

C# Unity 唐老狮 No.10 模拟面试题

本文章不作任何商业用途 仅作学习与交流 安利唐老狮与其他老师合作的网站,内有大量免费资源和优质付费资源,我入门就是看唐老师的课程 打好坚实的基础非常非常重要: Unity课程 - 游习堂 - 唐老狮创立的游戏开发在线学习平台 - Powered By EduSoho C# 1. 内存中&#xff0c;堆和…

Nuxt2 vue 给特定的页面 body 设置 background 不影响其他页面

首先认识一下 BODY_ATTRS 他可以在页面单独设置 head () {return {bodyAttrs: {form: form-body}};},设置完效果是只有这个页面会加上 接下来在APP.vue中添加样式

拥抱健康养生,开启活力生活

在快节奏的现代社会&#xff0c;健康养生不再是一句口号&#xff0c;而是我们对高品质生活的追求。它贯穿于日常的点点滴滴&#xff0c;对我们的身心状态有着深远影响。 饮食养生是基础。秉持均衡原则&#xff0c;每日的餐盘应是色彩斑斓的。新鲜蔬菜富含维生素与膳食纤维&…

Excel(函数篇):COUNTIF与CONUTIFS函数、SUMIF与SUMIFS函数、ROUND函数、MATCH与INDEX函数、混合引用与条件格式

目录 COUNTIF和COUNTIFS函数COUNTIF函数COUNTIFS函数SUMIF和SUMIFS函数SUMIF函数SUMIFS函数SUMIFS函数与控件实现动态年月汇总ROUND、ROUNDUP、ROUNDDOWN函数单元格混合引用条件格式与公式,标记整行数据MATCH和INDEX函数COUNTIF和COUNTIFS函数 COUNTIF函数 统计下“苏州”出现…

深入了解Linux —— git三板斧

版本控制器git 为了我们方便管理不同版本的文件&#xff0c;就有了版本控制器&#xff1b; 所谓的版本控制器&#xff0c;就是能够了解到一个文件的历史记录&#xff08;修改记录&#xff09;&#xff1b;简单来说就是记录每一次的改动和版本迭代的一个管理系统&#xff0c;同…

笔记本电脑关不了机是怎么回事 这有解决方法

在快节奏的现代生活中&#xff0c;笔记本电脑已成为我们工作、学习和娱乐的得力助手。在使用电脑的过程中&#xff0c;笔记本电脑突然关不了机了&#xff0c;怎么回事&#xff1f;下面驱动人生就来讲一讲笔记本电脑不能正常关机的解决方法&#xff0c;有需要的可以来看看。 一、…

Unity打包的WebGL包打不开问题解决方案,以及WebGL包嵌入至Vue2中的步骤

问题描述 在做项目时&#xff0c;需要将Unity做出的场景与Vue2结合&#xff0c;遇到了一些问题&#xff0c;在网上搜了很多解决方案&#xff0c;最终根据下面这篇博客的内容成功解决。解决方案 https://blog.csdn.net/m0_56308072/article/details/135502566注意事项 &#xff…

TW-SOA中的ASE:建模和实验

----翻译自G. Talli , M.J. Adams于2003年发表的论文 摘要 我们提出了一个行波半导体光放大器 &#xff08;TW-SOA&#xff09; 中放大自发辐射 &#xff08;ASE&#xff09; 的模型。所提出的模型考虑了整个 ASE 频谱的传播&#xff0c;还考虑了信号和 ASE 引起的饱和效应。使…

AI编程方法案例:PageRank算法实现

一、算法简单说明 PageRank算法是一种常见的网络权值迭代算法&#xff0c;主要用于诸如互联网网页的质量测度。基本计算原理是根据网页自身的链出将原始权值进行扩散&#xff0c;并通过多轮迭代获得稳定的收敛值来表征网页自身的最终权值。基本计算公式为&#xff1a; 其中R(u…

基于香橙派 KunpengPro学习CANN(3)——pytorch 模型迁移

通用模型迁移适配可以分为四个阶段&#xff1a;迁移分析、迁移适配、精度调试与性能调优。 迁移分析 迁移支持度分析&#xff1a; 准备NPU环境&#xff0c;获取模型的源码、权重和数据集等文件&#xff1b;使用迁移分析工具采集目标网络中的模型/算子清单&#xff0c;识别第三方…

Docker和containerd之概览(Overview of Docker and Containerd)

Docker和containerd之概览 容器本质上就是一个进程。 Namespace是一种逻辑分组机制&#xff0c;允许您将集群资源划分为独立的虚拟环境。每个 Namespace 为资源提供了一个范围&#xff0c;使得不同的团队、应用程序或环境可以在同一集群中共存&#xff0c;而不会相互干扰。 C…

使用OBS进行webRTC推流参考

参考腾讯云官方文档&#xff1a; 云直播 OBS WebRTC 推流_腾讯云 说明非常详细&#xff0c;分为通过WHIP和OBS插件的形式进行推流。 注意&#xff1a;通过OBS插件的形式进行推流需要使用较低的版本&#xff0c;文档里有说明&#xff0c;需要仔细阅读。