Tensor
1.常见新建tensor的方法:
函数 | 功能 |
---|---|
Tensor(*sizes) | 基础构造函数 |
tensor(data,) | 类似np.array的构造函数 |
ones(*sizes) | 全1Tensor |
zeros(*sizes) | 全0Tensor |
eye(*sizes) | 对角线为1,其他为0 |
arange(s,e,step) | 从s到e,步长为step |
linspace(s,e,steps) | 从s到e,均匀切分成steps份 |
rand/randn(*sizes) | 均匀/标准分布 |
normal(mean,std)/uniform(from,to) | 正态分布/均匀分布 |
randperm(m) | 随机排列 |
empty(m,n) | 返回填充有未初始化数据的张量。 张量的形状由可变的参数大小定义 |
Tensor(*sizes)
基础构造函数创建tensor:
import torch
x = torch.Tensor(3, 4) # 三行四列的一个tensor
print(x)
y = torch.Tensor([1, 2, 3, 4]) # 指定列表生成的tensor
print(y)
输出:
tensor([[4.1327e-39, 8.9082e-39, 9.8265e-39, 9.4592e-39],
[1.0561e-38, 1.0653e-38, 1.0469e-38, 9.5510e-39],
[1.0378e-38, 8.9082e-39, 9.6429e-39, 8.9082e-39]])
tensor([1., 2., 3., 4.])
empty()
创建一个5x3的未初始化的Tensor:
import torch
import numpy as np
x = torch.empty(5, 3) # 未初始化的Tensor
print(x)
输出:
tensor([[1.0561e-38, 1.0653e-38, 1.0469e-38],
[9.5510e-39, 1.0745e-38, 9.6429e-39],
[1.0561e-38, 9.1837e-39, 1.0653e-38],
[8.4490e-39, 9.6429e-39, 1.0653e-38],
[9.6429e-39, 1.0745e-38, 9.2755e-39]])
ones(*sizes),zeros(*sizes)
创建全1,全0的tensor:
a = torch.ones(2, 3)
print(a)
b = torch.zeros(2, 3)
print(b)
输出:
tensor([[1., 1., 1.],
[1., 1., 1.]])
tensor([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
rand(*sizes),randn(*sizes)
rand(*size)是平均分布,即等概率分布,等概率产生0-1范围内的数。
randn(*size)是标准正态分布,均值为0,标准差为1。
x = torch.rand(5, 3)
y = torch.randn(5, 3)
print(x)
print(y)
输出:
tensor([[0.9491, 0.5622, 0.2050],
[0.9967, 0.6962, 0.4248],
[0.0452, 0.7653, 0.3908],
[0.5554, 0.6158, 0.5598],
[0.9109, 0.9606, 0.6292]])
tensor([[-0.4479, -0.4878, -0.4781],
[-0.4787, -0.8743, -0.5941],
[-0.3610, 0.8012, -1.6010],
[ 0.1469, -1.8639, -1.6346],
[ 0.1833, -1.7414, 0.0152]])
2.常见的逐元素操作:
函数 | 功能 |
---|---|
abs/sqrt/div/exp/fmod/log/pow… | 绝对值/平方根/除法/指数/求余/求幂… |
cos/sin/asin/atan2/cosh… | 相关三角函数 |
ceil/round/floor/trunc | 上取整/四舍五入/下取整/只保留整数部分 |
clamp(input, min, max) | 超过min和max部分截断 |
sigmod/tanh… | 激活函数 |
比较函数中有一些是逐元素比较,操作类似于逐元素操作,还有一些则类似于归并操作。
3.常用的比较函数:
函数 | 功能 |
---|---|
gt/lt/ge/le/eq/ne | 大于/小于/大于等于/小于等于/等于/不等 |
topk | 最大的k个数 |
sort | 排序 |
max/min | 比较两个tensor最大最小值 |
表中第一行的比较操作已经实现了运算符重载,因此可以使用a>=b、a>b、a!=b、a==b,其返回结果是一个ByteTensor,可用来选取元素。
max/min这两个操作比较特殊,以max来说,它有以下三种使用情况:
torch.max(tensor) # 返回tensor中最大的一个数
torch.max(tensor,dim) # 指定维上最大的数,返回tensor和下标
torch.max(tensor1, tensor2) # 比较两个tensor相比较大的元素
4.归并操作 :
此类操作会使输出形状小于输入形状,并可以沿着某一维度进行指定操作。
如加法sum
,既可以计算整个tensor的和,也可以计算tensor中每一行或每一列的和。
函数 | 功能 |
---|---|
mean/sum/median/mode | 均值/和/中位数/众数 |
norm/dist | 范数/距离 |
std/var | 标准差/方差 |
cumsum/cumprod | 累加/累乘 |
以上大多数函数都有一个参数**dim
**,用来指定这些操作是在哪个维度上执行的。关于dim(对应于Numpy中的axis)的解释众说纷纭,这里提供一个简单的记忆方式:
假设输入的形状是(m, n, k)
- 如果指定dim=0,输出的形状就是(1, n, k)或者(n, k)
- 如果指定dim=1,输出的形状就是(m, 1, k)或者(m, k)
- 如果指定dim=2,输出的形状就是(m, n, 1)或者(m, n)
size中是否有"1",取决于参数keepdim
,keepdim=True
会保留维度1
。注意,以上只是经验总结,并非所有函数都符合这种形状变化方式,如cumsum
。
5.常用的线性代数函数:
函数 | 功能 |
---|---|
trace | 对角线元素之和(矩阵的迹) |
diag | 对角线元素 |
triu/tril | 矩阵的上三角/下三角,可指定偏移量 |
mm/bmm | 矩阵乘法,batch的矩阵乘法 |
addmm/addbmm/addmv/addr/badbmm… | 矩阵运算 |
t | 转置 |
dot/cross | 内积/外积 |
inverse | 求逆矩阵 |
svd | 奇异值分解 |
6.广播机制:
当对两个形状不同的Tensor按元素运算时,可能会触发广播机制:先适当复制元素使这两个Tensor形状相同后再按元素运算。
x = torch.arange(1, 3).view(1, 2)
print(x)
y = torch.arange(1, 4).view(3, 1)
print(y)
print(x + y)
输出:
tensor([[1, 2]])
tensor([[1],
[2],
[3]])
tensor([[2, 3],
[3, 4],
[4, 5]])
7.Tensor形状:
shape,size()
可以通过shape或者size()来获取Tensor的形状:
x = torch.rand(3, 2)
y = torch.randn(2, 4)
print(x.size())
print(y.shape)
输出:
torch.Size([3, 2])
torch.Size([2, 4])
view()
用view()来改变Tensor的形状:
x = torch.randn(3, 5)
y = x.view(15)
z = x.view(-1, 5) # -1所指的维度可以根据其他维度的值推出来
print(x.size(), y.size(), z.size())
输出:
torch.Size([3, 5]) torch.Size([15]) torch.Size([3, 5])