PyTorch-Part1
PyTorch-Part1——基本概念
[TOC]
资源汇总(后续放入总结篇)
- PyTorch-handbook 中文手册:与 PyTorch 版本保持一致。
- 《Pytorch模型训练实用教程》:PyTorch 模型训练方面的干货教程。特别工业化,真的非常棒。
- PyTorch官方教程中文版:标准教程,主要是因为有stn。
- 《深度学习框架PyTorch:入门与实践》:理论和实战,动漫头像生成器。
- Awesome-Pytorch-list:庞大的 PyTorch 资源库。
- PyTorch Examples:入门案例,可以在这个基础上增改自己的代码。
- PyTorch Forums:PyTorch 官方论坛,可以经常翻阅,减少弯路。
本篇笔记只记录 PyTorch 常用操作
- 按照训练顺序记录各步骤常用方法
- 实战干货总结
- 不同网络案例代码
- 底层剖析与数学原理
- tf1转pytorch
Pytorch 简介
- Torch 是一个与 Numpy 类似的张量(Tensor)操作库,与 Numpy 不同的是 Torch 对GPU支持的很好,Lua 是 Torch 的上层包装。
- PyTorch 和 Torch 使用包含所有相同性能的C库:TH, THC, THNN, THCUNN,只是使用了不同的上层包装语言。
- PyTorch 框架设计相当简洁优雅且高效快速。
- 与 google 的 Tensorflow 类似,FAIR 的支持足以确保 PyTorch 获得持续的开发更新。
- PyTorch 拥有完善的文档,作者亲自维护论坛。
PyTorch 安装与测试
PyTorch 官网:https://pytorch.org/
CUDA安装:https://blog.csdn.net/Mind_programmonkey/article/details/99688839/
测试安装:
1
2
3import torch
torch.__version__
torch.cuda.is_available()https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html)
张量
创建张量
- 快速测试可以经常使用
torch.rand()
。
1 | import torch |
- 可以好好体会下面一个例子:
batch_size=2 channel=3 size=(h=4, w=5)
1 | 2, 3, 4, 5), dtype=torch.float, requires_grad=True) x = torch.rand(( |
操作张量
- 加法
1 | import torch |
任何 以
_
结尾的操作都会用结果替换原变量。例如:x.copy_(y)
、x.t_()
,都会改变x
。
- 使用索引切片操作张量
1 | x = torch.ones(5, 3) |
torch.view()
:改变张量的维度和大小
1 | x = torch.rand((4, 4), dtype=torch.float) |
.item()
:以Python数据类型获取张量中的数值
1 | x = torch.randn(1) |
100+ Tensor operations, including transposing, indexing, slicing, mathematical operations, linear algebra, random numbers, etc., are described here https://pytorch.org/docs/torch.
NumPy 转换
Torch Tensor与NumPy数组共享底层内存地址,修改任何一个都会导致另一个变化。
.numpy()
:将一个 Torch Tensor 转换为 NumPy 数组
1 | a = torch.ones(5) # tensor([1., 1., 1., 1., 1.]) |
torch.from_numpy(a)
:NumPy Array 转化成 Torch Tensor
1 | a = np.ones(5) |
CUDA 张量
torch.device("cuda:0")
:参数可以为"cuda:0"/"cuda"/"cpu"
。device参数
:可传参同上。.to(device)
:可以指定数据类型,也移动到指定设备。- 同时指定时顺序需要为:
.to(device, torch.float)
- 注意:只调用
.to("cuda")
并没有复制张量到 GPU 上,而是返回了一个 copy。所以,需要把它赋值给一个新的张量并在GPU上使用这个张量。
- 同时指定时顺序需要为:
1 | x = torch.randn(3) |
自动求导机制(Autograd)
-
torch.autograd
包是 PyTorch 中所有神经网络的核心,它为张量上的所有操作提供了自动求导。 -
torch.autograd
是一个在运行时定义的框架,这意味着反向传播是根据你的代码来确定如何运行,并且每次迭代可以是不同的。
张量(Tensor)
torch.Tensor
是这个包的核心类。- 如果设置
.requires_grad=True
,那么将会追踪所有对于该张量的操作。当完成计算后通过调用.backward()
,自动计算所有的梯度,这个张量的所有梯度将会积累到.grad
属性。 - 要阻止张量跟踪历史记录,可以调用
.detach()
方法将其与计算历史记录分离,并禁止跟踪它将来的计算记录。 - 为了防止跟踪历史记录(和使用内存),可以将代码块包装在
with torch.no_grad():
中。在评估模型时特别有用,因为模型可能具有requires_grad = True
的可训练参数,但是我们不需要梯度计算。
- 如果设置
在自动梯度计算中还有另外一个重要的类
Function
.Tensor
和Function
互相连接并生成一个非循环图,它表示和存储了完整的计算历史。每个张量都有一个.grad_fn
属性,这个属性引用了一个创建了Tensor
的Function
(除非这个张量是用户手动创建的,即,这个张量的grad_fn
是None
)。- 如果需要计算导数,你可以在
Tensor
上调用.backward()
。 如果Tensor
是一个标量(即它包含一个元素数据)则不需要为backward()
指定任何参数,但是如果它有更多的元素,你需要指定一个gradient
参数来匹配张量的形状。
在其他的文章中可能会看到说将 Tensor 包裹到 Variable 中提供自动梯度计算。Variable 在0.41版中已经被标注为过期了,现在可以直接使用 Tensor,官方文档:https://pytorch.org/docs/stable/autograd.html#variable-deprecated
1 | x = torch.ones(2, 2, requires_grad=True) |
梯度
1 | # 现在让我们来看一个vector-Jacobian product的例子 |
autograd
和Function
的官方文档 https://pytorch.org/docs/autograd
model.train():
在使用pytorch构建神经网络的时候,训练过程中会在程序上方添加一句model.train(),作用是启用batch normalization和drop out。
model.eval():
测试过程中会使用model.eval(),这时神经网络会沿用batch normalization的值,并不使用drop out。