深度学习03:PyTorch的数据类型Tensor
Posted 夏天是冰红茶
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习03:PyTorch的数据类型Tensor相关的知识,希望对你有一定的参考价值。
目录
torch.unsqueeze()和torch.squeeze()
PyTorch的数据类型:Tensor
Tensor,即张量,它是PyTorch中基本的操作对象,简单的理解就是多维矩阵。Tensors与Numpy中的 ndarrays类似,但是在PyTorch中 Tensors 可以使用GPU进行计算。
函数查找
每个章节涉及的函数已经归纳在下方,可以随时查找用法。
一、Tensor的创建
torch.Tensor() | torch.DoubleTensor() |
torch.FloatTensor() | torch.IntTensor() |
torch.zeros() | torch.ones() |
torch.eye() | torch.randn() |
torch.empty() | torch.randperm() |
torch.**_like() torch.ones_like() torch.zeros_like() torch.rand_like() | torch.range() |
torch.full() |
二、Tensor的运算
2.1 张量元素比较
torch.allclose() | torch.eq() |
torch.equal() | torch.ge() |
torch.gt() | torch.le() |
torch.lt() | torch.ne() |
torch.isnan() |
2.2 基本运算
torch.pow() | torch.exp() |
torch.log() | torch.sqrt() |
torch.rsqrt() | torch.clamp_max() |
torch.clamp_min() | torch.clamp() |
torch.linspace() | torch.matmul() |
torch.t() | torch.inverse() |
2.3 统计相关计算
torch.max() | torch.argmax() |
torch.min() | torch.argmin() |
torch.mean() | torch.sum() |
torch.cumsum() | torch.median() |
torch.std() | torch.cumprod() |
torch.sort() | torch.topk() |
torch.kthvalue() |
2.4 其他的一些函数
torch.abs() | torch,div() |
torch.add() | torch.mm() |
torch.mv() |
三、Tensor的操作
(1)改变张量的形状
torch.reshape() | A.resize_() |
torch.squeeze() | torch.unsqueeze() |
(2)获取张量中的元素
torch.where() | torch.tril() |
torch.triu() | torch.diag() |
(3)拼接与拆分
torch.cat() | torch.stack() |
torch.chunk() | torch.split() |
四、NumPy 转换
torch.from_numpy() | torch.numpy() |
一、Tensor的创建
#创建指定大小
torch.Tensor(3.2,2.4)
#指定类型
torch.DoubleTensor(3,2)
torch.FloatTensor([2,3,4,5])
torch.IntTensor(2,2)
#列表生成
torch.Tensor([1,2],[2,3])
#0矩阵
torch.zeros(3,2)
#1矩阵
torch.ones(3,2)
#对角1矩阵
torch.eye(2,2)
#创建一个未被初始化数值的张量
torch.empty(2,2)
#随机张量
torch.randn(2,2)
#随机排列张量
torch.randperm(5)
#生成与D同样大小和类型的张量
torch.**_like(D)
#比如:
torch.ones_like(D)
torch.zeros_like(D)
torch.rand_like(D)
#——与torch.randn一样生成的是标准正态分布的随机张量
#生成某一范围的张量
torch.range(1,20,2)
#起始——终止——步长
#0.25全填充
torch.full((3,3),fill_value=0.25)
二、Tensor的运算
2.1 张量元素比较
#比较两个元素是否接近
torch.allclose()
#逐元素比较是否相等
torch.eq()
#判断两个张量是否具有相同的形状和元素
torch.equal()
#逐元素比较大于等于
torch.ge()
#逐元素比较大于
torch.gt()
#逐元素比较小于等于
torch.le()
#逐元素比较小于
torch.lt()
#逐元素比较不等于
torch.ne()
#判断是否为缺失值
torch.isnan()
在这里,只需要知道就可以了,如果有需要的时候可以翻书和查函数手册。
2.2 基本运算
张量的基本运算方式,一种是逐元素之间的运算,如加减乘除、幂运算、平方根、对数、数据裁剪等;另一种为矩阵之间的运算,如矩阵相乘、矩阵的转置、矩阵的迹等。
2.2.1 逐元素加减乘除
import torch
A=torch.arange(6.0).reshape(2,3)
B=torch.linspace(10,20,steps=6).reshape(2,3)
print("A:",A)
print("B:",B)
C=A+B
print("逐元素相加:",C)
D=A-B
print("逐元素相减:",D)
E=A*B
print("逐元素相乘:",E)
F=B//A
print("逐元素整除:",F)
A: tensor([[0., 1., 2.], [3., 4., 5.]]) B: tensor([[10., 12., 14.], [16., 18., 20.]]) 逐元素相加: tensor([[10., 13., 16.], [19., 22., 25.]]) 逐元素相减: tensor([[-10., -11., -12.], [-13., -14., -15.]]) 逐元素相乘: tensor([[ 0., 12., 28.], [ 48., 72., 100.]]) 逐元素整除: tensor([[inf, 12., 7.], [ 5., 4., 4.]])
2.2.2 幂运算
计算张量的幂可以使用torch.pow(),或者**运算
print(torch.pow(A,3))
print(A**3)
tensor([[ 0., 1., 8.], [ 27., 64., 125.]]) tensor([[ 0., 1., 8.], [ 27., 64., 125.]])
2.2.3 指数对数运算
#计算张量的指数
torch.exp(A)
#计算张量的对数
torch.log(A)
tensor([[ 1.0000, 2.7183, 7.3891], [ 20.0855, 54.5981, 148.4132]])tensor([[ -inf, 0.0000, 0.6931], [1.0986, 1.3863, 1.6094]])
2.2.4 平方根及其倒数
#计算张量的平方根
print(torch.sqrt(A))
print(A**0.5)
#计算张量的平方根倒数
print(torch.rsqrt(A))
print(1 / (A**0.5))
tensor([[0.0000, 1.0000, 1.4142], [1.7321, 2.0000, 2.2361]]) tensor([[0.0000, 1.0000, 1.4142], [1.7321, 2.0000, 2.2361]]) tensor([[ inf, 1.0000, 0.7071], [0.5774, 0.5000, 0.4472]]) tensor([[ inf, 1.0000, 0.7071], [0.5774, 0.5000, 0.4472]])
2.2.5 数据的裁剪
#根据最大值裁剪
print(torch.clamp_max(A,4))
#根据最小值裁剪
print(torch.clamp_min(A,3))
#根据范围裁剪
print(torch.clamp(A,2.5,4))
tensor([[0., 1., 2.], [3., 4., 4.]]) tensor([[3., 3., 3.], [3., 4., 5.]]) tensor([[2.5000, 2.5000, 2.5000], [3.0000, 4.0000, 4.0000]])
2.2.6 矩阵的运算
#矩阵的转置
C=torch.t(A)
print("矩阵的转置",C)
#矩阵相乘,A的行数要等于C的列数
print("矩阵相乘",A.matmul(C))
矩阵的转置 tensor([[0., 3.], [1., 4.], [2., 5.]]) 矩阵相乘 tensor([[ 5., 14.], [14., 50.]])
若A x B = I,I为单位矩阵,则可称A和B互为逆矩阵;一个方阵中,对角线元素的和称为矩阵的迹。
C=torch.rand(3,3)
#矩阵的逆
D=torch.inverse(C)
print("C:",C,"\\n","D:",D)
#矩阵的迹
torch.trace(torch.arange(9.0).reshape(3,3))
C: tensor([[0.9020, 0.8445, 0.5127], [0.4689, 0.5106, 0.8877], [0.7195, 0.3104, 0.5277]]) D: tensor([[-0.0288, -1.3566, 2.3101], [ 1.8526, 0.5072, -2.6532], [-1.0505, 1.5515, 0.3060]])tensor(12.)
2.3 统计相关计算
#计算张量中的最大值
torch.max()
#计算张量中的最大值位置
torch.argmax()
#计算张量中的最小值
torch.min()
#计算张量中的最小值位置
torch.argmin()
- torch.mean() #指定维度计算平均值
- torch.sum() #指定维度求和
- torch.cumsum() #指定维度进行累加和
- torch.median() #指定维度求中位数
- torch.cumprod() #指定维度计算累乘积
- torch.std() #张量标准差
#张量排序,分别输出从小到大,与原来对应索引位
A=torch.tensor([12,34,25,11,67,32,29,30,99,55,23,44])
torch.sort(A)
torch.return_types.sort( values=tensor([11, 12, 23, 25, 29, 30, 32, 34, 44, 55, 67, 99]), indices=tensor([ 3, 0, 10, 2, 6, 7, 5, 1, 11, 9, 4, 8]))
#降序排列
torch.sort(A,descending=True)
torch.return_types.sort( values=tensor([99, 67, 55, 44, 34, 32, 30, 29, 25, 23, 12, 11]), indices=tensor([ 8, 4, 9, 11, 1, 5, 7, 6, 2, 10, 0, 3]))
#获取张量前几个大的数值以及索引
torch.topk(A,4)
torch.return_types.topk( values=tensor([99, 67, 55, 44]), indices=tensor([ 8, 4, 9, 11]))
#获取张量第k小的数值和位置
torch.kthvalue(A,3)
torch.return_types.kthvalue( values=tensor(23), indices=tensor(10))
2.4 其他的一些函数
- torch.abs:返回输入参数的绝对值
- torch.add:用于返回张量与张量或张量与标量的和的Tensor
- torch,div:返回输入参数求商的结果,可以是Tensor与Tensor,Tensor与标量
- torch.mm:矩阵的相乘
- torch.mv:返回输入参数的求积结果作为输出,按照矩阵与向量之间的乘法规则,第一个参数为矩阵,第二个参数为向量,不能颠倒
三、Tensor的操作
(1)改变张量的形状
torch.reshape()
A=torch.arange(12).reshape(3,4)
tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
对于已经生成的可以采用下面的方式
torch.reshape(input=A,shape=(2,-1))
torch.resize_()
A.resize_(2,6)
tensor([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]])
还提供了A.resize_as_(B),可以将A的形状设置为与B相同的形状大小。
torch.unsqueeze()和torch.squeeze()
- torch.unsqueeze()函数在指定维度插入尺寸为1的新张量
- torch.squeeze()函数移除所有维度为1的维度
A=torch.arange(12).reshape(2,6)
B=torch.unsqueeze(A,dim=0)
print("B.shape",B.shape)
C=B.unsqueeze(dim=3)
print("C.shape",C.shape)
D=torch.squeeze(C)
print("D.shape",D.shape)
#移除指定维度为1的维度
E=torch.squeeze(C,dim=0)
print("E.shape",E.shape)
B.shape torch.Size([1, 2, 6]) C.shape torch.Size([1, 2, 6, 1]) D.shape torch.Size([2, 6]) E.shape torch.Size([2, 6, 1])
(2)获取张量中的元素
切片索引法
import torch
A=torch.arange(12).reshape(1,3,4)
print(A)
print("0维度",A[0])
print("获取0维度下的矩阵前两行元素\\n",A[0,0:2,:])
print("获取0维度下最后一行的-4至-1列\\n",A[0,-1,-4:-1])
tensor([[[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]]) 0维度 tensor([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) 获取0维度下的矩阵前两行元素 tensor([[0, 1, 2, 3], [4, 5, 6, 7]]) 获取0维度下最后一行的-4至-1列 tensor([ 8, 9, 10])
获取A中大于5的元素
A[A>5]
tensor([ 6, 7, 8, 9, 10, 11])
筛选条件
B=-A
torch.where(A>5,A,B) #当A>5时为True,返回A的值,否则会返回B的值
tensor([[[ 0, -1, -2, -3], [-4, -5, 6, 7], [ 8, 9, 10, 11]]])
上三角、下三角及对角线元素
#获取矩阵下三角
print(torch.tril(A,diagonal=0))
#diagonal控制要考虑的对角线
print(torch.tril(A,diagonal=-1))
#获取上三角
print(torch.triu(A,diagonal=0))
#获取对角线元素
C=A.reshape(3,4)
print(torch.diag(C,diagonal=0))
print(torch.diag(C,diagonal=-1))
tensor([[[ 0, 0, 0, 0], [ 4, 5, 0, 0], [ 8, 9, 10, 0]]]) tensor([[[0, 0, 0, 0], [4, 0, 0, 0], [8, 9, 0, 0]]]) tensor([[[ 0, 1, 2, 3], [ 0, 5, 6, 7], [ 0, 0, 10, 11]]]) tensor([ 0, 5, 10]) tensor([4, 9])
(3)拼接与拆分
A=torch.arange(6.0).reshape(2,3)
B=torch.linspace(0,10,6).reshape(2,3)
#在0维度连接张量
C=torch.cat((A,B),dim=0)
C
tensor([[ 0., 1., 2.], [ 3., 4., 5.], [ 0., 2., 4.], [ 6., 8., 10.]])
- torch.stack(),可以将多个张量按照指定的维度进行拼接
- torch.chunk(),可以将张量分割为特定数量的块
- torch.split(),将张量分割为特定数量的块,可以指定每个块的大小
四、NumPy 转换
将一个Torch Tensor转化为Numpy数组是一件轻松的事,反之亦然。
Torch Tensor与Numpy数组共享底层内存地址,修改一个会导致另一个的变化。
Torch Tensor转化为Numpy
a=torch.ones(5)
print(a)
b=a.numpy()
print("ndarray",b)
tensor([1., 1., 1., 1., 1.])ndarray [1. 1. 1. 1. 1.]
Numpy转化为Torch Tensor
a=numpy.ones(5)
b=torch.from_numpy(a)
print("n:",a)
print("t:",b)
n: [1. 1. 1. 1. 1.]
t: tensor([1., 1., 1., 1., 1.], dtype=torch.float64)
以上是关于深度学习03:PyTorch的数据类型Tensor的主要内容,如果未能解决你的问题,请参考以下文章
Pytorch深度学习实战3-2:什么是张量?Tensor的创建与索引