谈到深度学习,必然绕不开的便是张量(tensor),无论是图像处理、目标检测、亦或是NLP,输入到模型里训练的都是一个个张量。张量,在形式上与线性代数里面讲过的矩阵相似,但又不一样,因为张量可以在3维甚至更高维度上进行计算等操作,基本上所有深度学习模型的神经网络层(线性变换层、激活函数层等)都可以表示为张量的操作与运算,由此可见张量的重要性,那么现在就让我们在这篇笔记里一起了解一下关于torch.tensor的那些事吧!
一、张量的数据类型
Pytorch中的张量一共支持9中数据类型,它们分别如下表所示:
数据类型 | Pytorch类型 | CPU上的张量 | GPU上的张量 |
32位浮点数 | torch.float32 torch.float | torch.FloatTensor | torch.cuda.FloatTensor |
64位浮点数 | torch.float64 torch.double | torch.DoubleTensor | torch.cuda.DoubleTensor |
16位浮点数 | torch.float16 torch.half | torch.HalfTensor | torch.cuda.HalfTensor |
8位无符号整数 | torch.uint8 | torch.ByteTensor | torch.cuda.ByteTensor |
8位带符号整数 | torch.int8 | torch.CharTensor | torch.cuda.CharTensor |
16位带符号整数 | torch.int16 torch.short | torch.ShortTensor | torch.cuda.ShortTensor |
32位带符号整数 | torch.int32 torch.int | torch.IntTensor | torch.cuda.IntTensor |
64位带符号整数 | torch.int64 torch.long | torch.LongTensor | torch.cuda.LongTensor |
布尔型 | torch.bool | torch.BoolTensor | torch.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)
好了,这篇笔记就介绍到这里啦,之后我们再一起探索关于张量维度以及拼接、切割的方法~