文章目录

  • 前言
  • 一、张量是什么?
  • 二、张量的属性
  • 三、张量创建
  • 3.1 依据原有数据创建
  • 3.1.1. torch.tensor()
  • 3.1.2 torch.from_numpy()
  • 3.2 数学方法创建
  • 3.2.1 torch.zeros()
  • 3.2.2 torch.ones()
  • 3.2.3 torch.fill()
  • 3.2.4 torch.arange()
  • 3.2.5 torch.linspace()
  • 3.2.6 torch.logspace()
  • 3.2.7 torch.eye()
  • 3.3 依概率分布创建张量
  • 3.3.1 torch.normal()
  • 3.3.2 torch.randn()
  • 3.3.3 torch.rand()/torch.randint()
  • 3.3.4 torch.randperm() / torch.bernoulli()
  • 四、张量的操作
  • 4.1 拼接
  • 4.1.1 torch.cat()
  • 4.1.2 torch.stack()
  • 4.2 切分
  • 4.2.1 torch.chunk()
  • 4.2.2 torch.split()
  • 4.3 张量索引
  • 4.3.1 torch.index_select()
  • 4.3.2 torch.masked_select()
  • 4.4 张量变换
  • 4.4.1 torch.reshape()
  • 4.4.2 torch.transpose() / torch.t()
  • 4.4.3 torch.squeeze()
  • 五、张量数学运算



前言

本文主要介绍Tensor的相关操作


提示:以下是本篇文章正文内容

一、张量是什么?

张量是一个多维数组,它是标量、向量、矩阵的高位拓展

pytorch计算两个无序张量重叠率 pytorch 张量操作_ci

英文解释:
The torch package contains data structures for multi-dimensional tensors and mathematical operations over these are defined. Additionally, it provides many utilities for efficient serializing of Tensors and arbitrary types, and other useful utilities.
It has a CUDA counterpart, that enables you to run your tensor computations on an NVIDIA GPU with compute capability >= 3.0

二、张量的属性

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_02

· data : 	被分装的Tensor
· dtype:	张量的数据类型,有float64,int64等
· shape:	张量的形状
· device:张量所在设备,GPU/CPU,是加速的关键
· grad:  data的梯度
· grad_fn:创建Tensor的Function,是自动求导的关键
· is_leaf:指示是否需要叶子节点(张量)
· requires_grad:	指示是否需要梯度

三、张量创建

3.1 依据原有数据创建

3.1.1. torch.tensor()

pytorch计算两个无序张量重叠率 pytorch 张量操作_ci_03


功能:从data创建tensor

· data:数据,可以是list,numpy
· dtype:数据类型,默认与data一致
· device:所在设备,cuda/cpu
· requires_grad:是否需要梯度
· pin_memory:是否存于锁页内存

3.1.2 torch.from_numpy()

pytorch计算两个无序张量重叠率 pytorch 张量操作_ci_04

3.2 数学方法创建

3.2.1 torch.zeros()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_05


功能:依size创建全0张量

· size:张量的形状,如(2,1), (2,2,4)
· out:输出的张量
· layout:内存中的布局形式,有strided, sparse_coo等
· device:所在设备,gpu/cpu
· requires_grad:是否需要梯度

此方法还有 tensor.zeros_like(),即根据输入的形状创建一个同样shape的全0张量

3.2.2 torch.ones()

用法同上
同样有torch.ones_like()方法

3.2.3 torch.fill()

pytorch计算两个无序张量重叠率 pytorch 张量操作_数据_06


功能:依input形状创建全fill_value值的张量

· size:张量的形状
· fill_value:张量的值

3.2.4 torch.arange()

pytorch计算两个无序张量重叠率 pytorch 张量操作_取整_07


功能:创建等差的一维张量

范围:[start,end)

· start:数列的起始值
· end:数列的结束值
· step:数列的公差(步长),默认为1

3.2.5 torch.linspace()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_08


功能:创建均分的一维张量

范围:[start,end]

· start:数列的起始值
· end:数列的结束值
· steps:数列切分的个数

3.2.6 torch.logspace()

pytorch计算两个无序张量重叠率 pytorch 张量操作_取整_09


功能:创建对数均分的一维张量,切分个数为steps,底为base

· base:对数函数的底,默认为10

3.2.7 torch.eye()

pytorch计算两个无序张量重叠率 pytorch 张量操作_数据_10


功能:创建单位对角矩阵(二维张量)

注意:默认为方阵,只需要设置n即可

` n:矩阵行
· m:矩阵列

3.3 依概率分布创建张量

3.3.1 torch.normal()

pytorch计算两个无序张量重叠率 pytorch 张量操作_数据_11

功能:生成正态分布

· mean:均值
· std:标准差

# 当mean,std有张量时,张量需要是float类型
t10 = torch.normal(mean=torch.tensor([1,2], dtype=float), std=2)

3.3.2 torch.randn()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_12

功能:生成标准正态分布

· size:张量的形状

torch.randn_like()

3.3.3 torch.rand()/torch.randint()

pytorch计算两个无序张量重叠率 pytorch 张量操作_数据_13

功能:torch.rand()在区间[0,1)上,生成均匀分布
torch.randint()在区间[low,high)上,生成整数均匀分布

· size:张量的形状

torch.rand_like()
torch.randint_like()

3.3.4 torch.randperm() / torch.bernoulli()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_14

torch.randperm()
功能:生成从0到n-1的随机排列

· n:张量的长度

torch.bernoulli()
功能:以input为概率,生成伯努利分布(0-1分布,两点分布)

· input:概率值

四、张量的操作

4.1 拼接

4.1.1 torch.cat()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_15


功能:将张量按维度dim进行拼接

· tensors:张量序列
· dim:要拼接的维度
t0 = torch.zeros([2, 3])
t0 = tensor([[0., 0., 0.],
        	[0., 0., 0.]])
t1 = torch.ones([2, 3])
t1 = tensor([[1., 1., 1.],
        	[1., 1., 1.]])
        
t2 = torch.cat([t0, t1], dim=0)  # 在第零维度上拼接
[2*3] +[2*3]---> [4*3] (dim=0)
t2 = tensor([[0., 0., 0.],
        	[0., 0., 0.],
        	[1., 1., 1.],
        	[1., 1., 1.]])
        
tt = torch.cat([t0,t1], dim=1)
[2*3]+[2*3]---> [2*6] (dim=1)
tt = tensor([[0., 0., 0., 1., 1., 1.],
        	[0., 0., 0., 1., 1., 1.]])

4.1.2 torch.stack()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_16


功能:在新创建的维度dim上进行拼接

· tensors:张量序列
· dim:要拼接的维度
t0 = torch.zeros([2, 3])
t0 = tensor([[0., 0., 0.],
        	[0., 0., 0.]])
t1 = torch.ones([2, 3])
t1 = tensor([[1., 1., 1.],
        	[1., 1., 1.]])
        
t3 = torch.stack([t0, t1], dim=0)
[2*3]+[2*3] ---> [2*2*3] (dim=0)
t3 = tensor([[[0., 0., 0.],
         	[0., 0., 0.]],

        	[[1., 1., 1.],
         	[1., 1., 1.]]])
         
t4 = torch.stack([t0, t1], dim=1)
[2*3]+[2*3] ---> [2*2*3] (dim=1)
t4 = tensor([[[0., 0., 0.],
        	 [1., 1., 1.]],

        	[[0., 0., 0.],
         	[1., 1., 1.]]])
         
t5 = torch.stack([t0, t1], dim=2)
[2*3]+[2*3] ---> [2*3*2]  (dim=2)
t5 = tensor([[[0., 1.],
         	[0., 1.],
         	[0., 1.]],

        	[[0., 1.],
         	[0., 1.],
         	[0., 1.]]])

4.2 切分

4.2.1 torch.chunk()

pytorch计算两个无序张量重叠率 pytorch 张量操作_数据_17


功能:将张量按维度进行平均切分

返回值:张量列表

注意事项:若不能整除,最后一份张量小于其他张量

· input:要切分的张量
· chunks:要切分的份数
· dim:要切分的维度

4.2.2 torch.split()

pytorch计算两个无序张量重叠率 pytorch 张量操作_pytorch计算两个无序张量重叠率_18


功能:将张量按维度dim进行切分

返回值:张量列表

· tensor:要切分的张量
· split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
· dim:要切分的维度

4.3 张量索引

4.3.1 torch.index_select()

pytorch计算两个无序张量重叠率 pytorch 张量操作_ci_19

功能:在维度dim上,按index索引数据
返回值:依index索引数据拼接的张量

· input:要索引的张量
· dim:要索引的维度
· index:要索引数据的序号
e1 = torch.randint(1,9,size=(3,3))
e1 = tensor([[8, 1, 8],
      	  	[8, 8, 8],
        	[2, 1, 6]])

idx = torch.tensor([1, 2])  # dtype类型需要时int64而非float
t = torch.index_select(e1, dim=0, index=idx)
t = tensor([[8, 8, 8],
        	[2, 1, 6]])

4.3.2 torch.masked_select()

pytorch计算两个无序张量重叠率 pytorch 张量操作_取整_20


功能:按mask中的True进行索引

返回值:一维张量

· input:要索引的张量
· mask:与input同形状的布尔类型张量
e1 = torch.randint(1,9,size=(3,3))
tensor([[1, 4, 3],
        [7, 2, 4],
        [2, 5, 2]])

mask = e1.ge(5)  # ge:greater or equal   gt:greater than,le,lt
tensor([[False, False, False],
        [ True, False, False],
        [False,  True, False]])

t1 = torch.masked_select(e1, mask)
tensor([7, 5])

4.4 张量变换

4.4.1 torch.reshape()

pytorch计算两个无序张量重叠率 pytorch 张量操作_取整_21


功能:变换张量形状

注意:当张量在内存中是连续时,新张量与input共享数据内存

· input:要变换的张量
· shape:新张量的形状

4.4.2 torch.transpose() / torch.t()

pytorch计算两个无序张量重叠率 pytorch 张量操作_ci_22


torch.transpose():

功能:交换两个张量的维度

· input:要交换的张量
· dim0:要交换的维度
· dim1:要交换的维度

torch.t()
功能:二维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)

4.4.3 torch.squeeze()

pytorch计算两个无序张量重叠率 pytorch 张量操作_ci_23

功能:压缩长度为1的维度(轴)
· dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除

torch.unsqueeze()
功能:依据dim拓展维度

还有好多有意思的操作,自己去发掘吧:
https://pytorch.org/docs/stable/torch.html#indexing-slicing-joining-mutating-ops

五、张量数学运算

pytorch计算两个无序张量重叠率 pytorch 张量操作_取整_24


pytorch计算两个无序张量重叠率 pytorch 张量操作_取整_25


torch.mul() / torch.mm()

torch.mul(input, other, *, out=None) #矩阵对应元素相乘
torch.mm(input, other, *, out=None) # 矩阵相乘  [n*k]*[k*m]=[n*m]
input (Tensor) – the first multiplicand tensor
other (Tensor) – the second multiplicand tensor

乘法:
torch.mul(input, other, out=None)
用input乘以other

除法:
torch.div(input, other, out=None)
用input除以other

指数:
torch.pow(input, exponent, out=None)

开根号:
torch.sqrt(input, out=None)

四舍五入到整数:
torch.round(input, out=None)

argmax函数:
torch.argmax(input, dim=None, keepdim=False)
返回指定维度最大值的序号,dim给定的定义是:the demention to reduce.也就是把dim这个维度的,变成这个维度的最大值的index。例如:

sigmoid函数:
torch.sigmoid(input, out=None)

tanh函数:
torch.tanh(input, out=None)

torch.abs(input, out=None)
取绝对值

torch.ceil(input, out=None)
向上取整,等于向下取整+1

torch.clamp(input, min, max, out=None)
刀削函数,把输入数据规范在min-max区间,超过范围的用min、max代替