『PyTorch』屌丝的PyTorch玩法
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 安装
- 克隆源代码
git clone https://github.com/NVIDIA/apex
可以先下载到码云,再下载到本地
- 安装apex
cd apex
python setup.py install
最好打开PyCharm的终端进行安装,这样实在Anaconda的环境里安装了
- 删除刚刚clone下来的apex文件夹,然后重启PyCharm
【注意】安装PyTorch和cuda时注意版本对应,要按照正确流程安装
- 测试安装成功
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玩法的更多相关文章
- 『PyTorch』第十二弹_nn.Module和nn.functional
大部分nn中的层class都有nn.function对应,其区别是: nn.Module实现的layer是由class Layer(nn.Module)定义的特殊类,会自动提取可学习参数nn.Para ...
- 『PyTorch』第九弹_前馈网络简化写法
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下 在前面的例子中,基本上都是将每一层的输出直接作为下一层的 ...
- 『PyTorch』第四弹_通过LeNet初识pytorch神经网络_下
『PyTorch』第四弹_通过LeNet初识pytorch神经网络_上 # Author : Hellcat # Time : 2018/2/11 import torch as t import t ...
- 『PyTorch』第三弹重置_Variable对象
『PyTorch』第三弹_自动求导 torch.autograd.Variable是Autograd的核心类,它封装了Tensor,并整合了反向传播的相关实现 Varibale包含三个属性: data ...
- 『PyTorch』第二弹重置_Tensor对象
『PyTorch』第二弹_张量 Tensor基础操作 简单的初始化 import torch as t Tensor基础操作 # 构建张量空间,不初始化 x = t.Tensor(5,3) x -2. ...
- 『PyTorch』第十弹_循环神经网络
RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...
- 『TensorFlow』专题汇总
TensorFlow:官方文档 TensorFlow:项目地址 本篇列出文章对于全零新手不太合适,可以尝试TensorFlow入门系列博客,搭配其他资料进行学习. Keras使用tf.Session训 ...
- 『Python』__getattr__()特殊方法
self的认识 & __getattr__()特殊方法 将字典调用方式改为通过属性查询的一个小class, class Dict(dict): def __init__(self, **kw) ...
- 『TensorFlow』流程控制
『PyTorch』第六弹_最小二乘法对比PyTorch和TensorFlow TensorFlow 控制流程操作 TensorFlow 提供了几个操作和类,您可以使用它们来控制操作的执行并向图中添加条 ...
随机推荐
- java操作excel 工具类
java操作excel 可参考https://blog.csdn.net/xunwei0303/article/details/53213130 直接上代码: 一.java生成excel文件: pac ...
- Json 文件 : 出现 Expected value at 1:0 问题的解决
只要找一个json在线解析,验证你的json文件格式的正确性,错误可以忽略. 如要消除红叉,关闭Json Validation即可,如下操作:
- C++ 中的信号的处理
C++ 信号处理 信号是由操作系统传给进程的中断,会提早终止一个程序.在 UNIX.LINUX.Mac OS X 或 Windows 系统上,可以通过按 Ctrl+C 产生中断. 有些信号不能被程序捕 ...
- Maven项目管理工具--简单实用与入门
Maven管理的方式就是"自动下载项目所需要的jar包,统一管理jar包之间的依赖关系" Maven下载与安装 1.首先确保JDK已安装,且JDK为1.6+(尽量新,新肯定支持,旧 ...
- Vue.JS快速上手(指令和实例方法)
1.声明式渲染 首先,我们要知道Vue是声明式渲染,那啥是声明式渲染,我们只需要告诉程序我们想要什么结果,其他的交给程序来做.与声明式渲染相对的是命令式渲染,即命令我们的程序去做什么,程序就会跟着你的 ...
- 高德地图——2D转换3D
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script ty ...
- AI 常见术语总结
BN(Batch-normalization)在一层的输出上计算所有特征映射的均值和标准差,并且使用这些值规范化它们的响应.因此使得所有神经图(neural maps)在同样范围有响应,而且是零均 ...
- Java基础(二)——内部类
一.内部类 内部类(Inner Class)就是定义在一个类里面的类.与之对应,包含内部类的类被称为外部类.内部类可以用private修饰. 1.为什么要定义内部类?或者内部类的作用是什么? 内部类提 ...
- Python - repr()、str() 的区别
总的来说 str():将传入的值转换为适合人阅读的字符串形式 repr():将传入的值转换为 Python 解释器可读取的字符串形式 传入整型 # number resp = str(1) print ...
- VMware安装IPFire防火墙镜像
之后便可以通过WEB登录到管理页面(admin账号,密码是在上面配置的) 详细可参考:https://www.mobibrw.com/2016/4900