01.PyTorch工具库简介
1.1 从torch到PyTorch
torch:
- 利用LuaJIT编译器——提高了性能
- 基于C的NVIDIA CUDA扩展使得Torch能够利用GPU加速
PyTorch: - PyTorch = Python + Torch,Torch的Python版,并增加了很多功能
- Python的应用比Lua更加广
- 保留了基于GPU的硬件加速,提高最大灵活度和速度
- Python编写代码时用
import torch
引入
1.2 为什么要用PyTorch
1>动态计算图,可以根据计算需要实时改变计算图
2>动态计算机制使得调试更加容易
3>动态计算更加适用于自然语言处理
4>传统的面向对象编程风格
1.3 静态图计算与动态图计算
静态图计算——程序在编译执行时将先生成神经网络的结构,然后再执行相应的操作,类似于“惰性计算”。
动态图计算——程序按照编写命令的顺序进行执行
同等情况下,静态可以更好的优化,而动态更加容易调试
02.张量、梯度和自动求导
2.1 定义张量
PyTorch 0.4.0之前只能用Variable
包装器的方法定义张量:
a = Variable(torch.randn(5,5))
PyTorch 0.4.0之后保留原始定义方法外,还可用torch.tensor
方法定义张量。
a = torch.tensor([1,2,3])
a = Variable(torch.randn(5,5))
2.2 张量计算加速
张量计算可通过GPU加速,提供自动求导机制,且PyTorch可以将张量存放于CPU或GPU中,可以大幅加速计算。
2.3 自动求导机制
每个变量都有一个标记 (梯度请求)requires_grad
。它允许从梯度计算中排除子图,提高效率;
a = Variable(torch.randn(5,5),requires_grad = True) # requires_grad默认是False
当表达式的所有输入都不需要梯度计算时,表达式结果不会输出梯度
x = Variable(torch.randn(5,5)) # 默认不请求梯度计算
y = Variable(torch.randn(5,5)) # 默认不请求梯度计算
x = Variable(torch.randn(5,5),requires_grad = True)
a = x + y # x,y都不请求梯度计算,a也不请求
a.requires_grad # 输出False
b = a + z # z请求梯度计算,b也请求
a.requires_grad # 输出True
当想要冻结部分模型,做模型优化微调finetuning时,这个参数十分实用。
PyTorch 0.4.0之前用volatile
自动求导,现已被弃用。
PyTorch 0.4.0之后,用torch.no_grad()/torch.set_grad_enabled(grad_mode)
表示是否求导,不再考虑递推,已经换成了一套更加灵活的上下文管理方式。代码如下:
x = torch.zeros(1,requires_grad = True)
with torch.no_grad(): # 通过with限定不可求导 的范围
y = x * 2
y.requires_grad # 输出False
is_train = False
with torch.set_grad_enabled(is_train): # 设置这一部分要不要放到计算图
y = x * 2
y.requires_grad # 输出False
torch.set_grad_enabled(True): # 不要with,也可直接使用
y = x * 2
y.requires_grad # 输出True
torch.set_grad_enabled(False): # 不要with,也可直接使用
y = x * 2
y.requires_grad # 输出False
2.4 PyTorch基础
可以参考我上传的资源pytorch模型基本代码.tar.gz中的PyTorch基础.ipynb
文件
03.基于PyTorch的基础模型搭建
可以参考我上传的资源pytorch模型基本代码.tar.gz中的线性回归和逻辑回归文件
04.基于PyTorch的多层感知器搭建
可以参考我上传的资源pytorch模型基本代码.tar.gz中的多层感知器文件
05.基于PyTorch的神经网络搭建
可以参考我上传的资源pytorch模型基本代码.tar.gz的CNN和RNN文件
注明:学习参考网易云课堂《深度学习工程师(实战)》