1. prefetch_generator

使用 prefetch_generator库 在后台加载下一batch的数据,原本PyTorch默认的DataLoader会创建一些worker线程来预读取新的数据,但是除非这些线程的数据全部都被清空,这些线程才会读下一批数据。使用prefetch_generator,我们可以保证线程不会等待,每个线程都总有至少一个数据在加载。

  • 安装

    pip install prefetch_generator
  • 使用

    之前加载数据集的正确方式是使用torch.utils.data.DataLoader,现在我们只要利用这个库,新建个DataLoaderX类继承DataLoader并重写__iter__方法即可

    from torch.utils.data import DataLoader
    from prefetch_generator import BackgroundGenerator class DataLoaderX(DataLoader): def __iter__(self):
    return BackgroundGenerator(super().__iter__())

    之后这样用:

    train_dataset = MyDataset(".........")
    train_loader = DataLoaderX(dataset=train_dataset,
    batch_size=batch_size, num_workers=4, shuffle=shuffle)

2. Apex

2.1 安装

  1. 克隆源代码
git clone https://github.com/NVIDIA/apex

可以先下载到码云,再下载到本地

  1. 安装apex
cd apex
python setup.py install

最好打开PyCharm的终端进行安装,这样实在Anaconda的环境里安装了

  1. 删除刚刚clone下来的apex文件夹,然后重启PyCharm

【注意】安装PyTorch和cuda时注意版本对应,要按照正确流程安装

  1. 测试安装成功
from apex import amp

如果导入不报错说明安装成功

2.2 使用

from apex import amp  # 这个必须的,其他的导包省略了

train_dataset = MyDataset("......")
train_loader = DataLoader(dataset=train_dataset, batch_size=2, num_workers=4, shuffle=True) model = MyNet().to(device) # 创建模型 criterion = nn.MSELoss() # 定义损失函数 optimizer = optim.Adam(net.parameters(), lr=learning_rate, weight_decay=0.00001) # 优化器 net, optimizer = amp.initialize(net, optimizer, opt_level="O1") # 这一步很重要 # 学习率衰减
scheduler = optim.lr_scheduler.ReduceLROnPlateau(
optimizer=optimizer, mode="min",factor=0.1, patience=3,
verbose=False,cooldown=0, min_lr=0.0, eps=1e-7) for epoch in range(epochs):
net.train() # 训练模式 train_loss_epoch = [] # 记录一个epoch内的训练集每个batch的loss
test_loss_epoch = [] # 记录一个epoch内测试集的每个batch的loss for i, data in enumerate(train_loader):
# forward
x, y = data
x = x.to(device)
y = y.to(device) outputs = net(x) # backward
optimizer.zero_grad() loss = criterion(outputs, labels) # 这一步也很重要
with amp.scale_loss(loss, optimizer) as scaled_loss:
scaled_loss.backward() # 更新权重
optimizer.step() scheduler.step(1) # 更新学习率。每1步更新一次
  • 主要是添加了三行代码
  • scaled_loss 是将原loss放大了,所以要保存loss应该保存之前的值,这种放大防止梯度消失

考察amp.initialize(net, optimizer, opt_level="O1")opt_level参数

  • opt_level=O0(base)

    表示的是当前执行FP32训练,即正常的训练

  • opt_level=O1(推荐)

    表示的是当前使用部分FP16混合训练

  • opt_level=O2

    表示的是除了BN层的权重外,其他层的权重都使用FP16执行训练

  • opt_level=O3

    表示的是默认所有的层都使用FP16执行计算,当keep_batch norm_fp32=True,则会使用cudnn执行BN层的计算,该优化等级能够获得最快的速度,但是精度可能会有一些较大的损失

一般我们用O1级别就行,最多O2,注意,是不是

『PyTorch』屌丝的PyTorch玩法的更多相关文章

  1. 『PyTorch』第十二弹_nn.Module和nn.functional

    大部分nn中的层class都有nn.function对应,其区别是: nn.Module实现的layer是由class Layer(nn.Module)定义的特殊类,会自动提取可学习参数nn.Para ...

  2. 『PyTorch』第九弹_前馈网络简化写法

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下 在前面的例子中,基本上都是将每一层的输出直接作为下一层的 ...

  3. 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下

    『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...

  4. 『PyTorch』第三弹重置_Variable对象

    『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...

  5. 『PyTorch』第二弹重置_Tensor对象

    『PyTorch』第二弹_张量 Tensor基础操作 简单的初始化 import torch as t Tensor基础操作 # 构建张量空间,不初始化 x = t.Tensor(5,3) x -2. ...

  6. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  7. 『TensorFlow』专题汇总

    TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...

  8. 『Python』__getattr__()特殊方法

    self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict): def __init__(self, **kw) ...

  9. 『TensorFlow』流程控制

    『PyTorch』第六弹_最小二乘法对比PyTorch和TensorFlow TensorFlow 控制流程操作 TensorFlow 提供了几个操作和类,您可以使用它们来控制操作的执行并向图中添加条 ...

随机推荐

  1. 数据结构与算法-排序(十)桶排序(Bucket Sort)

    摘要 桶排序和基数排序类似,相当于基数排序的另外一种逻辑.它是将取值范围当做创建桶的数量,桶的长度就是序列的大小.通过处理比较元素的数值,把元素放在桶的特定位置,然后遍历桶,就可以得到有序的序列. 逻 ...

  2. docker加速器,设置cdn

    添加加速器 vim /etc/docker/daemon.json 添加如下内容 { "registry-mirrors": ["https://registry.doc ...

  3. C#中的几种锁:用户模式锁、内核模式锁、动态计数、监视锁

    参考网址: https://blog.csdn.net/weixin_43989331/article/details/105356008 C#中的几种锁:用户模式锁.内核模式锁.动态计数.监视锁介绍 ...

  4. WPF简易聊天室

    一.聊天界面如下

  5. 链表LinkedList、堆栈Stack、集合Set

    链表LinkedList LinkedList 也像 ArrayList 一样实现了基本的 List 接口,但它在 List 中间执行插入和删除操作时比 ArrayList 更高效.然而,它在随机访问 ...

  6. java js转码

    public static String escape(String src) { int i; char j; StringBuffer tmp = new StringBuffer(); tmp. ...

  7. 【Azure 应用服务】App Service For Windows 环境中部署Python站点后,如何继续访问静态资源文件呢(Serving Static Files)?

    问题描述 当创建一个App Service 后,运行时环境和版本选择Windows 和 Python 3.6. 登录Kudu 站点查看,默认的文件有 web.config, hostingstart- ...

  8. openresty HTTP status constants nginx api for lua

    https://github.com/openresty/lua-nginx-module context: init_by_lua, set_by_lua, rewrite_by_lua, acce ...

  9. 性能测试工具JMeter 基础(一)—— 安装、配置环境变量

    JMeter下载 下载地址:https://jmeter.apache.org/download_jmeter.cgi 下载完成后解压后可直接使用,不用进行安装 环境变量配置 新增变量名:JMETER ...

  10. Mysql常用sql语句(4)- distinct 去重数据

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 我们使用select进行数据查询时是会返回所有匹 ...