《动手做科研 》| 04. 科研入门必备的PyTorch 基础知识

地址链接:《动手做科研》04. PyTorch 基础知识

导读: 什么是PyTorch?我们如何用PyTorch快速实现一个完整的神经网络训练流程?

首先阅读官方 Pytorch 教程,然后将完成有关张量 (Tensor)、Autograd、神经网络和分类器训练/评估的练习。有些问题会要求实现几行代码,而其他问题会要求猜测操作的输出是什么,或者识别代码的问题。强烈建议您在参考解决方案中查找问题之前先亲自尝试这些问题。

注意:参考答案在./lecture4.ipynb上

本教程目标:

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

本教程内容:

0. 快速开始

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

在这里插入图片描述

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

1. Tensor

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

张量是一种特殊的数据结构,与数组和矩阵非常相似。在PyTorch中,我们使用张量对模型的输入和输出以及模型的参数进行编码。张量与NumPy的 ndarray 类似,不同之处在于张量可以在GPU或其他专用硬件上运行以加速计算。

如果您熟悉 ndarrays,那么您就会熟悉Tensor API。如果没有,请按照此下面的问题进行操作。最好可以不看答案操作一遍,先思考一下,再去搜索一下,最后比对一下正确的操作,这样子效果是最好的。

  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) 会产生什么结果?
  13. a.matmul(a.T) 会产生什么结果?
  14. a.mul(a.T) 的结果是什么?
  15. 猜猜下面会打印什么。验证一下
t = torch.ones(5)
n = t.numpy()
n[0] = 2
print(t)
  1. 下面会打印什么?
t = torch.tensor([2., 1., 1., 1., 1.])
t.add(2)
t.add_(1)
print(n)

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. 在不运行的情况下,判断以下代码是否会成功执行。

data1 = torch.zeros(1, 3, 64, 64)
data2 = torch.ones(1, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值