菜菜PyTorch深度学习框架最全笔记(第一次课)

最近在学深度学习PyTorch框架,本来想把本周学到的内容整合梳理分享给大家,但是突然搜索到有人已经把课件分享出来了,那么希望我这篇文章可以充当一个字典的作用,我大体提炼出一些内容和方法函数,具体的实现方法和细节我都附上课件的链接,相信两者结合会更加高效。

目录

学习建议:将张量和numpy中的array类比来进行理解和学习

一、张量的创建和常用方法

一些常见函数:

二、张量的索引、分片、合并及维度调整

1、张量的符号索引

2、张量的函数索引

3、tensor.view方法

4、张量的分片函数

5、张量的合并操作

6、张量的维度变换

三、张量的广播和科学运算

四、基本优化方法和最小二乘法

五、动态计算图和梯度下降算法

AutoGrad的回溯机制与动态计算图

反向传播与梯度计算

阻止计算图追踪  

识别叶节点  .is_leaf

学习建议:将张量和numpy中的array类比来进行理解和学习

一、张量的创建和常用方法

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

上述函数后面加上_like

根据指定对象的形状进行数值填充

item() 转化为数值

4、张量的维度:

如何理解零维张量?目前,我们将零维张量视为拥有张量属性的单独一个数,没有方向。

为什么会有零维张量?张量可存在GPU上,但Python原生的数值型对象不行,所以使用零维张量代替一个单独的数值。

5、张量的深拷贝:

Python中其他对象类型一样,等号赋值操作实际上是浅拷贝,需要进行深拷贝,则需要使用clone方法

一些代码以及其余更多细节可参考文章:

Lesson 1.张量(Tensor)的创建和常用方法_Grateful_Dead424的博客-CSDN博客_python定义tensor

二、张量的索引、分片、合并及维度调整

1、张量的符号索引

一维张量的索引过程和Python原生对象类型的索引一致,基本格式遵循[start: end: step],索引的基本要点回顾如下。

二维张量的索引逻辑和一维张量的索引逻辑基本相同,二维张量可以视为两个一维张量组合而成,而在实际的索引过程中,需要用逗号进行分隔,分别表示对哪个一维张量进行索引、以及具体的一维张量的索引。

在二维张量索引的基础上,三维张量拥有三个索引的维度。我们将三维张量视作矩阵组成的序列,则在实际索引过程中拥有三个维度,分别是索引矩阵、索引矩阵的行、索引矩阵的列。

2、张量的函数索引

在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,就代表在第一个维度上进行索引

3、tensor.view方法

在正式介绍张量的切分方法之前,需要首先介绍PyTorch中的.view()方法。该方法会返回一个类似视图的结果,该结果和原张量对象共享一块数据存储空间,并且通过.view()方法,还可以改变对象结构,生成一个不同结构,但共享一个存储空间的张量。当然,共享一个存储空间,也就代表二者是“浅拷贝”的关系,修改其中一个,另一个也会同步进行更改。

4、张量的分片函数

分块:chunk函数能够按照某维度,对张量进行均匀切分,并且返回结果是原张量的视图

拆分:split既能进行均分,也能进行自定义切分。当然,需要注意的是,和chunk函数一样,split返回结果也是view。

5、张量的合并操作

拼接函数:cat

堆叠函数:stack  (和拼接不同,堆叠不是将元素拆分重装,而是简单的将各参与堆叠的对象分装到一个更高维度的张量里)

6、张量的维度变换

此前我们介绍过,通过reshape方法,能够灵活调整张量的形状。而在实际操作张量进行计算时,往往需要另外进行降维和升维的操作,当我们需要除去不必要的维度时,可以使用squeeze函数,而需要手动升维时,则可采用unsqueeze函数

一些代码以及其余更多细节可参考文章:

Lesson 2.张量的索引、分片、合并以及维度调整_Grateful_Dead424的博客-CSDN博客

三、张量的广播和科学运算

Tensor基本数学运算:

菜菜PyTorch深度学习框架最全笔记(第一次课)_第1张图片

Tensor数值调整函数:

 菜菜PyTorch深度学习框架最全笔记(第一次课)_第2张图片

Tensor常用科学计算:

  • 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博客

五、动态计算图和梯度下降算法

AutoGrad的回溯机制与动态计算图

反向传播与梯度计算

阻止计算图追踪  

  • with torch.no_grad():阻止计算图记录
  • .detach()方法:创建一个不可导的相同张量

识别叶节点  .is_leaf

.backward()

.grad

详情参考:

Lesson 6.动态计算图与梯度下降入门_Grateful_Dead424的博客-CSDN博客

你可能感兴趣的:(菜菜深度学习PyTorch框架,pytorch,深度学习,机器学习)