深度学习03:PyTorch的数据类型Tensor

Posted 夏天是冰红茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深度学习03:PyTorch的数据类型Tensor相关的知识,希望对你有一定的参考价值。

目录

PyTorch的数据类型:Tensor

函数查找

一、Tensor的创建

二、Tensor的运算

三、Tensor的操作

四、NumPy 转换

一、Tensor的创建

二、Tensor的运算

2.1 张量元素比较

2.2 基本运算

2.2.1 逐元素加减乘除

2.2.2 幂运算

2.2.3 指数对数运算

2.2.4 平方根及其倒数

2.2.5 数据的裁剪

 2.2.6 矩阵的运算

2.3 统计相关计算

2.4 其他的一些函数

三、Tensor的操作

(1)改变张量的形状

torch.reshape()

 torch.resize_()

torch.unsqueeze()和torch.squeeze()

(2)获取张量中的元素

切片索引法

获取A中大于5的元素 

筛选条件

上三角、下三角及对角线元素

(3)拼接与拆分

四、NumPy 转换

Torch Tensor转化为Numpy

Numpy转化为Torch Tensor


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()
  1. torch.mean()       #指定维度计算平均值
  2. torch.sum()         #指定维度求和
  3. torch.cumsum()  #指定维度进行累加和
  4. torch.median()    #指定维度求中位数
  5. torch.cumprod()  #指定维度计算累乘积
  6. 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的创建与索引

《动手学深度学习》PyTorch: 数据操作

深度学习计算模型/Tensor的读取和存储(PyTorch)

Pytorch深度学习基础之Tensor

2.3 Tensor类型

pytorch基本语法