pytorch nonzero_[深度学习框架]PyTorch常用代码段
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/pytorchvizgithub.com
类似 Keras 的 model.summary() 输出模型信息(使用pytorch-summary )
sksq96/pytorch-summarygithub.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/TorchSnoopergithub.com
- 模型可解释性,使用captum库
https://captum.ai/captum.ai
参考资料:
- 张皓:PyTorch Cookbook(常用代码段整理合集)
- PyTorch官方文档和示例
- https://pytorch.org/docs/stable/notes/faq.html
- https://github.com/szagoruyko/pytorchviz
- https://github.com/sksq96/pytorch-summary
- 其他
pytorch nonzero_[深度学习框架]PyTorch常用代码段相关推荐
- DL框架之PyTorch:深度学习框架PyTorch的简介、安装、使用方法之详细攻略
DL框架之PyTorch:PyTorch的简介.安装.使用方法之详细攻略 DL框架之PyTorch:深度学习框架PyTorch的简介.安装.使用方法之详细攻略 目录 PyTorch的简介 1.pyto ...
- DL:深度学习框架Pytorch、 Tensorflow各种角度对比
DL:深度学习框架Pytorch. Tensorflow各种角度对比 目录 先看两个框架实现同样功能的代码 1.Pytorch.Tensorflow代码比较 2.Tensorflow(数据即是代码,代 ...
- 一篇文章入门深度学习框架PyTorch
一篇文章入门深度学习框架PyTorch 1 Tensor(张量) 2 Variable(变量) 3 Dataset(数据集) 4 nn.Module(模组) 5 torch.optim(优化) 一阶优 ...
- numpy pytorch 接口对应_拆书分享篇深度学习框架PyTorch入门与实践
<<深度学习框架PyTorch入门与实践>>读书笔记 <深度学习框架PyTorch入门与实践>读后感 小作者:马苗苗 读完<<深度学习框架PyTorc ...
- 深度学习框架PyTorch快速开发与实战
深度学习框架PyTorch快速开发与实战 邢梦来,王硕,孙洋洋 著 ISBN:9787121345647 包装:平装 开本:16开 用纸:胶版纸 正文语种:中文 出版社:电子工业出版社 出版时间:20 ...
- 好书分享——《深度学习框架PyTorch:入门与实践》
内容简介 : <深度学习框架PyTorch:入门与实践>从多维数组Tensor开始,循序渐进地带领读者了解PyTorch各方面的基础知识.结合基础知识和前沿研究,带领读者从零开始完成几个经 ...
- Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配、对应版本安装之详细攻略
Pytorch:深度学习中pytorch/torchvision版本和CUDA版本最正确版本匹配.对应版本安装之详细攻略 目录 深度学习中pytorch/torchvision版本和CUDA版本最正确 ...
- 人脸口罩检测现开源PyTorch、TensorFlow、MXNet等全部五大主流深度学习框架模型和代码...
号外!号外! 现在,AIZOO开源PyTorch.TensorFlow.MXNet.Keras和Caffe五大主流深度学习框架的人脸检测模型和代码啦! 先附上Github链接为敬. https://g ...
- 很火的深度学习框架PyTorch怎么用?手把手带你安装配置
导读:本文主要介绍PyTorch的一些基础且常用的概念和模块,以及: 为何选择PyTorch. PyTorch环境的安装与配置. 作者:吴茂贵 郁明敏 杨本法 李涛 张粤磊 来源:大数据DT(ID:b ...
- 深度学习框架Pytorch入门与实践——读书笔记
2 快速入门 2.1 安装和配置 pip install torch pip install torchvision#IPython魔术命令 import torch as t a=t.Tensor( ...
最新文章
- Vue中怎样封装与使用公共状态属性组件实现类似枚举类的效果
- SSM整合时配置文件的编写
- Linux流量监控工具 (实时)-适用于centos 当然也兼容RHEL
- [转载]二叉树先序、中序、后序三种遍历的非递归算法
- 分布式集群架构场景解决方案学习笔记
- C++设计模式之Adapter
- Ubuntu14.04安装及配置mysql5.7.19
- 中国净水装置行业市场供需与战略研究报告
- Triangle Generative Adversarial Networks
- checking for spandsp >= 3.0... configure: error: no usable spandsp; please install spandsp3 devel pa
- CCF-A类+B类+C类(2019)
- c语言abs作用是什么意思,c语言中函数abs和fabs有什么区别?
- docker学习之docker hub寻宝游戏
- win7修复计算机 报错6,Win7系统出现APPCRASH错误怎么解决
- java裁剪图片_java实现图片的缩放和裁剪
- 0315-HttpURLConnection和JASON结合使用(以天气预报为例)
- 6-5 Approximating Eigenvalues (40分)
- 声波正演c语言程序,二维频率域声波方程正演模拟
- CSS学习笔记(未完)
- 厚涂与平涂的区别是什么,学哪个会好一点?
热门文章
- Python2 和 pip2 存在, Python3 也存在,但是 pip3 不存在的解决办法
- linux安装Linux下软件的安装与卸载方法
- 从caffe2 开源的代码中抽取 用于加载已训练神经网络参数,使用CPU进行预测的 部分代码,并运行成功一个预测模型...
- webpack + react
- Elasticsearch: 配置文件详解
- 5-01表达基本概念
- c++的准备知识18
- C#用链式方法表达循环嵌套
- Compiling XORP v1.2 in Debian 3.1
- NLP提效,除了选择合适的模型,就是数据增强了