PyTorch深度学习教程:构建手写数字识别神经网络
本文为客座文章,作者 Naa Ashiorkor,一位数据科学家和技术社区建设者。
[LOADING...]
构建能够看、听、理解语言并做出决策的智能系统,曾经只是拥有海量计算资源的专业研究人员的领域——而如今,深度学习已让全球范围内的开发者和数据科学家都能触及,使构建、训练和部署AI模型变得触手可及。
这一可及性要归功于深度学习框架,而PyTorch正是其中之一。它迅速成为研究和工业界的首选框架。PyTorch是一个基于Python构建的开源深度学习框架,旨在让构建神经网络变得直观。
想知道神经网络实际是如何学习的吗?在本教程中,你将使用PyCharm中的MNIST数据集构建你的第一个PyTorch模型,并亲眼看到它实时识别手写数字。在此过程中,你将熟悉张量,并理解构建深度学习模型背后的核心工作流。
什么是PyTorch?
PyTorch的根源可以追溯到Torch,一个使用Lua的科学计算框架;2016年,Facebook AI研究实验室(FAIR,现为Meta AI)的研究人员将其重新设计为Python版本,创造了PyTorch。如今,它已成为Linux基金会社区项目。
到2024年,PyTorch已确立自己作为最流行的深度学习框架的地位,在模型训练领域采用率达63%,被用于超过70%的AI研究实现中。在2025年,PyTorch基金会的生态系统已扩展到包括vLLM、DeepSpeed和Ray等大型项目,这些项目均独立治理。
年度PyTorch大会吸引了超过3400名参会者,并新增了16个行业成员,包括Snowflake、戴尔技术和高通。此外,Meta、微软、OpenAI和特斯拉等组织在生产环境中信任并采用PyTorch。对于希望进入深度学习领域的开发者和数据科学家来说,PyTorch仍然是目前最实用、支持最广泛的起点。
PyTorch建立在两大基础之上:GPU加速的张量计算(作为NumPy的更强大替代方案)以及用于训练神经网络的自动微分引擎。
在这些基础之上,PyTorch已发展成为功能最全面的深度学习框架之一。其核心特性包括:
- 动态计算图(define-by-run): 代码执行时,PyTorch会构建计算图。这些图记录了模型执行的每一步数学运算:例如输入与权重的乘法、添加偏置、应用激活函数等。PyTorch需要跟踪这些操作,因为训练需要反向遍历所有步骤,计算每个权重对模型误差的贡献有多大,从而知道如何调整它们以改善性能。计算图允许在运行时修改模型结构,并可使用标准Python工具进行调试,使PyTorch成为研究和实验的理想选择。
- Pythonic且直观的接口: PyTorch代码风格符合Python习惯,降低了学习曲线。它使用标准的Python控制流和简洁、易读的语法,并能很好地与Python生态库集成。
- 强大的GPU加速: PyTorch通过CUDA无缝支持GPU。支持轻松的设备切换和张量在GPU上的高效计算,同时也支持多GPU训练。
- Autograd(自动求导): 内置的autograd引擎可自动计算梯度。它跟踪张量上的操作,并以最少的代码实现反向传播。
- 丰富的神经网络库: PyTorch提供了全面的模块用于构建模型。包含预定义的层、损失函数、激活函数,以及用于自定义架构的模块化设计。
- 广泛的生态系统: PyTorch不仅是一个框架——它是一个生态系统。除了AI专用库之外,还拥有大量工具。因此,从数据收集到部署,整个AI项目都可以在Python的统一框架下进行管理。
- 模型部署支持: PyTorch支持将模型从研究部署到生产,并支持移动端和边缘端部署。此外,它还提供TorchScript用于优化执行,以及ONNX导出用于互操作性。
- 广泛的社区和行业采用: PyTorch由Meta支持,拥有庞大且活跃的社区。由于Python是全球最大的编程社区之一,PyTorch用户受益于共享的知识、资源和工具。文档和教程丰富,在学术界和工业界被广泛使用。
关于PyTorch和TensorFlow的区别以及如何选择,请参阅这篇博客文章。
为什么在深度学习项目中使用PyTorch?
PyTorch位于当前深度学习生态系统的核心。近年来,一些最具影响力的AI模型背后都有它的身影,例如Meta的Llama、OpenAI的早期GPT模型以及Stable Diffusion。如今,它是全球AI研究的热门选择。
根据Linux基金会的塑造未来生成式AI报告,PyTorch以63%的采用率在模型训练领域处于领先地位。在学术界,它在研究论文实现中被广泛使用。由于其直观的设计允许轻松实验和迭代,PyTorch是研发工作的首选。
因此,研究人员可以同时开发新颖架构并测试想法。在顶级AI会议上,PyTorch驱动了85%的深度学习论文。
PyTorch因其以下优势而成为首选框架:
- 调试直观自然: PyTorch作为普通Python运行,调试过程直接明了。由于其动态图和实时执行特性,开发者可以使用print语句和调试器等标准Python工具来测试和修改模型——无需特殊设置或变通方法。这使PyTorch与静态图框架显著区别开来,后者错误大多在运行时才出现,且很难追溯到根源。
- 灵活性高: 动态计算图和直观的API使PyTorch非常适合实验和快速迭代。
- 社区蓬勃: 根据PyTorch 2024年度回顾,单年内有超过3500名个人和3000个组织为其做出贡献,其工具生态系统增长了超过25%。社区积累了大量的教程、预训练模型和扩展。特别是,Hugging Face的Transformers库直接构建在PyTorch之上,现已成为NLP研究和开发的标准工具包。## 理解 PyTorch 张量
理解 PyTorch 需要先理解张量。PyTorch 中的每个输入、输出和模型权重都存在于张量中。因此,张量不仅仅是一种数据格式,更是所有计算流转的媒介。
张量是 PyTorch 的核心数据结构。它们类似于 n 维数组和矩阵,但与普通数组不同,张量可以在 GPU 等硬件加速器上使用。可以把张量看作是我们已经熟悉的数字的扩展:单个数字是零维张量,数字列表是一维张量,数字表格是二维张量。在此基础上,你可以添加更多维度来表示复杂的数据,如图像、视频或音频。
神经网络接受张量作为输入,并生成张量作为输出——即便是神经网络的参数(权重和偏置)也以张量的形式存储。如果想获得直观的解释,可以观看这个面向初学者的张量与深度学习视频:
张量与 NumPy 数组类似,但还可以在 GPU 或其他硬件加速器上运行。通常,张量和 NumPy 数组可以共享同一底层内存,这意味着数据无需复制。
主要区别在于计算量变大时的情况。NumPy 用于在 CPU 上进行科学计算,而 PyTorch 张量只需一行代码就能移至 GPU 并处理,从而实现大规模并行计算,为深度学习中常见的矩阵乘法运算带来显著加速。
这种能力使得训练大型神经网络成为可能。
PyTorch 张量有一些基本操作是必须掌握的。你可以在 GitHub 仓库 中查看完整实现。
创建张量
首先要知道如何创建张量。PyTorch 根据你的数据形式提供了多种方式——你可以从现有列表构建张量,用零或一初始化为占位符,或者生成随机值作为模型权重的起点。
这段代码演示了在 PyTorch 中创建张量的不同方法:从 Python 列表创建张量,以及创建填充为零、为一和包含随机值的张量。输出展示了生成的张量结构和数值,说明了深度学习中常用的张量初始化方法。
基本算术运算
张量算术是按元素进行的,这意味着 PyTorch 会同时对张量中的每个值执行操作,而不是逐个循环。这正是张量如此之快的原因——也是 GPU 加速如此强大的原因,因为 GPU 专门设计用于并行运行成千上万个这样的操作。
这段代码演示了 PyTorch 张量上的常见数学运算。两个张量按元素进行加法和乘法,同时使用 sum() 和 mean() 等函数计算张量元素的总和和平均值。输出显示这些操作的结果,突出了 PyTorch 如何高效地对张量数据进行数值计算。
重塑
在深度学习中,你经常需要重塑张量——例如,在将二维图像输入全连接层之前将其压平为一维向量,或者重新组织批数据以匹配模型的输入要求。PyTorch 通过 reshape() 使这一过程变得简单,它在不改变底层值的情况下将数据重新排列成新的形状。
这段代码演示了如何使用 reshape() 函数改变张量的形状。一个包含六个元素的一维张量被重塑为 2×3 张量。输出显示了更新后的张量结构,确认数据已重新组织但值保持不变。
移至 GPU
默认情况下,张量在 CPU 上创建,但只需一行代码即可将它们移至 GPU——在那里矩阵运算可以快几个数量级。这样,同一份代码既可以在配备 GPU 的机器上运行,也可以在没有 GPU 的机器上运行。检查 GPU 是否可用是一种良好实践。
这段代码使用 torch.cuda.is_available() 检查 CUDA 兼容的 GPU 是否可用。如果可用,张量 x 通过 .to("cuda") 从 CPU 移至 GPU,从而利用 GPU 加速进行更快速的计算,这对于大规模深度学习任务尤为有用。
与 NumPy 互转
PyTorch 和 NumPy 使用几乎相同的语言,因此在它们之间切换非常简单。你可能已经在数据加载、预处理或结果可视化的流程中使用了 NumPy。
PyTorch 被设计为与 NumPy 无缝协作。你可以一行代码在张量和 NumPy 数组之间转换,而且在 CPU 上它们共享同一内存,因此切换没有性能损失。
这段代码演示了 PyTorch 与 NumPy 之间的互操作性。首先使用 .numpy() 将 PyTorch 张量转换为 NumPy 数组,然后使用 torch.from_numpy() 将 NumPy 数组转换回 PyTorch 张量。输出显示转换过程中数值保持不变,突出了两个库之间的无缝数据共享。这在将 PyTorch 模型与基于 NumPy 的预处理或分析工作流程集成时特别有用。
设置 PyTorch
PyCharm 通过直接集成 Python 环境和包管理工具,简化了深度学习环境的设置。其关键优势之一是与 Jupyter notebook 的可选 Google Colab 支持无缝集成,让你可以在本地和云端计算之间轻松切换。
在创建项目之前,建议先在本地安装 uv(一个快速的 Python 包和环境管理器)。这样,PyCharm 就可以通过 Python 解释器设置直接使用 uv 来创建和管理项目特定的环境。
设置过程从创建一个新项目开始,在 Python 解释器设置中配置项目特定的 Python 环境。在此步骤中,还可以选择 uv 管理的环境和 Jupyter notebook,从而从一开始就启用交互式开发环境。
在同一窗口中,还可以使用 Git 初始化版本控制。有关在 PyCharm 中创建和使用 Jupyter notebook 的详细指南,请参阅 PyCharm 文档。
[LOADING...] 在 PyCharm 的“欢迎”界面上,点击“新建项目”。在项目配置窗口中,选择“Jupyter”作为项目类型,并在 Python 解释器设置下选择“uv”作为环境管理器。这将创建一个由 uv 管理的项目特定环境,并为交互式深度学习开发做好准备。
[LOADING...] 项目创建后,所选 Python 解释器会显示在 PyCharm 窗口的右下角。解释器名称应指示它是一个由 uv 管理的环境,从而确认项目已配置为使用 uv 进行包和环境管理。
[LOADING...] 要使用 PyCharm 的图形界面安装 PyTorch,请通过导航到“视图”|“工具窗口”|“Python 包”打开包管理器。“Python 包”工具窗口提供了一种便捷的方式,无需使用终端即可搜索、安装、升级和删除包。
[LOADING...] 打开“Python 包”工具窗口后,在搜索栏中输入“torch”以定位 PyTorch 包。从搜索结果中选择该包,然后点击“安装”。同样的过程可用于将 torchvision 和 torchaudio 等相关包安装到 uv 管理的项目环境中。
使用 Conda 作为替代方案
如果更倾向于 Conda 环境,PyCharm 通过 Python 解释器设置直接支持 Conda。在设置项目时可以选择 Conda 环境,PyCharm 会自动管理它。有关配置 Conda 环境的更多详细信息,请参阅 PyCharm 的 Conda 环境文档。
一旦 Conda 环境激活,使用终端安装 PyTorch:
对于 PyTorch 开发,我推荐 PyCharm,因为它对 Python 提供了出色的支持,包括智能编码辅助、调试、版本控制、集成的数据库管理以及无缝的 Docker 集成。特别针对数据科学,PyCharm 支持 Jupyter notebook 以及关键的科学和机器学习库,并与 Hugging Face 模型库、Anaconda 和 Databricks 等工具集成。
此外,它特别适合 PyTorch 开发,因为它理解该框架,并包含逐层检查 PyTorch 张量的功能,这在探索数据和构建深度学习模型时至关重要。
除了张量功能,PyCharm 还允许你在训练循环中设置断点,检查张量值,并使用集成的调试器逐步执行模型的正向传播——这与 PyTorch 的动态计算图自然配合得很好。
使用 PyTorch 构建神经网络
神经网络是一个由连接层组成的系统,通过训练调整内部权重来学习数据中的模式。在 PyTorch 中,所有这些层都包含在一个名为 torch.nn 的模块中。可以把它想象成你的构建工具包,它为你提供了组装网络所需的一切,而无需从头编写底层的数学运算。
torch.nn 带有一个预定义层库,例如 nn.Linear 用于全连接层,nn.Conv2d 用于卷积层,nn.LSTM 用于循环层。因此,你可以专注于设计网络,而不是实现每层背后的数学计算。它提供了构建自己的神经网络所需的所有模块。
PyTorch 中的每个模块都继承自 nn.Module。神经网络本身就是一个由其他模块(层)组成的模块,这种嵌套结构使得构建和管理复杂架构变得容易。
在使用 PyTorch 构建神经网络时,你需要创建一个继承自 nn.Module 的 Python 类,并实现两个核心方法:
__init__()—— 在这里定义你的层。forward()—— 在这里定义数据如何流经这些层。
PyTorch 的 autograd 系统会根据 forward 方法中执行的操作自动构建计算图,从而实现自动微分。通常不需要手动实现用于梯度计算的 backward 方法。这意味着 PyTorch 会处理梯度计算背后的数学,你可以专注于构建。
模型构建不仅仅是理解代码,还需要考虑一些实际因素。
- 不断迭代。 你的第一个模型很可能表现不佳。这很正常,因为深度学习是一个实验性的过程,需要调整层、激活函数和超参数,直到模型改进。
- 先简单,后复杂。 一个两层的全连接网络总是一个好的起点。建议在确认简单模型不足够时才增加复杂度,例如添加更多层或采用不同的架构。
PyCharm 凭借其集成的调试器使模型构建更加容易。你可以在 forward 方法中设置断点,检查每一层的张量值,并逐遍执行模型的前向传播,这大大减少了识别和修复问题所需的时间。## 使用PyTorch构建你的第一个手写数字分类器
在本节中,你将使用PyTorch搭建一个简单的神经网络,能够识别MNIST数据集中的手写数字。你将经历完整的流程:从原始图像数据开始,准备并标准化数据集,定义神经网络,训练模型以识别数字,并评估其在测试数据上的表现。
在此过程中,你将探索关键的深度学习概念,如张量、层、激活函数、损失函数、优化和训练循环,同时使用PyCharm来检查并理解训练循环内部发生的情况。
在深度学习中,图像分类是一项基础任务,模型需要根据图像的视觉内容为其分配标签。在本例中,我们将对MNIST手写数字数据库进行图像分类,这是计算机视觉中的经典基准测试,包含28x28像素的灰度手写数字图像(0到9)。
MNIST数据集规模小且结构清晰,以此为例可以让我们专注于理解深度学习的核心构建模块。目标是使用PyTorch构建一个能够准确识别并分类这些数字的神经网络。
本项目完整源代码可在配套的GitHub仓库中找到。
[LOADING...] MNIST数据集( 来源)
准备数据
在训练任何模型之前,需要加载、清洗数据并格式化,以便PyTorch高效处理。PyTorch提供了两个类来处理这些操作:
Dataset:定义如何访问和返回单个样本。DataLoader:接收Dataset,处理数据在训练过程中如何输入模型,包括批处理、打乱和并行加载。
配置这些组件时,PyCharm通过代码补全、自动导入建议、参数提示和快速文档等功能简化开发流程。
将鼠标悬停在PyTorch类和函数上会显示使用信息,按Ctrl+Q可在IDE内直接打开详细文档。因此,更容易探索PyTorch API并正确配置数据加载和预处理步骤,无需频繁切换到外部文档。
[LOADING...] 当输入transforms.Normalize()时,PyCharm会在编辑器中直接显示函数签名和参数信息,帮助开发者更高效地配置数据预处理步骤,无需参考外部文档。
加载与标准化数据
在训练神经网络之前,需要对输入数据进行标准化,使像素值缩放到一致的范围。这有助于提高稳定性,使输入值围绕零中心分布,并确保梯度在优化过程中行为更可预测。
上述代码片段下载MNIST数据集(如果需要),加载训练图像,并应用预处理,使数据可被神经网络使用。
在本项目中,MNIST图像通过PyTorch的变换进行标准化,作为预处理流水线的一部分:
transforms.ToTensor()将像素值(0-255)转换为缩放到0-1的浮点张量。transforms.Normalize((0.5,), (0.5,))随后将这些值重新缩放到大约-1到1,这有助于稳定训练,使输入值围绕零中心分布,并改善梯度在优化过程中的行为。
PyTorch还提供了关键的数据加载参数来控制训练数据的处理方式:
batch_size=64:模型一次处理64张图像,而不是整个数据集。这提高了内存效率,并通过允许在小组数据(而非单个样本或整个数据集)上进行梯度更新来使训练更稳定。shuffle=True:每个epoch打乱图像顺序,防止模型记住序列。download=True:首次运行时PyTorch自动下载MNIST,无需手动操作。
定义模型
数据准备好后,下一步是构建将从数据中学习的神经网络。模型的目标是接收手写数字的输入图像,并预测它代表哪个数字(0-9)。每张MNIST图像为28×28像素。由于模型无法像人类那样直接解释图像,我们首先将每张图像展平为784个值的向量(28 x 28 = 784)。这将2D图像转换为模型可以处理的格式。
输入层接收784个像素值,并通过全连接层传递。每一层学习特征的加权组合,这些特征逐渐变得对区分数字更有用。虽然这些表示不能直接解释,但网络逐渐学习有助于区分不同类别的模式。
为了帮助模型有效学习,我们使用名为ReLU的激活函数,允许网络捕获理解图像所必需的非线性模式。
运行代码后,PyTorch会打印模型的结构:
输出显示了神经网络的结构。每个Linear层表示模型中的全连接层。第一层将784个输入像素转换为128个特征,第二层减少到64个特征,最后一层输出10个值,代表数字类别(0-9)。这确认模型已在训练前正确定义。
使用Jupyter控制台检查数据并验证神经网络
PyCharm Pro在PyTorch开发中特别有用的功能之一是集成的Jupyter控制台。它直接连接到运行的笔记本内核,允许你交互式地检查张量、探索数据集、测试模型输出和调试代码,而无需向笔记本添加临时单元格。这简化了迭代工作流程,使模型开发期间验证代码更容易。
要访问Jupyter控制台,首先确保Jupyter笔记本正在运行。然后点击笔记本编辑器顶部工具栏中的Open Jupyter Console。
此外,PyCharm还提供Variables视图,显示笔记本内核中的所有活动对象,允许快速视觉检查形状、值和类型,减少重复打印语句的需求。
这些工具共同使得在训练前更容易检查数据和验证模型行为。
[LOADING...] Jupyter控制台允许交互式执行与笔记本内核链接的代码,因此你可以在训练前检查数据并测试模型。 Variables 视图显示活动对象,无需打印语句即可快速检查。
训练模型
选择损失函数和优化器
模型定义好后,下一步是训练它,使其能够学习识别手写数字。训练期间,模型处理MNIST图像,进行预测,与正确标签比较,并逐步提高性能。为此,我们首先需要两个关键组件:损失函数和优化器。
损失函数衡量模型预测与正确答案之间的差距。在像MNIST这样的分类问题(有10个类别,每个数字一个)中,使用CrossEntropyLoss,因为它适用于多类分类,不仅惩罚错误预测,还考虑了模型出错时的置信度。
优化器负责根据损失更新模型权重。它决定了模型如何从错误中学习。
我们还需要选择一个优化器。自适应矩估计(ADAM)和随机梯度下降(SGD)是其中两种——它们根据损失调整模型权重,以便下次做得更好。
区别在于它们如何实现。SGD使用固定的学习率应用于计算的梯度来更新模型权重。ADAM通过估计过去梯度的自适应学习率扩展了这一想法,通常可以更快、更稳定地收敛,且手动调整较少。对于本项目,ADAM是实用选择,lr=0.001作为安全的默认学习率。当你希望对训练过程有更多控制时,以后可以探索SGD。
实现训练循环
训练循环是学习过程的核心。每次完整遍历训练数据称为一个epoch。训练通常运行多个epoch,以便模型随时间逐步提高性能。
每个epoch由称为批次的小单元组成。模型不是一次处理整个数据集,而是一次处理一个批次,这使得训练更高效且内存友好。
在每个epoch中,模型按批次处理数据并重复以下步骤:
- 前向传播:模型进行预测(logits)。
- 损失计算:模型将预测与真实标签比较。
- 反向传播:模型计算损失的梯度。
- 权重更新:优化器调整模型参数。
关于这一部分,有一些重要的实现细节需要注意:
model.train()将模型切换到训练模式,必须在每个epoch开始时调用。optimizer.zero_grad()必须在每次迭代的loss.backward()之前调用,因为如果没有它,PyTorch会累积之前批次的梯度,从而破坏更新。这是PyTorch中最常见的初学者错误之一。loss.item()将损失张量转换为Python数字用于日志记录。这将其从计算图中分离,确保不会跟踪梯度。
下面的代码实现了训练循环,并在每个epoch结束时打印损失:
以下输出显示模型在五个epoch中的训练进度,损失随着学习改进而稳步下降。
使用PyCharm调试器调试训练过程
虽然PyCharm提供基本Python调试功能,但PyCharm Pro订阅通过完全支持调试Jupyter笔记本和交互式机器学习工作流扩展了此功能。
在模型训练期间,可以在训练循环的关键阶段(如前向传播)设置断点,使执行暂停同时保持笔记本交互。对于本教程中开发的MNIST手写数字分类项目,断点设置在:predictions = model(images)。
这标志着前向传播的开始,其中一批输入图像通过神经网络生成预测。在该行之前立即暂停执行,可以在模型处理数据之前检查输入数据,然后步过该行后检查模型输出。这提供了数据如何在训练期间通过网络流动的清晰视图。
在PyCharm调试器中,Watches面板允许你在执行在断点处暂停时监控自定义表达式。无需手动重复评估表达式,监视点会在每次调试步骤后自动刷新其值,使得在训练过程中更容易检查张量和验证中间结果。
对于本项目,添加了以下监视点:
images.shape,验证每个输入批次的维度。labels.shape,确认标签批次与输入图像对应。predictions.shape,验证前向传播后网络输出张量的形状符合预期。predictions.argmax(dim=1)[:5],显示批次中前五张图像的预测数字。
步过前向传播后,这些监视点自动更新以显示模型输出。这使得直接验证输入张量是否具有预期维度、确认网络为批次中每张图像产生预测,以及检查预测的数字类别变得简单,无需修改源代码。
本节描述的调试工作流程演示如下视频中:
模型评估
训练完成,但低训练损失并不一定意味着模型良好。它可能只是记住了训练数据。对未见测试数据的评估才能真正告诉你模型的泛化能力。经过五个epoch的训练,模型在测试集上达到96.87%的准确率,正确分类了10,000张从未见过的数字中的9,687张。
这表明,对于简单的全连接架构且没有额外优化技术,模型能够很好地泛化到新数据。同时也展示了PyTorch在实际应用中的一大优势:你可以用相对少的代码从原始数据到可工作且准确的模型。
深度学习的PyTorch进阶技术
掌握构建和训练基本模型后,可以探索更高级的PyTorch技术。它们能进一步提升你的工作,例如使训练更快、扩展更大,或将模型投入生产。其中包括:
- GPU加速。最高影响力的改变之一是将模型和数据迁移到GPU。推荐使用现代NVIDIA GPU(如A100、H100和V100)以最快速度加速PyTorch。它们提供卓越性能,特别是对于
torch.compile等功能。 - 分布式学习。当单个GPU不够用时(模型太大或数据集太大),PyTorch的
torch.distributed后端允许你跨多个GPU或机器扩展训练。DistributedDataParallel(DDP)支持跨多个GPU或机器进行分布式训练,显著提升计算能力并减少训练时间。当模型超出单个GPU容量时,DDP变得必不可少,且只需额外几行代码即可设置。 - 模型部署。训练模型只是一个关键方面;最终需要将其部署给真实用户。TorchServe 是一种灵活且易于使用的工具,用于在生产环境中提供Python模型服务。它支持使用TorchScript以eager模式或图模式部署模型、并发服务多个模型、为A/B测试进行模型版本管理、动态加载和卸载模型,以及监控详细日志和可自定义的指标。
这三种技术代表了任何高级深度学习项目的自然进展。你从单机开始,在需要时扩展规模,并在准备就绪时交付。随着项目规模的扩大,它们值得探索。
总结与资源
在本教程中,你从理解PyTorch的概念开始,到构建并训练一个能够以超过96%准确率识别手写数字的神经网络。我们还介绍了张量、torch.nn模块、训练循环和模型评估,这些是每个使用PyTorch构建的深度学习项目的核心构建模块。
这只是开始。PyTorch的真正深度在于后续内容——卷积网络、迁移学习以及庞大的Hugging Face预训练模型生态系统(这些模型运行在PyTorch后端上),它们都建立在你在本教程中所学到的相同基础上。继续实验吧!更换优化器、添加一层、尝试不同的数据集。
下一步的好选择是探索官方PyTorch教程,涵盖了从卷积网络到生产环境部署模型的所有内容。如需更结构化的学习路径,《从零到大师》PyTorch课程是免费且适合初学者的,正好接续本教程的内容。## 在 PyCharm 中构建你的第一个 PyTorch 模型
PyCharm 为整个深度学习工作流程提供统一环境:安装 PyTorch、编写模型代码、运行 Notebook、调试训练循环、检查张量、跟踪实验,以及随着项目规模增长使用 Git 或 Docker 进行项目管理。
免费下载 PyCharm,并使用本教程构建你的第一个 MNIST 分类器。
关于作者
[LOADING...]
Naa Ashiorkor
Naa Ashiorkor 是一名数据科学家和技术社区建设者。她深度参与 Python 社区,并担任包括 EuroPython 在内的多个会议的组织者。目前她正在建设 PyLadies Tampere。