文章目录
- 前言
- 一、张量是什么?
- 二、张量的属性
- 三、张量创建
- 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的相关操作
提示:以下是本篇文章正文内容
一、张量是什么?
张量是一个多维数组,它是标量、向量、矩阵的高位拓展
英文解释:
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
二、张量的属性
· 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()
功能:从data创建tensor
· data:数据,可以是list,numpy
· dtype:数据类型,默认与data一致
· device:所在设备,cuda/cpu
· requires_grad:是否需要梯度
· pin_memory:是否存于锁页内存
3.1.2 torch.from_numpy()
3.2 数学方法创建
3.2.1 torch.zeros()
功能:依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()
功能:依input形状创建全fill_value值的张量
· size:张量的形状
· fill_value:张量的值
3.2.4 torch.arange()
功能:创建等差的一维张量
范围:[start,end)
· start:数列的起始值
· end:数列的结束值
· step:数列的公差(步长),默认为1
3.2.5 torch.linspace()
功能:创建均分的一维张量
范围:[start,end]
· start:数列的起始值
· end:数列的结束值
· steps:数列切分的个数
3.2.6 torch.logspace()
功能:创建对数均分的一维张量,切分个数为steps,底为base
· base:对数函数的底,默认为10
3.2.7 torch.eye()
功能:创建单位对角矩阵(二维张量)
注意:默认为方阵,只需要设置n即可
` n:矩阵行
· m:矩阵列
3.3 依概率分布创建张量
3.3.1 torch.normal()
功能:生成正态分布
· mean:均值
· std:标准差
# 当mean,std有张量时,张量需要是float类型
t10 = torch.normal(mean=torch.tensor([1,2], dtype=float), std=2)
3.3.2 torch.randn()
功能:生成标准正态分布
· size:张量的形状
torch.randn_like()
3.3.3 torch.rand()/torch.randint()
功能:torch.rand()在区间[0,1)上,生成均匀分布
torch.randint()在区间[low,high)上,生成整数均匀分布
· size:张量的形状
torch.rand_like()
torch.randint_like()
3.3.4 torch.randperm() / torch.bernoulli()
torch.randperm()
功能:生成从0到n-1的随机排列
· n:张量的长度
torch.bernoulli()
功能:以input为概率,生成伯努利分布(0-1分布,两点分布)
· input:概率值
四、张量的操作
4.1 拼接
4.1.1 torch.cat()
功能:将张量按维度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()
功能:在新创建的维度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()
功能:将张量按维度进行平均切分
返回值:张量列表
注意事项:若不能整除,最后一份张量小于其他张量
· input:要切分的张量
· chunks:要切分的份数
· dim:要切分的维度
4.2.2 torch.split()
功能:将张量按维度dim进行切分
返回值:张量列表
· tensor:要切分的张量
· split_size_or_sections:为int时,表示每一份的长度;为list时,按list元素切分
· dim:要切分的维度
4.3 张量索引
4.3.1 torch.index_select()
功能:在维度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()
功能:按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()
功能:变换张量形状
注意:当张量在内存中是连续时,新张量与input共享数据内存
· input:要变换的张量
· shape:新张量的形状
4.4.2 torch.transpose() / torch.t()
torch.transpose():
功能:交换两个张量的维度
· input:要交换的张量
· dim0:要交换的维度
· dim1:要交换的维度
torch.t()
功能:二维张量转置,对矩阵而言,等价于torch.transpose(input, 0, 1)
4.4.3 torch.squeeze()
功能:压缩长度为1的维度(轴)
· dim:若为None,移除所有长度为1的轴;若指定维度,当且仅当该轴长度为1时,可以被移除
torch.unsqueeze()
功能:依据dim拓展维度
还有好多有意思的操作,自己去发掘吧:
https://pytorch.org/docs/stable/torch.html#indexing-slicing-joining-mutating-ops
五、张量数学运算
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代替