【干货】深度学习实验流程及 PyTorch 提供的解决方案

简介: 在研究深度学习的过程中,当你脑中突然迸发出一个灵感,你是否发现没有趁手的工具可以快速实现你的想法?看完本文之后,你可能会多出一个选择。本文简要分析了研究深度学习问题时常见的工作流, 并介绍了怎么使用 PyTorch 来快速构建你的实验。

常见的 Research workflow

某一天, 你坐在实验室的椅子上, 突然:

1 你脑子里迸发出一个 idea

2 你看了关于某一 theory 的文章, 想试试: 要是把 xx 也加进去会怎么样
3 你老板突然给你一张纸, 然后说: 那个谁, 来把这个东西实现一下

于是, 你设计实验流程, 并为这一 idea 挑选了合适的数据集和运行环境, 然后你废寝忘食的实现模型, 经过长时间的训练和测试, 你发现:

1 这 idea 不 work --> 那算了 or 再调调
2 这 idea 很 work --> 可以 paper 了

我们可以把上述流程用下图表示:

e9382347a29ca27f545e0376bb353f6c20c61cc1

实际上, 常见的流程由下面几项组成起来:

bb8331ad6839beffffa05ec42ddc02af789deb77

1   一旦选定了数据集, 你就要写一些函数去 load 数据集, 然后 pre-process 数据集, normalize 数据集, 可以说这是一个实验中占比重最多的部分, 因为:
2   每个数据集的格式都不太一样
3   预处理和正则化的方式也不尽相同
4   需要一个快速的 dataloader 来 feed data, 越快越好
5   然后, 你就要实现自己的模型, 如果你是 CV 方向的你可能想实现一个 ResNet, 如果你是 NLP 相关的你可能想实现一个 Seq2Seq
6   接下来, 你需要实现训练步骤, 分 batch, 循环 epoch
7   在若干轮的训练后, 总要 checkpoint 一下, 才是最安全的
8   你还需要构建一些 baseline, 以验证自己 idea 的有效性
9   如果你实现的是神经网络模型, 当然离不开 GPU 的支持
10 很多深度学习框架提供了常见的损失函数, 但大部分时间, 损失函数都要和具体任务结合起来, 然后重新实现
11 使用优化方法, 优化构建的模型, 动态调整学习率
Pytorch 给出的解决方案

对于加载数据, Pytorch 提出了多种解决办法

1 Pytorch 是一个 Python 包, 而不是某些大型 C++ 库的 Python 接口, 所以, 对于数据集本身提供 Python API 的, Pytorch 可以直接调用, 不必特殊处理.
2 Pytorch 集成了常用数据集的 data loader
3 虽然以上措施已经能涵盖大部分数据集了, 但 Pytorch 还开展了两个项目: vision, 和 text, 见下图灰色背景部分. 这两个项目, 采用众包机制, 收集了大量的 dataloader, pre-process 以及 normalize, 分别对应于图像和文本信息.
b56fabf42c65805de8220a5bad497be72c0227bd
4 如果你要自定义数据集,也只需要继承 torch.utils.data.dataset

对于构建模型, Pytorch 也提供了三种方案

1 众包的模型: torch.utils.model_zoo , 你可以使用这个工具, 加载大家共享出来的模型
2 使用 torch.nn.Sequential 模块快速构建
net = torch.nn.Sequential(

 torch.nn.Linear(1, 10),
 torch.nn.ReLU(),
 torch.nn.Linear(10, 1)

)
 print(net)
 '''

Sequential (

 (0): Linear (1 -> 10)

 (1): ReLU ()

 (2): Linear (10 -> 1)

)

'''
  • 集成 torch.nn.Module 深度定制

class Net(torch.nn.Module):
 def __init__(self, n_feature, n_hidden, n_output):
 super(Net, self).__init__()
 self.hidden = torch.nn.Linear(n_feature, n_hidden)
 self.predict = torch.nn.Linear(n_hidden, n_output)
 
 def forward(self, x):

 x = F.relu(self.hidden(x))

 x = self.predict(x)
 return x
 

net = Net(1, 10, 1) 
 print(net)
 '''

Net (

 (hidden): Linear (1 -> 10)

 (predict): Linear (10 -> 1)

)

'''

对于训练过程的 Pytorch 实现

你当然可以自己实现数据的 batch, shuffer 等, 但 Pytorch 建议用类 torch.utils.data.DataLoader 加载数据,并对数据进行采样,生成batch迭代器。

# 创建数据加载器
 loader = Data.DataLoader(
 dataset=torch_dataset, # TensorDataset类型数据集
 batch_size=BATCH_SIZE, # mini batch size
 shuffle=True, # 设置随机洗牌
 num_workers=2, # 加载数据的进程个数
 )
 
 for epoch in range(3): # 训练3轮
 for step, (batch_x, batch_y) in enumerate(loader): # 每一步

 # 在这里写训练代码...
 print('Epoch: ', epoch)

对于保存和加载模型 Pytorch 提供两种方案

  • 保存和加载整个网络
# 保存和加载整个模型, 包括: 网络结构, 模型参数等
 torch.save(resnet, 'model.pkl')

model = torch.load('model.pkl')
  • 保存和加载网络中的参数
torch.save(resnet.state_dict(), 'params.pkl')

resnet.load_state_dict(torch.load('params.pkl'))

对于 GPU 支持

你可以直接调用 Tensor 的. cuda() 直接将 Tensor 的数据迁移到 GPU 的显存上, 当然, 你也可以用. cpu() 随时将数据移回内存

if torch.cuda.is_available():

 linear = linear.cuda() # 将网络中的参数和缓存移到GPU显存中

对于 Loss 函数, 以及自定义 Loss

在 Pytorch 的包 torch.nn 里, 不仅包含常用且经典的 Loss 函数, 还会实时跟进新的 Loss 包括: CosineEmbeddingLoss, TripletMarginLoss 等.

如果你的 idea 非常新颖, Pytorch 提供了三种自定义 Loss 的方式

  • 继承 torch.nn.module
import torch
 import torch.nn as nn
 import torch.nn.functional as func
 class MyLoss(nn.Module):
 # 设置超参
 def __init__(self, a, b, c):
 super(TripletLossFunc, self).__init__()
 self.a = a
 self.b = b
 self.c = c
 return
 

 def forward(self, a, b, c):
 # 具体实现
 loss = a + b + c
 return loss

然后

loss_instance = MyLoss(...)

loss = loss_instance(a, b, c)

这样做, 你能够用 torch.nn.functional 里优化过的各种函数来组成你的 Loss

  • 继承 torch.autograd.Function
import torch
 from torch.autograd import Function
 from torch.autograd import Variable
 class MyLoss(Function):
 def forward(input_tensor):
 # 具体实现
 result = ......
 return torch.Tensor(result)
 
 def backward(grad_output):
 # 如果你只是需要在loss中应用这个操作的时候,这里直接return输入就可以了

 # 如果你需要在nn中用到这个,需要写明具体的反向传播操作
 return grad_output

这样做,你能够用常用的 numpy 和 scipy 函数来组成你的 Loss

  • 写一个 Pytorch 的 C 扩展

这里就不细讲了,未来会有内容专门介绍这一部分。

对于优化算法以及调节学习率

Pytorch 集成了常见的优化算法, 包括 SGD, Adam, SparseAdam, AdagradRMSprop, Rprop 等等.

torch.optim.lr_scheduler 提供了多种方式来基于 epoch 迭代次数调节学习率 torch.optim.lr_scheduler.ReduceLROnPlateau 还能够基于实时的学习结果, 动态调整学习率.


原文发布时间为:2018-02-11

本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号

原文链接:【干货】深度学习实验流程及 PyTorch 提供的解决方案

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
1月前
|
机器学习/深度学习 人工智能 PyTorch
PyTorch深度学习 ? 带你从入门到精通!!!
🌟 蒋星熠Jaxonic,深度学习探索者。三年深耕PyTorch,从基础到部署,分享模型构建、GPU加速、TorchScript优化及PyTorch 2.0新特性,助力AI开发者高效进阶。
PyTorch深度学习 ? 带你从入门到精通!!!
|
2月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
152 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
7月前
|
机器学习/深度学习 并行计算 PyTorch
英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案
本文记录了在RTX 5070 Ti上运行PyTorch时遇到的CUDA兼容性问题,分析其根源为预编译二进制文件不支持sm_120架构,并提出解决方案:使用PyTorch Nightly版本、更新CUDA工具包至12.8。通过清理环境并安装支持新架构的组件,成功解决兼容性问题。文章总结了深度学习环境中硬件与框架兼容性的关键策略,强调Nightly构建版本和环境一致性的重要性,为开发者提供参考。
3862 64
英伟达新一代GPU架构(50系列显卡)PyTorch兼容性解决方案
|
5月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
255 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
9月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
496 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
8月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
2271 5
PyTorch PINN实战:用深度学习求解微分方程
|
11月前
|
人工智能 安全 PyTorch
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
SPDL是Meta AI推出的开源高性能AI模型数据加载解决方案,基于多线程技术和异步事件循环,提供高吞吐量、低资源占用的数据加载功能,支持分布式系统和主流AI框架PyTorch。
438 10
SPDL:Meta AI 推出的开源高性能AI模型数据加载解决方案,兼容主流 AI 框架 PyTorch
|
9月前
|
机器学习/深度学习 PyTorch TensorFlow
深度学习工具和框架详细指南:PyTorch、TensorFlow、Keras
在深度学习的世界中,PyTorch、TensorFlow和Keras是最受欢迎的工具和框架,它们为研究者和开发者提供了强大且易于使用的接口。在本文中,我们将深入探索这三个框架,涵盖如何用它们实现经典深度学习模型,并通过代码实例详细讲解这些工具的使用方法。
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
2738 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
机器学习/深度学习 传感器 算法
行人闯红灯检测:基于计算机视觉与深度学习的智能交通解决方案
随着智能交通系统的发展,传统的人工交通违法判断已难以满足需求。本文介绍了一种基于计算机视觉与深度学习的行人闯红灯自动检测系统,涵盖信号灯状态检测、行人检测与跟踪、行为分析及违规判定与报警四大模块,旨在提升交通管理效率与安全性。

热门文章

最新文章

推荐镜像

更多
下一篇
oss云网关配置