深度学习Pytorch-Tensor的属性、算术运算

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
简介: 深度学习Pytorch-Tensor的属性、算术运算

Tensor的属性

  • 每一个Tensor对象都有以下几个属性:torch.dtype、torch.device和torch.layout

1、torch.dtype属性标识了torch.Tensor的数据类型。

2、torch.device属性标识了torch.Tensor对象在创建之后所存储在的设备名称。

torch.device包含了两种设备类型 ('cpu' 或者 'cuda') ,分别标识将Tensor对象储存于cpu内存或者gpu内存中,同时支持指定设备编号,比如多张gpu,可以通过gpu编号指定某一块gpu。 如果没有指定设备编号,则默认将对象存储于current_device()当前设备中;

举个例子, 一个torch.Tensor对象构造函数中的设备字段如果填写'cuda',那等价于填写了'cuda:X',其中X是函数 torch.cuda.current_device()的返回值。在torch.Tensor对象创建之后,可以通过访问torch.device属性实时访问当前对象所存储在的设备名称。构造torch.device可以通过字符串/字符串和设备编号。

3、torch.layout属性标识了torch.Tensor在内存中的布局模式。

现在, 我们支持了两种内存布局模式 torch.strided (dense Tensors) 和尚处试验阶段的torch.sparse_coo (sparse COO Tensors, 一种经典的稀疏矩阵存储方式)。

torch.strided 跨步存储代表了密集张量的存储布局方式,当然也是最常用最经典的一种布局方式。 每一个strided tensor都有一个与之相连的torch.Storage对象, 这个对象存储着tensor的数据。这些Storage对象为tensor提供了一种多维的, 跨步的(strided)数据视图。这一视图中的strides是一个interger整形列表:这个列表的主要作用是给出当前张量的各个维度的所占内存大小,严格的定义就是,strides中的第k个元素代表了在第k维度下,从一个元素跳转到下一个元素所需要跨越的内存大小。 跨步这个概念有助于提高多种张量运算的效率。

Tensor创建实例:

import torch
a = torch.Tensor([[1, 2],[3, 4]])#定义一个2*2的张量,数值为1,2,3,4
print(a)
Out[]: 
tensor([[1., 2.],
        [3., 4.]])
b = torch.Tensor(2, 2)#制定形状2*2
print(b)
Out[]: 
tensor([[6.2106e-42, 0.0000e+00],
        [       nan,        nan]])

稀疏张量实例:

i = torch.tensor([[0, 1, 2], [0, 1, 2]])#非0元素的坐标(0,0)(1,1)(2,2)
v = torch.tensor([1, 2, 3])#非0元素具体的值对应上述坐标
a = torch.sparse_coo_tensor(i, v, (4, 4),
                            dtype=torch.float32,
                            device=dev)
print(a)
Out[]: 
tensor(indices=tensor([[0, 1, 2],
                       [0, 1, 2]]),
       values=tensor([1., 2., 3.]),
       size=(4, 4), nnz=3, layout=torch.sparse_coo)
#转变为稠密张量
i = torch.tensor([[0, 1, 2], [0, 1, 2]])#非0元素的坐标(0,0)(1,1)(2,2)
v = torch.tensor([1, 2, 3])#非0元素具体的值对应上述坐标
a = torch.sparse_coo_tensor(i, v, (4, 4),
                            dtype=torch.float32,
                            device=dev).to_dense()#大小4*4
print(a)
Out[]: 
tensor([[1., 0., 0., 0.],
        [0., 2., 0., 0.],
        [0., 0., 3., 0.],
        [0., 0., 0., 0.]])

Tensor的算术运算

  • 哈达玛积(element wise,对应元素相乘)
  • 二维矩阵乘法运算操作包括torch.mm()、torch.matmul()、@
  • 对于高维的Tensor(dim>2),定义其矩阵乘法仅在最后的两个维度上,要求前面的维度必须保持一致,就像矩阵的索引一样并且运算操作只有torch.matmul()

算术运算实例:add加法、sub减法、mul哈达玛积(乘法)、div除法

import torch
a = torch.rand(2, 3)
b = torch.rand(2, 3)
print(a)
print(b)
print(a + b)
print(a.add(b))
print(torch.add(a, b))
print(a)
print(a.add_(b))#其中,前三种一样,第四种是对 a 进行了修改。
print(a)

1698843395771.jpg

矩阵运算:

##matmul
a = torch.ones(2, 1)#形状
b = torch.ones(1, 2)
print(a @ b)
print(a.matmul(b))
print(torch.matmul(a, b))
print(torch.mm(a, b))
print(a.mm(b))
##高维tensor
a = torch.ones(1, 2, 3, 4)
b = torch.ones(1, 2, 4, 3)
print(a.matmul(b).shape)
out[]:
torch.Size([1, 2, 3, 3])

幂运算pow、指数运算exp、对数运算log、开根号sqrt

a = torch.tensor([1, 2])#数值
print(torch.pow(a, 3))
print(a.pow(3))
print(a**3)
print(a.pow_(3))
print(a)

1698843410986.jpg

Pytorch中的in-place操作

  • “就地”操作,即不允许使用临时变量。
  • 也称为原味操作。
  • x=x+y
  • add_、sub_、mul_等等

Pytorch中的广播机制

  • 广播机制:张量参数可以自动扩展为相同大小
  • 广播机制需要满足两个条件:
  1. 每个张量至少有一个维度
  2. 满足右对齐

A.ndim == B.ndim, 并且A.shape和B.shape对应位置的元素要么相同要么其中一个是1

import torch
a = torch.rand(2, 2)
b = torch.rand(1, 2)
# a, 2*1
# b, 1*2
# c, 2*2
# a = torch.rand(2, 1, 1, 3)
# b = torch.rand(4, 2, 3)
# 2*4*2*3
c = a + b
print(a)
print(b)
print(c)
print(c.shape)

1698843423859.jpg

Tensor的取整/取余运算

  • .floor()向下取整数
  • .ceil()向上取整数
  • .round()四舍五入>=0.5向上取整,<0.5向下取整
  • .trunc()裁剪,只取整数部分
  • .frac()只取小数部分
  • %取余
  • torch.fmod(a, b)除数除以元素的余数;torch.remainder(a, b)张量a每个元素的除法余数

Tensor的比较运算

  • torch.eq(input,other,out=None) #按成员进行等式操作,相同返回True→Tensor
  • torch.equal(tensor1,tensor2) #如果tensor1和tensor2有相同的size和elements,则为True→ bool
  • torch.ge(input,other,out=None) #input>=other,逐个元素比较输入张量input是否大于或等于另外的张量或浮点数other。若大于或等于则返回为True,否则返回False。若张量other无法自动扩展成与输入张量input相同尺寸,则返回为False。→Tensor
  • torch.gt(input,other,out=None) #input>other→Tensor
  • torch.le(input,other,out=None) #input<=other→Tensor
  • torch.lt(input,other,out=None) #input<other→Tensor
  • torch.ne(input,other,out=None) #input!=other不等于→Tensor

Tensor的取前k个大/前k小/第k小的数值及其索引

  • torch.sort(input,dim=None,descending=False,out=None)#对目标input进行排序;维度,对于二维数据:dim=0 按列排序,dim=1 按行排序,默认 dim=1
  • torch.topk(input,k,dim=None,largest=True,sorted=True,out=None)#沿着指定维度返回最大k个数值及其索引值
  • torch.kthvalue(input,k,dim=None,out=None)#沿着指定维度返回第k个最小值及其索引值
##topk,k和维度dim
a = torch.tensor([[2, 4, 3, 1, 5],
                  [2, 3, 5, 1, 4]])
print(a.shape)
print(torch.topk(a, k=1, dim=1, largest=False))
##topk
a = torch.tensor([[2, 4, 3, 1, 5],
                  [2, 3, 5, 1, 4]])
print(a.shape)
print(torch.topk(a, k=2, dim=0, largest=False))

1698843436355.jpg1698843441890.jpg

print(torch.kthvalue(a, k=2, dim=0))
print(torch.kthvalue(a, k=2, dim=1))

1698843450314.jpg

Tensor判定是否为finite/inf/nan

  • torch.isfinite(tensor)/torch.isinf(tensor)/torch.isnan(tensor)
  • 返回一个标记元素是否为finite/inf/nan的mask张量(有界,无界,nan)
相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
PyTorch深度学习 ? 带你从入门到精通!!!
🌟 蒋星熠Jaxonic,深度学习探索者。三年深耕PyTorch,从基础到部署,分享模型构建、GPU加速、TorchScript优化及PyTorch 2.0新特性,助力AI开发者高效进阶。
PyTorch深度学习 ? 带你从入门到精通!!!
|
2月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
159 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
5月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
259 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
9月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
505 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
8月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
2352 5
PyTorch PINN实战:用深度学习求解微分方程
|
9月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
2777 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
机器学习/深度学习 监控 PyTorch
深度学习工程实践:PyTorch Lightning与Ignite框架的技术特性对比分析
在深度学习框架的选择上,PyTorch Lightning和Ignite代表了两种不同的技术路线。本文将从技术实现的角度,深入分析这两个框架在实际应用中的差异,为开发者提供客观的技术参考。
332 7
|
机器学习/深度学习 PyTorch 调度
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型
在深度学习中,学习率作为关键超参数对模型收敛速度和性能至关重要。传统方法采用统一学习率,但研究表明为不同层设置差异化学习率能显著提升性能。本文探讨了这一策略的理论基础及PyTorch实现方法,包括模型定义、参数分组、优化器配置及训练流程。通过示例展示了如何为ResNet18设置不同层的学习率,并介绍了渐进式解冻和层适应学习率等高级技巧,帮助研究者更好地优化模型训练。
865 4
在Pytorch中为不同层设置不同学习率来提升性能,优化深度学习模型

推荐镜像

更多