PyTorch最好的资料是官方文档。本文是PyTorch常用代码段,在参考资料[1](张皓:PyTorch Cookbook)的基础上做了一些修补,方便使用时查阅。

1. 基本配置

导入包和版本查询

import 

可复现性

在硬件设备(CPU、GPU)不同时,完全的可复现性无法保证,即使随机种子相同。但是,在同一个设备上,应该保证可复现性。具体做法是,在程序开始的时候固定torch的随机种子,同时也把numpy的随机种子固定。

np

显卡设置

如果只需要一张显卡

# Device configuration

如果需要指定多张显卡,比如0,1号显卡。

import 

也可以在命令行运行代码时设置显卡:

CUDA_VISIBLE_DEVICES=0,1 python train.py

清除显存

torch

也可以使用在命令行重置GPU的指令

nvidia-smi --gpu-reset -i [gpu_id]

2. 张量(Tensor)处理

张量的数据类型

PyTorch有9种CPU张量类型和9种GPU张量类型。

张量基本信息

tensor 

命名张量

张量命名是一个非常有用的方法,这样可以方便地使用维度的名字来做索引或其他操作,大大提高了可读性、易用性,防止出错。

# 在PyTorch 1.3之前,需要使用注释

数据类型转换

# 设置默认类型,pytorch中的FloatTensor远远快于DoubleTensor

torch.Tensor与np.ndarray转换

除了CharTensor,其他所有CPU上的张量都支持转换为numpy格式然后再转换回来。

ndarray 

Torch.tensor与PIL.Image转换

# pytorch中的张量默认采用[N, C, H, W]的顺序,并且数据范围在[0,1],需要进行转置和规范化

np.ndarray与PIL.Image的转换

image 

从只包含一个元素的张量中提取值

value 

张量形变

# 在将卷积层输入全连接层的情况下通常需要对张量做形变处理,

打乱顺序

tensor 

水平翻转

# pytorch不支持tensor[::-1]这样的负步长操作,水平翻转可以通过张量索引实现

复制张量

# Operation                 |  New/Shared memory | Still in computation graph |
tensor.clone()            # |        New         |          Yes               |
tensor.detach()           # |      Shared        |          No                |
tensor.detach.clone()()   # |        New         |          No                |

张量拼接

'''

将整数标签转为one-hot编码

# pytorch的标记默认从0开始

得到非零元素

torch

判断两个张量相等

torch

张量扩展

# Expand tensor of shape 64*512 to shape 64*512*7*7.

矩阵乘法

# Matrix multiplcation: (m*n) * (n*p) * -> (m*p).

计算两组数据之间的两两欧式距离

利用broadcast机制

dist = torch.sqrt(torch.sum((X1[:,None,:] - X2) ** 2, dim=2))

3. 模型定义和操作

一个简单两层卷积网络的示例

# convolutional neural network (2 convolutional layers)

卷积层的计算和展示可以用这个网站辅助。

双线性汇合(bilinear pooling)

X 

多卡同步 BN(Batch normalization)

当使用 torch.nn.DataParallel 将代码运行在多张 GPU 卡上时,PyTorch 的 BN 层默认操作是各卡上数据独立地计算均值和标准差,同步 BN 使用所有卡上的数据一起计算 BN 层的均值和标准差,缓解了当批量大小(batch size)比较小时对均值和标准差估计不准的情况,是在目标检测等任务中一个有效的提升性能的技巧。

sync_bn 

将已有网络的所有BN层改为同步BN层

def 

类似 BN 滑动平均

如果要实现类似 BN 滑动平均的操作,在 forward 函数中要使用原地(inplace)操作给滑动平均赋值。

class 

计算模型整体参数量

num_parameters 

查看网络中的参数

可以通过model.state_dict()或者model.named_parameters()函数查看现在的全部可训练参数(包括通过继承得到的父类中的参数)

params 

模型可视化(使用pytorchviz)

szagoruyko/pytorchviz​github.com

类似 Keras 的 model.summary() 输出模型信息(使用pytorch-summary

sksq96/pytorch-summary​github.com

模型权重初始化

注意 model.modules() 和 model.children() 的区别:model.modules() 会迭代地遍历模型的所有子层,而 model.children() 只会遍历模型下的一层。

# Common practise for initialization.

提取模型中的某一层

modules()会返回模型中所有模块的迭代器,它能够访问到最内层,比如self.layer1.conv1这个模块,还有一个与它们相对应的是name_children()属性以及named_modules(),这两个不仅会返回模块的迭代器,还会返回网络层的名字。

# 取模型中的前两层

部分层使用预训练模型

注意如果保存的模型是 torch.nn.DataParallel,则当前的模型也需要是

model

将在 GPU 保存的模型加载到 CPU

model

导入另一个模型的相同部分到新的模型

模型导入参数时,如果两个模型结构不一致,则直接导入参数会报错。用下面方法可以把另一个模型的相同的部分导入到新的模型中。

# model_new代表新的模型

4. 数据处理

计算数据集的均值和标准差

import 

得到视频数据基本信息

import 

TSN 每段(segment)采样一帧视频

K 

常用训练和验证数据预处理

其中 ToTensor 操作会将 PIL.Image 或形状为 H×W×D,数值范围为 [0, 255] 的 np.ndarray 转换为形状为 D×H×W,数值范围为 [0.0, 1.0] 的 torch.Tensor。

train_transform 

5. 模型训练和测试

分类模型训练代码

# Loss and optimizer

分类模型测试代码

# Test the model

自定义loss

继承torch.nn.Module类写自己的loss。

class 

标签平滑(label smoothing)

写一个label_smoothing.py的文件,然后在训练代码里引用,用LSR代替交叉熵损失即可。label_smoothing.py内容如下:

import 

或者直接在训练文件里做label smoothing

for 

Mixup训练

beta_distribution 

L1 正则化

l1_regularization 

不对偏置项进行权重衰减(weight decay)

pytorch里的weight decay相当于l2正则

bias_list 

梯度裁剪(gradient clipping)

torch

得到当前学习率

# If there is one global learning rate (which is the common case).

另一种方法,在一个batch训练代码里,当前的lr是optimizer.param_groups[0]['lr']

学习率衰减

# Reduce learning rate when validation accuarcy plateau.

优化器链式更新

从1.4版本开始,torch.optim.lr_scheduler 支持链式更新(chaining),即用户可以定义两个 schedulers,并交替在训练中使用。

import 

模型训练可视化

PyTorch可以使用tensorboard来可视化训练过程。

安装和运行TensorBoard。

pip install tensorboard
tensorboard --logdir=runs

使用SummaryWriter类来收集和可视化相应的数据,放了方便查看,可以使用不同的文件夹,比如'Loss/train'和'Loss/test'。

from 

保存与加载断点

注意为了能够恢复训练,我们需要同时保存模型和优化器的状态,以及当前的训练轮数。

start_epoch 

提取 ImageNet 预训练模型某层的卷积特征

# VGG-16 relu5-3 feature.

提取 ImageNet 预训练模型多层的卷积特征

class 

微调全连接层

model 

以较大学习率微调全连接层,较小学习率微调卷积层

model 

6. 其他注意事项

  • 不要使用太大的线性层。因为nn.Linear(m,n)使用的是

    的内存,线性层太大很容易超出现有显存。
  • 不要在太长的序列上使用RNN。因为RNN反向传播使用的是BPTT算法,其需要的内存和输入序列的长度呈线性关系。
  • model(x) 前用 model.train() 和 model.eval() 切换网络状态。
  • 不需要计算梯度的代码块用 with torch.no_grad() 包含起来。
  • model.eval() 和 torch.no_grad() 的区别在于,model.eval() 是将网络切换为测试状态,例如 BN 和dropout在训练和测试阶段使用不同的计算方法。torch.no_grad() 是关闭 PyTorch 张量的自动求导机制,以减少存储使用和加速计算,得到的结果无法进行 loss.backward()。
  • model.zero_grad()会把整个模型的参数的梯度都归零, 而optimizer.zero_grad()只会把传入其中的参数的梯度归零.
  • torch.nn.CrossEntropyLoss 的输入不需要经过 Softmax。torch.nn.CrossEntropyLoss 等价于 torch.nn.functional.log_softmax + torch.nn.NLLLoss。
  • loss.backward() 前用 optimizer.zero_grad() 清除累积梯度。
  • torch.utils.data.DataLoader 中尽量设置 pin_memory=True,对特别小的数据集如 MNIST 设置 pin_memory=False 反而更快一些。num_workers 的设置需要在实验中找到最快的取值。
  • 用 del 及时删除不用的中间变量,节约 GPU 存储。
  • 使用 inplace 操作可节约 GPU 存储,如
x 

  • 减少 CPU 和 GPU 之间的数据传输。例如如果你想知道一个 epoch 中每个 mini-batch 的 loss 和准确率,先将它们累积在 GPU 中等一个 epoch 结束之后一起传输回 CPU 会比每个 mini-batch 都进行一次 GPU 到 CPU 的传输更快。
  • 使用半精度浮点数 half() 会有一定的速度提升,具体效率依赖于 GPU 型号。需要小心数值精度过低带来的稳定性问题。
  • 时常使用 assert tensor.size() == (N, D, H, W) 作为调试手段,确保张量维度和你设想中一致。
  • 除了标记 y 外,尽量少使用一维张量,使用 n*1 的二维张量代替,可以避免一些意想不到的一维张量计算结果。
  • 统计代码各部分耗时
with 

  • 使用TorchSnooper来调试PyTorch代码,程序在执行的时候,就会自动 print 出来每一行的执行结果的 tensor 的形状、数据类型、设备、是否需要梯度的信息。
# pip install torchsnooper

https://github.com/zasdfgbnm/TorchSnooper​github.com

  • 模型可解释性,使用captum库

https://captum.ai/​captum.ai

参考资料:

  1. 张皓:PyTorch Cookbook(常用代码段整理合集)
  2. PyTorch官方文档和示例
  3. https://pytorch.org/docs/stable/notes/faq.html
  4. https://github.com/szagoruyko/pytorchviz
  5. https://github.com/sksq96/pytorch-summary
  6. 其他

pytorch nonzero_[深度学习框架]PyTorch常用代码段相关推荐

  1. DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略

    DL框架之PyTorch:PyTorch的简介.安装.使用方法之详细攻略 DL框架之PyTorch:深度学习框架PyTorch的简介.安装.使用方法之详细攻略 目录 PyTorch的简介 1.pyto ...

  2. DL:深度学习框架Pytorch、 Tensorflow各种角度对比

    DL:深度学习框架Pytorch. Tensorflow各种角度对比 目录 先看两个框架实现同样功能的代码 1.Pytorch.Tensorflow代码比较 2.Tensorflow(数据即是代码,代 ...

  3. 一篇文章入门深度学习框架PyTorch

    一篇文章入门深度学习框架PyTorch 1 Tensor(张量) 2 Variable(变量) 3 Dataset(数据集) 4 nn.Module(模组) 5 torch.optim(优化) 一阶优 ...

  4. numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践

    <<深度学习框架PyTorch入门与实践>>读书笔记 <深度学习框架PyTorch入门与实践>读后感 小作者:马苗苗  读完<<深度学习框架PyTorc ...

  5. 深度学习框架PyTorch快速开发与实战

    深度学习框架PyTorch快速开发与实战 邢梦来,王硕,孙洋洋 著 ISBN:9787121345647 包装:平装 开本:16开 用纸:胶版纸 正文语种:中文 出版社:电子工业出版社 出版时间:20 ...

  6. 好书分享——《深度学习框架PyTorch:入门与实践》

    内容简介 : <深度学习框架PyTorch:入门与实践>从多维数组Tensor开始,循序渐进地带领读者了解PyTorch各方面的基础知识.结合基础知识和前沿研究,带领读者从零开始完成几个经 ...

  7. Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配、对应版本安装之详细攻略

    Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配.对应版本安装之详细攻略 目录 深度学习中pytorch/torchvision版本和CUDA版本最正确 ...

  8. 人脸口罩检测现开源PyTorch、TensorFlow、MXNet等全部五大主流深度学习框架模型和代码...

    号外!号外! 现在,AIZOO开源PyTorch.TensorFlow.MXNet.Keras和Caffe五大主流深度学习框架的人脸检测模型和代码啦! 先附上Github链接为敬. https://g ...

  9. 很火的深度学习框架PyTorch怎么用?手把手带你安装配置

    导读:本文主要介绍PyTorch的一些基础且常用的概念和模块,以及: 为何选择PyTorch. PyTorch环境的安装与配置. 作者:吴茂贵 郁明敏 杨本法 李涛 张粤磊 来源:大数据DT(ID:b ...

  10. 深度学习框架Pytorch入门与实践——读书笔记

    2 快速入门 2.1 安装和配置 pip install torch pip install torchvision#IPython魔术命令 import torch as t a=t.Tensor( ...

最新文章

  1. Vue中怎样封装与使用公共状态属性组件实现类似枚举类的效果
  2. SSM整合时配置文件的编写
  3. Linux流量监控工具 (实时)-适用于centos 当然也兼容RHEL
  4. [转载]二叉树先序、中序、后序三种遍历的非递归算法
  5. 分布式集群架构场景解决方案学习笔记
  6. C++设计模式之Adapter
  7. Ubuntu14.04安装及配置mysql5.7.19
  8. 中国净水装置行业市场供需与战略研究报告
  9. Triangle Generative Adversarial Networks
  10. checking for spandsp >= 3.0... configure: error: no usable spandsp; please install spandsp3 devel pa
  11. CCF-A类+B类+C类(2019)
  12. c语言abs作用是什么意思,c语言中函数abs和fabs有什么区别?
  13. docker学习之docker hub寻宝游戏
  14. win7修复计算机 报错6,Win7系统出现APPCRASH错误怎么解决
  15. java裁剪图片_java实现图片的缩放和裁剪
  16. 0315-HttpURLConnection和JASON结合使用(以天气预报为例)
  17. 6-5 Approximating Eigenvalues (40分)
  18. 声波正演c语言程序,二维频率域声波方程正演模拟
  19. CSS学习笔记(未完)
  20. 厚涂与平涂的区别是什么,学哪个会好一点?

热门文章

  1. Python2 和 pip2 存在, Python3 也存在,但是 pip3 不存在的解决办法
  2. linux安装Linux下软件的安装与卸载方法
  3. 从caffe2 开源的代码中抽取 用于加载已训练神经网络参数,使用CPU进行预测的 部分代码,并运行成功一个预测模型...
  4. webpack + react
  5. Elasticsearch: 配置文件详解
  6. 5-01表达基本概念
  7. c++的准备知识18
  8. C#用链式方法表达循环嵌套
  9. Compiling XORP v1.2 in Debian 3.1
  10. NLP提效,除了选择合适的模型,就是数据增强了