关于torch.tensor(张量)的那些事(一)

本文详细介绍了张量在深度学习中的重要性,探讨了PyTorch中张量的数据类型、创建方法,以及如何正确使用GPU存储和运算张量,包括torch.tensor的使用和设备管理技巧。
摘要由CSDN通过智能技术生成

        谈到深度学习,必然绕不开的便是张量(tensor),无论是图像处理、目标检测、亦或是NLP,输入到模型里训练的都是一个个张量。张量,在形式上与线性代数里面讲过的矩阵相似,但又不一样,因为张量可以在3维甚至更高维度上进行计算等操作,基本上所有深度学习模型的神经网络层(线性变换层、激活函数层等)都可以表示为张量的操作与运算,由此可见张量的重要性,那么现在就让我们在这篇笔记里一起了解一下关于torch.tensor的那些事吧!


一、张量的数据类型

        Pytorch中的张量一共支持9中数据类型,它们分别如下表所示:

数据类型Pytorch类型CPU上的张量GPU上的张量
32位浮点数

torch.float32

torch.float

torch.FloatTensortorch.cuda.FloatTensor
64位浮点数

torch.float64

torch.double

torch.DoubleTensortorch.cuda.DoubleTensor
16位浮点数

torch.float16

torch.half

torch.HalfTensortorch.cuda.HalfTensor
8位无符号整数torch.uint8torch.ByteTensortorch.cuda.ByteTensor
8位带符号整数torch.int8torch.CharTensortorch.cuda.CharTensor
16位带符号整数

torch.int16

torch.short

torch.ShortTensortorch.cuda.ShortTensor
32位带符号整数

torch.int32

torch.int

torch.IntTensortorch.cuda.IntTensor
64位带符号整数

torch.int64

torch.long

torch.LongTensortorch.cuda.LongTensor
布尔型torch.booltorch.BoolTensortorch.cuda.BoolTensor

         下面我们创建一个张量一起来看一下吧!

import torch
x = torch.tensor([1,2,3,4]) #创建一个一维张量x=[1,2,3,4]
print(x,x.dtype) #打印张量x并查看它的数据类型

         运行后的结果为:

tensor([1, 2, 3, 4]) torch.int64

        当然,我们可以在创建张量的时候可以直接指定数据类型:

import torch
import numpy as np
x = np.array(range(10)) #创建一个numpy数组x
print(x,x.dtype) #查看x及其数据类型 打印结果为“[0 1 2 3 4 5 6 7 8 9] int32”
y = torch.tensor(x, dtype = torch.float32) #将x转换为张量y,指定数据类型为32位浮点数
print(y,y.dtype) #查看y及其数据类型 打印结果为“tensor([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.]) torch.float32”

        上面代码中展示了torch.tensor的另外一个功能就是可以直接将numpy创建的数组转换为张量,从打印结果可以看出两者的不同,大家快去试试吧! 


二、张量的创建方式

        在深度学习的训练中初始化模型时,我们往往需要对一些张量进行初始值的设定,也即创建一个新的张量,而torch为我们提供了6种常用的创建张量的方法:

torch.rand()--生成元素服从[0,1]的均匀分布张量

torch.rand(2,3,4) #随机生成一个(2,3,4)形状的三维张量,生成元素服从[0,1]的均匀分布

torch.randn()--生成元素服从标准正态分布张量

#随机生成一个形状为(3,4,5)的三维张量,并指定元素为整数
torch.randn(3,4,5).to(torch.int) #生成元素服从标准正态分布

torch.randint()--生成指定形状的整数张量

#生成一个形状为(2,4,3)的三维张量,元素是大小在(0,10)的整数
torch.randint(0,10,(2,4,3))#前两个参数指定生成元素的大小范围,最后的参数指定张量形状

torch.ones()--生成元素全为1的张量

#生成一个值全为1的张量
torch.ones(3,4)

torch.eye()--生成单位矩阵张量

#生成一个单位矩阵(对角线值全为1的二维张量)
torch.eye(3)

torch.zeros()--生成元素全为0的张量

#生成一个值全为 0 的张量
torch.zeros(4,2,4,3)

三、张量的存储设备

        在深度学习的训练进行张量的计算(例如相乘、相加、拼接等等)时,我们常会用到GPU加速,这时候需要注意进行运算的两个或多个张量需要存储在同一个设备中才可以正常进行运算,例如下图中的错误便是一个张量在“cuda:0”的GPU上,而另一个张量则在CPU上,这时候就会报错“RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!”

        为了避免这类错误,我们在 训练时需要指定需要计算的张量所在的设备:

#创建一个(3,4)的张量x,并将其存储到GPU上
x = torch.randn(3,4, device="cuda:0") 
#创建一个(4,5)的张量y,不指定其设备
y = torch.rand(4,5)
#计算x与y相乘时,我们可以将y移动到x所在的设备上然后再进行运算
x_y = x @ y.to(x.device)

        好了,这篇笔记就介绍到这里啦,之后我们再一起探索关于张量维度以及拼接、切割的方法~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦雨无痕Mac

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值