最近在学深度学习PyTorch框架,本来想把本周学到的内容整合梳理分享给大家,但是突然搜索到有人已经把课件分享出来了,那么希望我这篇文章可以充当一个字典的作用,我大体提炼出一些内容和方法函数,具体的实现方法和细节我都附上课件的链接,相信两者结合会更加高效。
学习建议:将张量和numpy中的array类比来进行理解和学习
一、张量的创建和常用方法
一些常见函数:
二、张量的索引、分片、合并及维度调整
1、张量的符号索引
2、张量的函数索引
3、tensor.view方法
4、张量的分片函数
5、张量的合并操作
6、张量的维度变换
三、张量的广播和科学运算
四、基本优化方法和最小二乘法
五、动态计算图和梯度下降算法
AutoGrad的回溯机制与动态计算图
反向传播与梯度计算
阻止计算图追踪
识别叶节点 .is_leaf
1、整数型的数组默认创建int32(整型)类型,而张量则默认创建int64(长整型)类型
2、创建浮点型数组时,张量默认是float32(单精度浮点型),而array则是默认float64
3、未来的应用当中,Torch中很多函数不能使用整型,要改成浮点数
t = torch.tensor() | 创建张量 |
t.ndim | 查看t的维度 |
t.numel | 返回总共拥有几个数 |
torch.rand(2,3) | 服从0-1分布 |
torch.randn(2,3) | 服从标准正态分布 |
torch.nomal(2,3,size =(2,2)) | 服从指定正态分布张量(均值为2,标准差为3) |
torch.arrange(1,5,0.5) | 从1到5(左闭右开),每隔0.5取值 |
torch.linspace(1,5,3) | 从一到5(左右都包括),等距取3个数 |
.float()、.int() | 对张量进行类型转换 |
t.flatten() |
将张量压成一维 |
torch.zeros([2, 3]) | 创建全0张量 |
torch.ones([2, 3]) |
创建全1张量 |
torch.eye(5) | 创建单位矩阵 |
torch.diag(t1) | 创建对角矩阵 |
torch.empty(2, 3) | 生成未初始化的指定形状矩阵 |
torch.full([2, 4], 2) | 根据指定形状,填充指定数值 |
_like | 上述函数后面加上 根据指定对象的形状进行数值填充 |
item() | 转化为数值 |
4、张量的维度:
如何理解零维张量?目前,我们将零维张量视为拥有张量属性的单独一个数,没有方向。
为什么会有零维张量?张量可存在GPU上,但Python原生的数值型对象不行,所以使用零维张量代替一个单独的数值。
5、张量的深拷贝:
Python中其他对象类型一样,等号赋值操作实际上是浅拷贝,需要进行深拷贝,则需要使用clone方法
一些代码以及其余更多细节可参考文章:
Lesson 1.张量(Tensor)的创建和常用方法_Grateful_Dead424的博客-CSDN博客_python定义tensor
一维张量的索引过程和Python原生对象类型的索引一致,基本格式遵循[start: end: step]
,索引的基本要点回顾如下。
二维张量的索引逻辑和一维张量的索引逻辑基本相同,二维张量可以视为两个一维张量组合而成,而在实际的索引过程中,需要用逗号进行分隔,分别表示对哪个一维张量进行索引、以及具体的一维张量的索引。
在二维张量索引的基础上,三维张量拥有三个索引的维度。我们将三维张量视作矩阵组成的序列,则在实际索引过程中拥有三个维度,分别是索引矩阵、索引矩阵的行、索引矩阵的列。
在PyTorch中,我们还可以使用index_select函数,通过指定index来对张量进行索引。
t1
#tensor([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
t1.ndim
#1
indices = torch.tensor([1, 2])
indices
#tensor([1, 2])
t1[1: 3]
#tensor([2, 3])
t1[[1, 2]]
#tensor([2, 3])
torch.index_select(t1, 0, indices)
#tensor([2, 3])
在index_select函数中,第二个参数实际上代表的是索引的维度。对于t1这个一维向量来说,由于只有一个维度,因此第二个参数取值为0,就代表在第一个维度上进行索引
在正式介绍张量的切分方法之前,需要首先介绍PyTorch中的.view()方法。该方法会返回一个类似视图的结果,该结果和原张量对象共享一块数据存储空间,并且通过.view()方法,还可以改变对象结构,生成一个不同结构,但共享一个存储空间的张量。当然,共享一个存储空间,也就代表二者是“浅拷贝”的关系,修改其中一个,另一个也会同步进行更改。
分块:chunk函数能够按照某维度,对张量进行均匀切分,并且返回结果是原张量的视图
拆分:split既能进行均分,也能进行自定义切分。当然,需要注意的是,和chunk函数一样,split返回结果也是view。
拼接函数:cat
堆叠函数:stack (和拼接不同,堆叠不是将元素拆分重装,而是简单的将各参与堆叠的对象分装到一个更高维度的张量里)
此前我们介绍过,通过reshape方法,能够灵活调整张量的形状。而在实际操作张量进行计算时,往往需要另外进行降维和升维的操作,当我们需要除去不必要的维度时,可以使用squeeze函数,而需要手动升维时,则可采用unsqueeze函数
一些代码以及其余更多细节可参考文章:
Lesson 2.张量的索引、分片、合并以及维度调整_Grateful_Dead424的博客-CSDN博客
Tensor基本数学运算:
Tensor数值调整函数:
Tensor常用科学计算:
Tensor统计分析函数:
Tensor比较运算函数:
关于以上函数的详细解释和运用:
Lesson 3.张量的广播和科学运算_Grateful_Dead424的博客-CSDN博客
1、torch.lstsq(B, A)
调用最小二乘法函数
2、torch.linalg.norm(t)求向量或矩阵的范数
3、torch.autograd.grad函数 通用微分函数,当只输入一个自变量时计算结果就是导数,输入多个自变量时则会计算偏导数
详情参考:
Lesson 5.基本优化思想与最小二乘法_Grateful_Dead424的博客-CSDN博客
.backward()
.grad
详情参考:
Lesson 6.动态计算图与梯度下降入门_Grateful_Dead424的博客-CSDN博客