推荐学习视频: www.bilibili.com/video/BV1Vx…
干货满满,一起学习😀
阅读笔记 ② —— 第2章 Pytorch深度学习框架简介
深度学习框架需要支持的内容
1.张量
张量的运算是深度学习的核心
- 一个mini-batch的图片可以看成四维张量,一个mini-batch的文本可以看成二维张量 张量在内存中的排列方式是连续的,而且是从最后一个维度开始排列。
张量首先是能够支持每一个维度的长度——保存张量的形状
需要能够支持和其它相同类型张量的运算——四则运算
能变形——变换成总元素的数目相同,但维度不同的另外一个张量 由于变形前后的两个张量的分量在内存中的排列形状一般是相同的——两个张量一般会在底层共享一个内存区域
张量应该能支持线性变换操作(e.g.卷积层和全连接层运算)&对每个元素的激活函数操作(即张量的逐点变换) 实现线性变换和激活函数操作,是为了更方便进行神经网络的前向计算。
2.计算图
有了张量的定义和计算,还需要让深度学习框架能反向传播计算和梯度计算(即计算权重梯度和数据梯度)。
- 计算图分为:
- 静态计算图(e.g. TensorFlow)
- 动态计算图(e.g. Pytorch)——若进行反向传播计算,动态计算图的 反向传播路径 只有 在计算图构建完成的时候才能获得。
3.自动求导和反向传播
一般深度学习模型在训练的时候,要构建计算图,计算图的最后输出是一个损失函数的标量值。
- 根据反向传播算法 ,从标量值反推出计算图权重张量的梯度 上述这个过程就称为——自动求导
- 静态~:在构建前向的计算操作同时构建一个反向传播的梯度计算操作 有了损失函数之后,可以从损失函数所在的张量的边开始逐渐沿着反向计算图获取对应的梯度。
- 损失函数优化:直接在计算图中集成了优化器 在求出权重张量梯度之后,直接执行优化器的计算图, 更新权重张量的值。
- 动态~:构建前向计算图的时候,给每一个输出张量绑定一个反向传播的梯度计算函数 当计算图到达最终的损失函数张量的时候,直接调用该张量对应的反向传播函数
同时,不断根据前向计算图进行递归的反向传播函数调用,最后到达输入张量,即可求得每个权重张量对应的梯度张量。
- 损失函数优化:优化器直接绑定在了权重张量上
Pytorch包结构(书P51-58)
-
Pytorch中的函数或者方法,以下划线结尾——这个方法会直接改变作用张量的值(无返回值) 比如: torch.Tensor模块中的Tensor.add_ ; torch.nn.init模块中的torch.nn.init.uniform_均匀初始化/torch.nn.init.normal_正态分布归一化等
-
16个主要模块:
torch 模块(包含了一些常用的激活函数relu等),操作对象是张量(传入的参数:张量) torch.zeros:生成元素全为0的张量;torch.random产生元素服从标准正态分布的张量
torch.Tensor 模块(定义张量类型,张量的运算)
torch.sparse 模块(稀疏张量)
torch.cuda 模块(cuda运算相关的一系列函数)
torch.nn 模块(Pytorch神经网络模块化的核心) torch.nn有一系列损失函数,还定义了比如:卷积层nn.ConvNd(N=1,2,3) 和 线性层(全连接层)nn.Linear 等
构建深度学习模型时,可以继承nn.Module类并重写forward方法来实现一个新的神经网络
torch.nn.functional函数模块(卷积函数和池化函数等,还有一些不常用的激活函数elu等) 比如:nn.ConvNd模块(N=1,2,3)会调用 torch.nn.functional.convNd函数(N=1,2,3)
torch.nn.init 模块(定义了神经网络权重的初始化)
torch.optim 模块(优化器(比如S(stochastic)GD随机梯度下降),还包括学习率衰减的算法子模块)
torch.autograd 模块(Pytorch自动微分算法模块,比如torch.autograd.backword求得损失函数之后反向梯度传播)
torch.distributed 模块 (分布式计算模块,提供Pytorch并行运行环境,支持的后端有MPI,Gloo和NCCL)
Pytorch分布式工作原理:
- 启动多个并行的进程,每个进程都拥有一个模型的备份
- 输入不同的训练数据到多个并行的进程中,计算损失函数
- 每个进程独立地反向传播
- 最后对所有进程的权重张量的梯度进行归约(Reduce)
torch.distributions模块 (torch.distributions.Categorical来采样,生成概率采样过程的计算图)
torch.hub 模块 (torch.hub.list函数获取某个模型镜像站点的模型信息)
13.torch.jit 模块 (jit:just-in-time 即时编译器,把Pytorch的动态图转换成可以优化和序列化的静态图)
torch.multiprocessing 模块 (定义了多进程的API)
torch.random 模块 (设置随机数生成器缩写 [RNG][Random number Generator] get_rng_state函数: 获取当前随机数生成器状态; set_rng_state函数:设置~状态
manual_seed 函数:设置随机种子; initial_seed 函数:得到程序初始的随机种子
- torch.onnx 模块 (导出神经网络的格式为:神经网络交换格式(Open nueral network exchange format),存储连接方式和权重)
附录——B站学习(Pytorch神经网络基础+构建第一个神经网络)(P6-17)
1. P7—— Torch 和 Numpy对比
2. P9-10—— activation function
在卷积神经网络 Convolutional neural networks 的卷积层中, 推荐的激励函数是 relu. 在循环神经网络中 recurrent neural networks, 推荐的是 tanh 或者是 relu
Warning:在In[25]中,最新写法可以改为: y_sigmoid=torch.sigmoid(x).data.numpy() y_tanh=torch.tanh(x).data.numpy()
构建第一个神经网络
- 基本步骤
- 数据集
- 构建神经网络(class Net)
- 训练神经网络
3. P11—— Regression(关系拟合/回归)
画动图😊😊😊:www.cnblogs.com/picassooo/p…
- 一来一回把所有数据训练完成了(一来:前向传播一次;一回:反向传播一次-》即一个epoch(迭代期)) 这里t=100,即有100个epoch,但if t%5==0的条件筛选:得到5个epoch 跳出一张图
- 这里是把所有数据丢了进去
- 如果定义了batchsize的大小的话,即比如说总共数据量为100,batchsize=10,那么一来一回10次,才训练完所有数据,即一个epoch~
- 保存
- 提取
4. P12—— Classification
5. P13&14&15—— 快速搭建,批量训练等
- 定义神经网络
可以看出torch.nn.ReLU() 这里ReLU()是一个类;而method1中F.relu——是一个函数
net1
的好处就是, 你可以根据你的个人需要更加个性化你自己的前向传播过程, 比如(RNN). 不过如果你不需要七七八八的过程, 相信net2
这种形式更适合你.
- 批训练(mini-batch training)
Torch 中提供了一种帮你整理你的数据结构的好东西, 叫做 DataLoader
, 我们能用它来包装自己的数据, 进行批训练而且批训练可以有很多种途径。
- shuffle=True和False的区别
- 当BATCH_SIZE不能被数据总量10整除时,会在STEP 1先分出BATCH_SIZE的大小数据,在STEP 2分出剩余数据
6. P16&17—— Optimizer
- Code: