【PyTorch笔记-01】初识PyTorch
人终其一生应该有所追求,但这种追求不应该仅仅局限在金钱上,它应该是一个特殊的,却普遍存在无人提及的东西。——Wicos 写在前面
一,创建Tensor的几种方法
前提:import torch as t 1,Tensor(x,y)
a = t.Tensor(2,3) #创建一个2行3列的张量
2,ones(x,y)
a = t.ones(2,3) #创建一个2行3列的全1张量
3,zeros(x,y)
a = t.zeros(2,3) #创建一个2行3列的全0张量
4,eye(x,y)
a = t.eye(2,3) #创建一个2行3列对角线为1的张量,其中不要求行列数相同,1从左上角第一个数字开始对角扩张。如本例的输出a为: [[1.,0.,0.] [0.,1.,0.]]
5,arange(x,y,z)
a = t.arange(1,6,1) #创建一个一维张量,从1开始到5结束,步长为1。 其创建的是torch.Tensor 如:>>>type(a) -> <class ‘torch.Tensor’>
6,linspace(x,y,z)
a = t.linspace(1,5,4) #创建一个一维张量,从1至5平均分成3份,共4个元素。 ->tensor([1.0000, 2.3333, 3.6667, 5.0000])
7,rand(x,y)
a = rand(2,5) #创建一个2行5列的均匀张量
8,randn(x,y)
a = randn(2,5) #创建一个2行5列的平均张量
9,normal(mean,std)/uniform(from,to)
#正态分布/均匀分布
10,ramdperm(x)
a = t.randperm(5) #创建一个一维的随机张量,内又5个元素。
11,shape,size
a.shape 与 a.zize() 得到的结果相同,注意shape后无括号,size后有括号。
12,tolist()
a.tolist() #tensor可以转换为list
13,numel()/nelement()
a.numel与a.nelement()等效,都可以返回tensor元素总个数。
14,创建Tensor时,可以在创建的时候指定数据类型dtype和存放device(cpu/gpu)。 15,view(x,y)
b = a.view(2,3) #若a内原本元素有6个,可以重新转化为2行3列的张量。 注:view只会修改tensor的形状,不会修改数据,并且要保证前后元素相等。 当view内值有-1时,和shape,size()等效。即计算它的大小。
16,squeeze()
b = a.squeeze() #把所有维度为1的压缩 b = a.squeeze(0) #压缩0维的1
17,unsqueeze(x)
b = a.unsqueeze(1) #在第1维上增加1
18,resize_()
a.resize_(2,3) #将原来的tensor转换为2行,3列的tensor,如果新生成的张量元素多于旧张量元素,则自动补充新内容,反之,保留原内容。
二,索引操作
a = t.randn(3,4) 19,a[x][y] == a[x,y]
a[2][3] #获取第2行第3列的元素 与 a[2,3]等效
20,a[:x]
a[:2] #获取前两行元素
21,a[x:y,m:n]
a[:2,0:1] #获取前两行,第一列 a[0:1,:2] #获取第0行,前两列 二者形状不同,数据也不同
三:逐元素操作
函数
功能
abs/sqrt/div/exp/fmod/log/pow..
绝对值/平方根/除法/指数/求余/求幂..
cos/sin/asin/atan2/cosh..
相关三角函数
ceil/round/floor/trunc
上取整/四舍五入/下取整/只保留整数部分
clamp(input, min, max)
超过min和max部分截断
sigmod/tanh..
激活函数
部分可以进行运算符直接操作,如
a = t.arange(0,6,1).view(2,3) b = t.pow(a,2) -> [[0,1,4] [9,16,25]] 与a**2等效
四,归并
函数
功能
mean/sum/median/mode
均值/和/中位数/众数
norm/dist
范数/距离
std/var
标准差/方差
cumsum/cumprod
累加/累乘
归并操作中大部分都有dim参数,决定在那个维度上执行操作。 假设输入的形状是(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
。
a = t.arange(0,6,1).view(2,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来说,它有以下三种使用情况:
- t.max(tensor):返回tensor中最大的一个数
- t.max(tensor,dim):指定维上最大的数,返回tensor和下标
- t.max(tensor1, tensor2): 比较两个tensor相比较大的元素。
六,线性代数
函数
功能
trace
对角线元素之和(矩阵的迹)
diag
对角线元素
triu/tril
矩阵的上三角/下三角,可指定偏移量
mm/bmm
矩阵乘法,batch的矩阵乘法
addmm/addbmm/addmv/addr/badbmm..
矩阵运算
t
转置
dot/cross
内积/外积
inverse
求逆矩阵
svd
奇异值分解
注:矩阵转置后存储空间不连续,因此要使用.contiguous
方法将其转为连续。
总结:
一,对tensor “维”的理解 在pytorch中,多种操作都涉及到“维”(dimension),如
import torch as t a = t.arange(0,8,1).view(2,2,2) a.dim() ->3 #表示张量a有三个维度,分别是0,1,2 a.sum() #默认操作作用在所有元素上 -> tensor(28) a.sum(dim = 0) ->trnsor([[4,6], [8,10]]) a.sum(dim = 1) ->tensor([[2,4], [10,12]]) a.sum(dim = 2) ->tensor([1,5], [9,13])
通过对比可以看出同一个sum操作在dim不同的情况下得到的结果是不同的,因为此操作作用在不同的“维”。 当输出格式维张量时不方便看出,经过简单的tolist操作便可以更直观的理解
b = a.tolist() print(b) -> [[[0,1],[2,3]],[[4,5],[6,7]]]
- 当dim = 0时,可以理解为操作[[A],[B]],A与B对应操作,得到的结果时[[4,6],[8,10]]。
- 当dim = 1时,可以理解为[[[A],[B]],[[C],[D]]],A,B对应操作后再对C,D对应操作,得到[[2,4],[10,12]]。
- 当dim = 2时,可以理解为[[[A],[B]],[[C],[D]]],逐个对A,B,C,D内两元素对应操作,得到[[1,5],[9,3]]。
为了进一步加深理解,a时一个张量,其为: a = tensor([[[0, 1], [2, 3]], [[4, 5], [6, 7]]]) b = [[[0, 1], [2, 3]], [[4, 5], [6, 7]]]
- 操作a内元素时,a[0,0,1] 为 tensor(1)
- 操作b内元素时,b[0][0][1]为1
当tensor和list对比操作时,更容易理解tensor中的维这个概念。 ——Wicos 2020.1.19