当前位置: 代码网 > 科技>人工智能>数据分析 > 深度学习新手指南:掌握 PyTorch 从基础到实战训练

深度学习新手指南:掌握 PyTorch 从基础到实战训练

2024年08月05日 数据分析 我要评论
切记以上代码可能刚开始看会有些困难,但这很正常,一定要克制住自己的好奇心直接看答案,哪怕实在想不出来,也应该先把自己的思考和尝试写下来。然后再去看答案,比对自己的输出和答案有什么区别(敏感的人可能发现了,这和前向传播和计算损失很像),确实是这样,就是需要不断训练自己的大脑。熟悉PyTorch可能需要一些时间,这很正常!PyTorch是深度学习开发的强大工具。完成上面的练习后,可以在这里查看快速入门教程,该教程将涵盖更多方面,包括保存和加载模型以及数据集和数据加载器。

本教程目标:

  1. 在 pytorch 中执行张量运算。
  2. 了解 autograd 背景下神经网络的后向和前向传递。
  3. 检测 pytorch 训练代码中的常见问题。

本教程内容:

0. 快速开始

方法一:colab已经自动帮我们安装好了torch库,我们可以直接使用。建议可以直接先使用在线的编译器,先快速理解知识点。

方法二:在vscode/pycharm上通过pip install 来安装torch,torchvision

1. tensor

我们将从最基本的张量开始。首先,浏览官方张量教程这里

  1. 将二维列表 [[5,3], [0,9]] 转换为一个张量
  2. 使用区间 [0, 1) 上均匀分布的随机数创建形状 (5, 4) 的张量t
  3. 找出张量t所在的设备及其数据类型。
  4. 创建形状 (4,4)(4,4) 的两个随机张量,分别称为uv。将它们连接起来形成形状为 (8, 4) 的张量。
  5. 连接 uv 以创建形状 (2, 4, 4) 的张量。
  6. 连接 uv 形成一个张量,称为形状 (4, 4, 2)w
  7. 索引 w 位于 3, 3, 0。将该元素称为e
  8. 会在 uv 的哪一个中找到 w?并核实。
  9. 创建一个形状为 (4, 3) 的全为 1 的张量 a。对a进行元素级别的自乘操作。
  10. a添加一个额外的维度(新的第 0 维度)。
  11. 执行 a 与转置矩阵的乘法。
  12. a.mul(a) 会产生什么结果?

2. autograd 和神经网络

接下来,我们学习自动梯度教程和神经网络教程。

神经网络(nn) 是对某些输入数据执行的嵌套函数的集合。这些函数由参数(由权重和偏差组成)定义,这些参数在pytorch中存储在张量中。可以使用 torch.nn 包构建神经网络。

训练神经网络分两步进行:

  • 前向传播:在前向传播中,神经网络对正确的输出做出最佳猜测。它通过每个函数运行输入数据来进行猜测。
  • 反向传播:在反向传播中,神经网络根据其猜测的误差按比例调整其参数。它通过从输出向后遍历、收集误差相对于函数参数(梯度)的导数并使用梯度下降来优化参数来实现这一点。

更一般地,神经网络的典型训练过程如下:

  • 定义具有一些可学习参数(或权重)的神经网络
  • 迭代输入数据集
  • 通过网络处理输入
  • 计算损失(输出距离正确还有多远)
  • 将梯度传播回网络参数
  • 更新网络的权重,通常使用简单的更新规则:权重=权重-学习率梯度

有了这些教程,我们就可以尝试以下练习了!假设我们有以下起始代码,将下面这段代码复制到你的编辑器中:

import torch
from torchvision.models import resnet18, resnet18_weights
model = resnet18(weights=resnet18_weights.default)
data = torch.rand(1, 3, 64, 64)
labels = torch.rand(1, 1000)
  1. 使用数据对模型进行前向传递并将其保存为 preds
  2. preds 的形状应该是什么?验证你的猜测。
  3. resnet18conv1 属性的权重参数保存为 w。打印 w 因为我们稍后需要它(请注意,我的 w 不会与你的相同)。
  4. wgrad 属性应该是什么?请验证。
  5. 创建一个交叉熵损失对象,并用它来使用 labelspreds 计算损失,保存为 loss。打印 loss,因为我们稍后需要它。
  6. 打印最后一次产生 loss 损失的数学运算。
  7. 执行反向传播。
  8. w 应该改变吗?检查 #3 的输出。
  9. wgrad 属性会与 #4 不同吗?并验证。
  10. lossgrad 属性应该返回什么?验证一下。
  11. lossrequires_grad 属性应该是什么?验证一下。
  12. labelsrequires_grad 属性应该是什么?验证一下。
  13. 如果你再次执行反向传播会发生什么?
  14. 创建一个学习率 (lr=1e-2) 和动量 (momentum=0.9) 的 sgd 优化器对象,并执行一步。
  15. w 是否应该改变?检查第3题的输出。
  16. loss 是否应该改变?检查第5题的输出。
  17. 将所有可训练参数的梯度清零。
  18. wgrad 属性应该是什么?验证一下。
  19. 在不运行的情况下,判断以下代码是否会成功执行。
  20. 判断以下代码是否会成功执行。
  21. 判断以下代码是否会成功执行。
  22. 对于不能执行的代码,你如何修改其中一个 .backward 行使其工作?
  23. 以下代码的输出是什么?
  24. 以下代码的输出是什么?
  25. 以下代码有什么问题?
  26. 按正确的顺序排列训练循环的以下步骤(有多种正确答案,但你在教程中会看到一种典型的设置):以下代码的输出是什么?
  27. 我们将实现一个有一个隐藏层的神经网络。这个网络将接受一个32x32的灰度图像输入,展开它,通过一个有100个输出特征的仿射变换,应用 relu 非线性,然后映射到目标类别(10)。实现初始化和前向传递,完成以下代码。使用 nn.linear, f.relu, torch.flatten
  28. 用两行代码验证你能通过上述网络进行前向传递。
  29. 在不运行代码的情况下,猜测以下语句的结果是什么?
  30. 获取网络参数的名称
  31. 以下语句指的是哪个网络层?它将评估什么?
  32. 以下示意图包含了实现一个神经网络所需的所有信息。实现初始化和前向传递,完成以下代码。使用 nn.conv2d, nn.linear, f.max_pool2d, f.relu, torch.flatten。提示:relu 在子采样操作后和前两个全连接层之后应用。
  33. 修改上述代码,使用 nn.maxpool2d 代替 f.max_pool2d
  34. 尝试通过将第一个卷积层的输出通道数从6增加到12来增加网络的宽度。你还需要改变什么?

3. 训练分类器

接下来,我们进入教程的最后一部分:cifar10教程。这个教程通过以下步骤来训练一个图像分类器:

  • 使用torchvision加载和归一化 (normalize) cifar10训练和测试数据集
  • 定义一个卷积神经网络
  • 定义一个损失函数
  • 在训练数据上训练网络
  • 在测试数据上测试网络

完成上述教程后,回答以下问题:

  1. 以下数据集加载代码可以运行,但代码中是否有错误?这些错误的影响是什么?如何修复这些错误?
  2. 编写两行代码从数据加载器中获取随机的训练图像(假设上面的错误已经修复)。
  3. 以下训练代码可以运行,但代码中是否有错误(包括计算效率低下)?这些错误的影响是什么?如何修复这些错误?

4. 总结

切记以上代码可能刚开始看会有些困难,但这很正常,一定要克制住自己的好奇心直接看答案,哪怕实在想不出来,也应该先把自己的思考和尝试写下来。然后再去看答案,比对自己的输出和答案有什么区别(敏感的人可能发现了,这和前向传播和计算损失很像),确实是这样,就是需要不断训练自己的大脑。

熟悉pytorch可能需要一些时间,这很正常!pytorch是深度学习开发的强大工具。完成上面的练习后,可以在这里查看快速入门教程,该教程将涵盖更多方面,包括保存和加载模型以及数据集和数据加载器。

这就是我们关于pytorch基础知识的全部内容!恭喜你 - 现在你已经具备了开始解决利用pytorch的更复杂深度学习代码的能力。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com