手把手教你学会深度学习框架 — PyTorch

简介: PyTorch是一个基于Python语言的深度学习框架,专门针对 GPU 加速的深度神经网络(DNN)的程序开发。基本上,它所有的程序都是用python写的,这就使得它的源码看上去比较简洁,在机器学习领域中有广泛的应用。

PyTorch是一个灵活的深度学习框架,它允许通过动态神经网络(即if条件语句和while循环语句那样利用动态控制流的网络)自动分化。它支持GPU加速、分布式训练、多种优化以及更多的、更简洁的特性。

神经网络是计算图形的一个子类。计算图形接收输入数据,并且数据被路由到那些可能由对数据进行处理的节点进行转换。在深度学习中,神经网络中的神经元通常用参数和可微函数进行数据变换,从而可以通过梯度下降来优化参数以最大程度的减少损失。更广泛来说,函数可以是随机的,并且图形的结构可以是动态的。因此,虽然神经网络可以很好地适合数据流开发,但是PyTorchAPI却围绕着命令行式的编程,这是一种更常见的考虑程序的方式。这使得读取复杂程序的代码和理由变得更容易,而不必浪费大量的性能;PyTorch实际上运行的速度相当快,并带有很多优化,你可以放心地忘记你是个最终用户。

该文件的其余部分是基于官方的MNIST示例,并且应该仅仅是在学习了官方初级教程之后再看。为了提高可读性,代码放在了带有注释的区块中,因此不会被分割成不同的函数或者是文件,因为通常要用于清晰的、模块化的代码。

66fa11a606ed15b859029f3aeb735f66d31fc244 

这些是非常标准的程序或者是包导入代码,特别是用于解决计算机视觉问题的视觉模块:

92099746c1d2b453281c795c0bf54ae80a547822 

argparse是一种处理在Python中命令行参数的标准方法。

它是一种编写与设备无关的代码的好方法(在可用时受益于GPU加速,但当不可用时则返回到CPU)是选择并保存适当的torch.device,它可以用来决定应该存储张量的位置。更多资料请参阅官方文档PyTorch方法是将设备放置在用户的控制之下,这对于简单的例子来说可能看起来是件讨厌的事情,但是它使得更容易计算出张量的位置是对调试有用还是使得手动使用设备变得高效。

对于可重复的实验,有必要为任何使用随机数生成的进行随机种子设置。注意,cuDNN使用非确定性算法,并且可以使用torch.backends.cudnn.enabled = False来进行禁用。

3bf0b4fb3836278e8c966ad628cfdcaa9f0cbcdf 

由于torchvision模型在~/.torch/models/下面进行保存的,我在~/.torch/datasets保存torchvision数据集。通常来说,如果结束重用几个数据集,那么将数据集与代码分离开来存放是非常值得的。torchvision.transforms包含很多给单个图片的方便转换的功能,如修剪和正常化。

DataLoader含有许多可选方案,但是在batch_sizeshuffle参数之外,num_workerspin_memory对于效率也是值得了解一下的。num_workers > 0使用了子进程来进行异步加载数据,而不是在这个过程中使用主进程块。pin_memory使用pinned RAM来加速RAM到GPU的传输。

19b42e745ac38dfaefa5fc1cdfa6154ac1cf3708 

网络初始化通常包括一些成员变量和可训练参数的层,以及可能分开的可训练参数和不可训练的缓冲器。前向传递之后,使用那些来自纯函数F的函数(不包含参数)的结合。有些人倾向具有完全功能的网络(例如,保持参数分离和使用F.conv2d,而不是nn.Conv2d)或者是那些完全分层的网络(例如,nn.ReLU,而不是F.relu)。

.to(device)是将设备参数(和缓冲器)发送到GPU的简便方法,如果设备被设置为GPU,则不做任何操作(当设备被设置为CPU)时。在将网络参数传递给优化器之前,将它们传递给合适的设备是非常重要的,否则优化器将不会正确跟踪参数。

神经网络(nn.Module)和优化器(optim.Optimizer)都具有保存和加载其内部状态的能力,并且.load_state_dict(state_dict)是推荐这么做的方法,你将需要重新加载这两个状态以恢复之前保存的状态字典的训练。保存整个对象可能会容易出错。

这里没有指出的一些要点是,正向传递可以使用控制流,例如,成员变量,或者甚至数据本身可以决定if语句的执行。在中间打印出张量也是非常有效的,这会使调试变得更加容易。最后,前向传递可以使用多个参数。用一个简短的代码片段来说明这一点:

b904fff87fc632ddc151fa919b788d58acd9d250 

默认情况下,网络模块设置为训练模式—这影响了一些模块的运行效果,最明显的是流失和批量标准化。无论如何,最好通过.train()来进行手动设置参数,它将训练标志继承到所有的子模块。

在用loss.backward()收集一组新的梯度并用optimiser.step()进行反向传播之前,有必要手动地集中那些用优化器.zero_grad()优化过了参数的梯度。默认情况下,PyTorch逐渐增加梯度,这是非常方便的,尤其是当你没有足够的资源来计算所有你一次性需要的梯度的时候。

PyTorch使用基于磁带的自动梯度系统—它按一定的顺序收集对张量进行的操作,然后对它们进行重放以进行逆向模式求导。这就是为什么它是超级灵活的原因,并且允许任意的计算图形。如果张量中没有一个需要梯度(当构造张量时,你必须设置requires_grad=True),则不存储任何图形!然而,网络往往趋向那些具有需要梯度的参数,所以从一个网络的输出所做的任何计算都将存储在图形中。因此,如果要想存储由此产生的数据,那么你需要手动禁用梯度,或者更常见地,将其存储为Python数字(通过使用PyTorch标量上的.item())或numpy数组。请在autograd上参阅官方文档以了解更多信息。

切割计算图形的一种方法是使用.detach(),当通过截断反向传播时间来训练RNNs时,可以使用这个方法来隐藏状态。当一个成分是另一个网络的输出时,它也很方便的区分一个损耗,但是这个网络不应该在损失方面被优化 — 例如在GAN训练中从生成器的输出中训练一个鉴别器,或者使用值函数作为基线(例如A2C)的算法训练一个演员评论算法的策略,另一种防止梯度计算的技术在GAN训练中是有效的(训练来自鉴别器的生成器),以及通常在微调中是通过网络参数并设置param.requires_grad = False进行循环。

除了在控制台或者在日志文件中的日志记录结果外,检查点模型参数(和优化器状态)是非常重要的,用于以防万一。你还可以使用torch.save()来保存普通的Python对象,但其它标准选择包括在内置的配置中。

b404d3d3c2c65eca79134535c9a7eb557236cd37 

其他:

CUDA调试错误,通常是逻辑问题,会在CPU上产生更明白易懂的错误消息。如果你正在计划使用GPU,最好的方式是能在CPU和GPU之间轻松地切换。一个更普遍的开发技巧是能够设置你的代码,以便在启动一个合适的工作任务之前快速运行所有的逻辑来检查代码—示例是准备一个小的、合成的数据集,运行一个训练、测试周期等等。如果是一个CUDA错误,或者你真的不能切换到CPU模式,那么设置CUDA_LAUNCH_BLOCKING=1将使CUDA内核同步启动,从而会提供更清楚明确的错误消息。

对于torch.multiprocessing的记录,甚至只是一次性运行多个PyTorch脚本。因为PyTorch使用多线程的BLAS库来加速CPU上的线性代数运算,因此它通常会使用多个内核。如果想同时使用多个处理进程或者多个脚本来运行多个程序,那么你可以手动地通过将环境变量OMP_NUM_THREADS设置为1或另一个小的数字参数来实现—这减少了CPU大幅震动的机会。官方文档中有特别用于多处理技术的注释。

数十款阿里云产品限时折扣中,赶紧点击领劵开始云上实践吧!

本文由北邮@爱可可-爱生活 老师推荐,阿里云云栖社区组织翻译。

文章原标题《PyTorch - The Hitchiker's Guide to PyTorch' by Kai Arulkumaran GitHub:》

作者: Alberto Artasanchez

译者:奥特曼,审校:袁虎。

文章为简译,更为详细的内容,请查看原文

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
相关文章
|
30天前
|
机器学习/深度学习 人工智能 PyTorch
PyTorch深度学习 ? 带你从入门到精通!!!
🌟 蒋星熠Jaxonic,深度学习探索者。三年深耕PyTorch,从基础到部署,分享模型构建、GPU加速、TorchScript优化及PyTorch 2.0新特性,助力AI开发者高效进阶。
PyTorch深度学习 ? 带你从入门到精通!!!
|
2月前
|
机器学习/深度学习 存储 PyTorch
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
Neural ODE将神经网络与微分方程结合,用连续思维建模数据演化,突破传统离散层的限制,实现自适应深度与高效连续学习。
88 3
Neural ODE原理与PyTorch实现:深度学习模型的自适应深度调节
|
4月前
|
机器学习/深度学习 存储 监控
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
本项目基于深度学习的YOLO框架,成功实现了城市道路损伤的自动检测与评估。通过YOLOv8模型,我们能够高效地识别和分类路面裂缝、井盖移位、坑洼路面等常见的道路损伤类型。系统的核心优势在于其高效性和实时性,能够实时监控城市道路,自动标注损伤类型,并生成损伤评估报告。
231 0
基于深度学习YOLO框架的城市道路损伤检测与评估项目系统【附完整源码+数据集】
|
4月前
|
机器学习/深度学习 自动驾驶 算法
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
在智慧交通和智能驾驶日益普及的今天,准确识别复杂交通场景中的关键元素已成为自动驾驶系统的核心能力之一。传统的图像处理技术难以适应高动态、复杂天气、多目标密集的交通环境,而基于深度学习的目标检测算法,尤其是YOLO(You Only Look Once)系列,因其检测速度快、精度高、可部署性强等特点,在交通场景识别中占据了重要地位。
452 0
基于深度学习的YOLO框架的7种交通场景识别项目系统【附完整源码+数据集】
|
5月前
|
机器学习/深度学习 存储 PyTorch
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
本文通过使用 Kaggle 数据集训练情感分析模型的实例,详细演示了如何将 PyTorch 与 MLFlow 进行深度集成,实现完整的实验跟踪、模型记录和结果可复现性管理。文章将系统性地介绍训练代码的核心组件,展示指标和工件的记录方法,并提供 MLFlow UI 的详细界面截图。
200 2
PyTorch + MLFlow 实战:从零构建可追踪的深度学习模型训练系统
|
9月前
|
机器学习/深度学习 数据可视化 算法
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
神经常微分方程(Neural ODEs)是深度学习领域的创新模型,将神经网络的离散变换扩展为连续时间动力系统。本文基于Torchdyn库介绍Neural ODE的实现与训练方法,涵盖数据集构建、模型构建、基于PyTorch Lightning的训练及实验结果可视化等内容。Torchdyn支持多种数值求解算法和高级特性,适用于生成模型、时间序列分析等领域。
416 77
PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
|
8月前
|
机器学习/深度学习 自然语言处理 算法
PyTorch PINN实战:用深度学习求解微分方程
物理信息神经网络(PINN)是一种将深度学习与物理定律结合的创新方法,特别适用于微分方程求解。传统神经网络依赖大规模标记数据,而PINN通过将微分方程约束嵌入损失函数,显著提高数据效率。它能在流体动力学、量子力学等领域实现高效建模,弥补了传统数值方法在高维复杂问题上的不足。尽管计算成本较高且对超参数敏感,PINN仍展现出强大的泛化能力和鲁棒性,为科学计算提供了新路径。文章详细介绍了PINN的工作原理、技术优势及局限性,并通过Python代码演示了其在微分方程求解中的应用,验证了其与解析解的高度一致性。
1513 5
PyTorch PINN实战:用深度学习求解微分方程
|
10月前
|
机器学习/深度学习 存储 人工智能
MNN:阿里开源的轻量级深度学习推理框架,支持在移动端等多种终端上运行,兼容主流的模型格式
MNN 是阿里巴巴开源的轻量级深度学习推理框架,支持多种设备和主流模型格式,具备高性能和易用性,适用于移动端、服务器和嵌入式设备。
2106 18
MNN:阿里开源的轻量级深度学习推理框架,支持在移动端等多种终端上运行,兼容主流的模型格式
|
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实现代码。
2432 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
下一篇
开通oss服务