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. .net 温故知新:【5】异步编程 async await

    1.异步编程 异步编程是一项关键技术,可以直接处理多个核心上的阻塞 I/O 和并发操作. 通过 C#.Visual Basic 和 F# 中易于使用的语言级异步编程模型,.NET 可为应用和服务提供使 ...

  2. MongoDB使用命令创建用户权错误分析--- 权限不够Error:couldn't add user:command createUser requires authentication

    MongoDB使用命令创建用户权错误分析 错误一:权限不够Error:couldn't add user:command createUser requires authentication. 解决方 ...

  3. Asp.NetCore 中Aop的应用

    前言 其实好多项目中,做一些数据拦截.数据缓存都有Aop的概念,只是实现方式不一样:之前大家可能都会利用过滤器来实现Aop的功能,如果是Asp.NetCore的话,也可能会使用中间件: 而这种实现方式 ...

  4. Java String 综述(上篇)

    摘要: Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情.笔者为了还原String类的真实全貌,先分为上.下两篇博文来综述Java中的S ...

  5. 并发容器之ConcurrentHashMap(转载)

    Java并发编程:并发容器之ConcurrentHashMap(转载) 下面这部分内容转载自: http://www.haogongju.net/art/2350374 1.7与1.8有很大的区别:h ...

  6. 刷题-力扣-剑指 Offer 42. 连续子数组的最大和

    剑指 Offer 42. 连续子数组的最大和 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/lian-xu-zi-shu-zu-de ...

  7. IDEA快捷键命令

    Ctrl+Alt+T   IDEl 抛异常快捷键ctrl +o  继承类时 继承方法快捷键Ctrl+Alt+左右方向键  回到上次光标停留的地方ALt +left/right  快速切换两个页面ctr ...

  8. LeetCode《买卖股票的最佳时机》系列题目,最详解

    目录 说在前面 引例:只能交易一次 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 无限制买卖 一.动态数组定义 二.状态转移方程 三.初始化 四.优化 交易 2 次,最大利润? 一.动态数 ...

  9. 基于SigalR实现的奥运会实时金牌榜

    系统架构 三端 winform 后台数据管理 + Asp.Net Mvc 前台数据展示 + Xamarin.Forms 移动端跨平台APP 因为本人的代码水平一般,期间遇到了一些问题,如signalR ...

  10. WebService学习总结(四)--基于CXF的服务端开发

    本节将实践目前最流行的第二种web service 发布和调试框架  CXF Apache CXF 是一个开放源代码框架,提供了用于方便地构建和开发 Web 服务的可靠基础架构.它允许创建高性能和可扩 ...