提交 68973096 编写于 作者: W wizardforcel

2021-01-19 14:34:51

上级 01f43ff9
......@@ -4,7 +4,7 @@
经过训练的三阶多项式,可以通过最小化平方的欧几里得距离来预测`y = sin(x)``-pi``pi`
此实现使用来自 PyTorch 的 nn 软件包来构建网络。 PyTorch Autograd 使定义计算图和获取梯度变得容易,但是原始的 Autograd 对于定义复杂的神经网络来说可能太低了。 这是 nn 软件包可以提供帮助的地方。 nn 包定义了一组模块,您可以将其视为神经网络层,该神经网络层从输入产生输出并且可能具有一些可训练的权重。
此实现使用来自 PyTorch 的`nn`软件包来构建网络。 PyTorch Autograd 使定义计算图和获取梯度变得容易,但是原始的 Autograd 对于定义复杂的神经网络来说可能太低了。 这是`nn`软件包可以提供帮助的地方。 `nn`包定义了一组模块,您可以将其视为神经网络层,该神经网络层从输入产生输出并且可能具有一些可训练的权重。
```py
import torch
......
......@@ -4,9 +4,9 @@
经过训练的三阶多项式,可以通过最小化平方的欧几里得距离来预测`y = sin(x)``-pi``pi`
此实现使用来自 PyTorch 的 nn 软件包来构建网络。
此实现使用来自 PyTorch 的`nn`软件包来构建网络。
与其像以前那样手动更新模型的权重,不如使用 optim 包定义一个优化器,该优化器将为我们更新权重。 optim 软件包定义了许多深度学习常用的优化算法,包括 SGD + momentum,RMSProp,Adam 等。
与其像以前那样手动更新模型的权重,不如使用`optim`包定义一个优化器,该优化器将为我们更新权重。 `optim`软件包定义了许多深度学习常用的优化算法,包括 SGD + 动量,RMSProp,Adam 等。
```py
import torch
......
# PyTorch:自定义 nn 模块
# PyTorch:自定义`nn`模块
> 原文:<https://pytorch.org/tutorials/beginner/examples_nn/polynomial_module.html#sphx-glr-beginner-examples-nn-polynomial-module-py>
经过训练的三阶多项式,可以通过最小化平方的欧几里得距离来预测`y = sin(x)``-pi``pi`
此实现将模型定义为自定义 Module 子类。 每当您想要一个比现有模块的简单序列更复杂的模型时,都需要以这种方式定义模型。
此实现将模型定义为自定义`Module`子类。 每当您想要一个比现有模块的简单序列更复杂的模型时,都需要以这种方式定义模型。
```py
import torch
......
# torch.nn 到底是什么?
# `torch.nn`到底是什么?
> 原文:<https://pytorch.org/tutorials/beginner/nn_tutorial.html>
作者:杰里米·霍华德(Jeremy Howard), [fast.ai](https://www.fast.ai) 。 感谢 Rachel Thomas 和 Francisco Ingham。
作者:Jeremy Howard,[fast.ai](https://www.fast.ai)。 感谢 Rachel Thomas 和 Francisco Ingham。
我们建议将本教程作为笔记本而不是脚本来运行。 要下载笔记本(.ipynb)文件,请单击页面顶部的链接。
我们建议将本教程作为笔记本而不是脚本来运行。 要下载笔记本(`.ipynb`)文件,请单击页面顶部的链接。
PyTorch 提供设计精美的模块和类 [torch.nn](https://pytorch.org/docs/stable/nn.html)[torch.optim](https://pytorch.org/docs/stable/optim.html)[Dataset](https://pytorch.org/docs/stable/data.html?highlight=dataset#torch.utils.data.Dataset)[DataLoader](https://pytorch.org/docs/stable/data.html?highlight=dataloader#torch.utils.data.DataLoader) 神经网络。 为了充分利用它们的功能并针对您的问题对其进行自定义,您需要真正了解它们在做什么。 为了建立这种理解,我们将首先在 MNIST 数据集上训练基本神经网络,而无需使用这些模型的任何功能。 我们最初将仅使用最基本的 PyTorch 张量功能。 然后,我们将一次从`torch.nn``torch.optim``Dataset``DataLoader`中逐个添加一个功能,以准确显示每个功能,以及如何使代码更简洁或更有效。 灵活。
......@@ -34,7 +34,7 @@ if not (PATH / FILENAME).exists():
```
该数据集为 numpy 数组格式,并已使用 pickle(一种用于序列化数据的 python 特定格式)存储。
该数据集为 numpy 数组格式,并已使用`pickle`(一种用于序列化数据的 python 特定格式)存储。
```py
import pickle
......@@ -45,7 +45,7 @@ with gzip.open((PATH / FILENAME).as_posix(), "rb") as f:
```
每个图像为 28 x 28,并存储为长度为 784(= 28x28)的扁平行。 让我们来看一个; 我们需要先将其重塑为 2d。
每个图像为`28 x 28`,并存储为长度为`784 = 28x28`的扁平行。 让我们来看一个; 我们需要先将其重塑为 2d。
```py
from matplotlib import pyplot
......@@ -96,17 +96,17 @@ tensor(0) tensor(9)
```
## 从零开始的神经网络(no torch.nn
## 从零开始的神经网络(没有`torch.nn`
首先,我们仅使用 PyTorch 张量操作创建模型。 我们假设您已经熟悉神经网络的基础知识。 (如果不是,则可以在 [course.fast.ai](https://course.fast.ai) 中学习它们)。
PyTorch 提供了创建随机或零填充张量的方法,我们将使用它们来为简单的线性模型创建权重和偏差。 这些只是常规张量,还有一个非常特殊的附加值:我们告诉 PyTorch 它们需要梯度。 这使 PyTorch 记录了在张量上完成的所有操作,因此它可以在反向传播*时自动计算*的梯度!
PyTorch 提供了创建随机或零填充张量的方法,我们将使用它们来为简单的线性模型创建权重和偏差。 这些只是常规张量,还有一个非常特殊的附加值:我们告诉 PyTorch 它们需要梯度。 这使 PyTorch 记录了在张量上完成的所有操作,因此它可以在反向传播*自动计算*的梯度!
**对于权重,我们在初始化之后设置`requires_grad`,因为我们不希望该步骤包含在梯度中。 (请注意,PyTorch 中的尾随`_`表示该操作是原地执行的。)**
注意
我们在这里用 [Xavier 初始化](http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf)(通过乘以 1 / sqrt(n))来初始化权重。
我们在这里用 [Xavier 初始化](http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf)(通过乘以`1 / sqrt(n)`)来初始化权重。
```py
import math
......@@ -117,7 +117,7 @@ bias = torch.zeros(10, requires_grad=True)
```
由于 PyTorch 具有自动计算梯度的功能,我们可以将任何标准的 Python 函数(或可调用对象)用作模型! 因此,我们只需编写一个普通矩阵乘法和广播加法即可创建一个简单的线性模型。 我们还需要激活函数,因此我们将编写并使用 log_softmax 。 请记住:尽管 PyTorch 提供了许多预写的损失函数,激活函数等,但是您可以使用纯 Python 轻松编写自己的函数。 PyTorch 甚至会自动为您的功能创建快速 GPU 或向量化的 CPU 代码。
由于 PyTorch 具有自动计算梯度的功能,我们可以将任何标准的 Python 函数(或可调用对象)用作模型! 因此,我们只需编写一个普通矩阵乘法和广播加法即可创建一个简单的线性模型。 我们还需要激活函数,因此我们将编写并使用`log_softmax`。 请记住:尽管 PyTorch 提供了许多预写的损失函数,激活函数等,但是您可以使用纯 Python 轻松编写自己的函数。 PyTorch 甚至会自动为您的功能创建快速 GPU 或向量化的 CPU 代码。
```py
def log_softmax(x):
......@@ -292,7 +292,7 @@ tensor(0.0811, grad_fn=<NllLossBackward>) tensor(1.)
注意
`nn.Module`(大写 M)是 PyTorch 的特定概念,并且是我们将经常使用的一类。 不要将`nn.Module`与(小写`m`[模块](https://docs.python.org/3/tutorial/modules.html)的 Python 概念混淆,该模块是可以导入的 Python 代码文件。
`nn.Module`(大写`M`)是 PyTorch 的特定概念,并且是我们将经常使用的一类。 不要将`nn.Module`[模块](https://docs.python.org/3/tutorial/modules.html)(小写`m`的 Python 概念混淆,该模块是可以导入的 Python 代码文件。
```py
from torch import nn
......@@ -340,7 +340,7 @@ with torch.no_grad():
```
现在我们可以利用 model.parameters()和 model.zero_grad()(它们都由 PyTorch 为`nn.Module`定义)来使这些步骤更简洁,并且更不会出现忘记某些参数的错误,尤其是当 我们有一个更复杂的模型:
现在我们可以利用`model.parameters()``model.zero_grad()`(它们都由 PyTorch 为`nn.Module`定义)来使这些步骤更简洁,并且更不会出现忘记某些参数的错误,尤其是当 我们有一个更复杂的模型:
```py
with torch.no_grad():
......@@ -386,9 +386,9 @@ tensor(0.0808, grad_fn=<NllLossBackward>)
```
## 使用 nn.Linear 重构
## 使用`nn.Linear`重构
我们继续重构我们的代码。 代替手动定义和初始化`self.weights``self.bias`并计算`xb  @ self.weights + self.bias`,我们将对线性层使用 Pytorch 类 [nn.Linear](https://pytorch.org/docs/stable/nn.html#linear-layers) ,这将为我们完成所有工作。 Pytorch 具有许多类型的预定义层,可以大大简化我们的代码,并且通常也可以使其速度更快。
我们继续重构我们的代码。 代替手动定义和初始化`self.weights``self.bias`并计算`xb  @ self.weights + self.bias`,我们将对线性层使用 Pytorch 类[`nn.Linear`](https://pytorch.org/docs/stable/nn.html#linear-layers),这将为我们完成所有工作。 Pytorch 具有许多类型的预定义层,可以大大简化我们的代码,并且通常也可以使其速度更快。
```py
class Mnist_Logistic(nn.Module):
......@@ -497,9 +497,9 @@ tensor(0.0823, grad_fn=<NllLossBackward>)
## 使用数据集重构
PyTorch 有一个抽象的 Dataset 类。 数据集可以是具有`__len__`函数(由 Python 的标准`len`函数调用)和具有`__getitem__`函数作为对其进行索引的一种方法。 [本教程](https://pytorch.org/tutorials/beginner/data_loading_tutorial.html)演示了一个不错的示例,该示例创建一个自定义`FacialLandmarkDataset`类作为`Dataset`的子类。
PyTorch 有一个抽象的`Dataset`类。 数据集可以是具有`__len__`函数(由 Python 的标准`len`函数调用)和具有`__getitem__`函数作为对其进行索引的一种方法。 [本教程](https://pytorch.org/tutorials/beginner/data_loading_tutorial.html)演示了一个不错的示例,该示例创建一个自定义`FacialLandmarkDataset`类作为`Dataset`的子类。
PyTorch 的 [TensorDataset](https://pytorch.org/docs/stable/_modules/torch/utils/data/dataset.html#TensorDataset) 是一个数据集包装张量。 通过定义索引的长度和方式,这也为我们提供了沿张量的第一维进行迭代,索引和切片的方法。 这将使我们在训练的同一行中更容易访问自变量和因变量。
PyTorch 的[`TensorDataset`](https://pytorch.org/docs/stable/_modules/torch/utils/data/dataset.html#TensorDataset)是一个数据集包装张量。 通过定义索引的长度和方式,这也为我们提供了沿张量的第一维进行迭代,索引和切片的方法。 这将使我们在训练的同一行中更容易访问自变量和因变量。
```py
from torch.utils.data import TensorDataset
......@@ -513,7 +513,7 @@ train_ds = TensorDataset(x_train, y_train)
```
以前,我们不得不分别遍历 x 和 y 值的小批量:
以前,我们不得不分别遍历`x``y`值的小批量:
```py
xb = x_train[start_i:end_i]
......@@ -552,9 +552,9 @@ tensor(0.0819, grad_fn=<NllLossBackward>)
```
## 使用 DataLoader 重构
## 使用`DataLoader`重构
Pytorch 的`DataLoader`负责批量管理。 您可以从任何`Dataset`创建一个`DataLoader``DataLoader`使迭代迭代变得更加容易。 不必使用`train_ds[i*bs : i*bs+bs]`DataLoader 会自动为我们提供每个小批量。
Pytorch 的`DataLoader`负责批量管理。 您可以从任何`Dataset`创建一个`DataLoader``DataLoader`使迭代迭代变得更加容易。 不必使用`train_ds[i*bs : i*bs+bs]``DataLoader`会自动为我们提供每个小批量。
```py
from torch.utils.data import DataLoader
......@@ -564,7 +564,7 @@ train_dl = DataLoader(train_ds, batch_size=bs)
```
以前,我们的循环遍历如下批量(xb,yb)
以前,我们的循环遍历如下批量`(xb, yb)`
```py
for i in range((n-1)//bs + 1):
......@@ -573,7 +573,7 @@ for i in range((n-1)//bs + 1):
```
现在,我们的循环更加简洁了,因为(xb,yb)是从数据加载器自动加载的:
现在,我们的循环更加简洁了,因为`(xb, yb)`是从数据加载器自动加载的:
```py
for xb,yb in train_dl:
......@@ -656,7 +656,7 @@ for epoch in range(epochs):
```
## 创建 fit()和 get_data()
## 创建`fit()`和`get_data()`
现在,我们将自己进行一些重构。 由于我们经历了两次相似的过程来计算训练集和验证集的损失,因此我们将其设为自己的函数`loss_batch`,该函数可计算一批损失。
......@@ -731,7 +731,7 @@ fit(epochs, model, loss_func, opt, train_dl, valid_dl)
现在,我们将构建具有三个卷积层的神经网络。 由于上一节中的任何功能都不假设任何有关模型形式的信息,因此我们将能够使用它们来训练 CNN,而无需进行任何修改。
我们将使用 Pytorch 的预定义 [Conv2d](https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d) 类作为我们的卷积层。 我们定义了具有 3 个卷积层的 CNN。 每个卷积后跟一个 ReLU。 最后,我们执行平均池化。 (请注意,`view`是 numpy 的`reshape`的 PyTorch 版本)
我们将使用 Pytorch 的预定义[`Conv2d`](https://pytorch.org/docs/stable/nn.html#torch.nn.Conv2d)类作为我们的卷积层。 我们定义了具有 3 个卷积层的 CNN。 每个卷积后跟一个 ReLU。 最后,我们执行平均池化。 (请注意,`view`是 numpy 的`reshape`的 PyTorch 版本)
```py
class Mnist_CNN(nn.Module):
......@@ -820,12 +820,12 @@ fit(epochs, model, loss_func, opt, train_dl, valid_dl)
```
## 包装 DataLoader
## 包装`DataLoader`
Our CNN is fairly concise, but it only works with MNIST, because:
* 假设输入为 28 * 28 长向量
* 假设 CNN 的最终网格尺寸为 4 * 4(因为这是平均值
* 假设输入为`28 * 28`长向量
* 假设 CNN 的最终网格尺寸为`4 * 4`(因为这是平均值
我们使用的合并内核大小)
......@@ -889,7 +889,7 @@ fit(epochs, model, loss_func, opt, train_dl, valid_dl)
## 使用您的 GPU
如果您足够幸运地能够使用具有 CUDA 功能的 GPU(可以从大多数云提供商处以每小时$ 0.50 的价格租用一个),则可以使用它来加速代码。 首先检查您的 GPU 是否在 Pytorch 中正常工作:
如果您足够幸运地能够使用具有 CUDA 功能的 GPU(可以从大多数云提供商处以每小时 0.50 美元的价格租用一个),则可以使用它来加速代码。 首先检查您的 GPU 是否在 Pytorch 中正常工作:
```py
print(torch.cuda.is_available())
......@@ -948,7 +948,7 @@ fit(epochs, model, loss_func, opt, train_dl, valid_dl)
## 结束语
现在,我们有了一个通用的数据管道和训练循环,您可以将其用于使用 Pytorch 训练许多类型的模型。 要了解现在可以轻松进行模型训练,请查看 mnist_sample 示例笔记本。
现在,我们有了一个通用的数据管道和训练循环,您可以将其用于使用 Pytorch 训练许多类型的模型。 要了解现在可以轻松进行模型训练,请查看`mnist_sample`示例笔记本。
当然,您需要添加很多内容,例如数据增强,超参数调整,监控训练,迁移学习等。 这些功能可在 fastai 库中使用,该库是使用本教程中所示的相同设计方法开发的,为希望进一步推广其模型的从业人员提供了自然的下一步。
......@@ -956,7 +956,7 @@ fit(epochs, model, loss_func, opt, train_dl, valid_dl)
> * `torch.nn`
> * `Module`:创建一个行为类似于函数的可调用对象,但也可以包含状态(例如神经网络层权重)。 它知道其中包含的 `Parameter` ,并且可以将其所有坡度归零,遍历它们以进行权重更新等。
> * `Parameter`:张量的包装器,用于告知 `Module` 具有在反向传播期间需要更新的权重。 仅更新具有 require_grad 属性集的张量
> * `Parameter`:张量的包装器,用于告知 `Module` 具有在反向传播期间需要更新的权重。 仅更新具有`require_grad`属性集的张量
> * `functional`:一个模块(通常按照惯例导入到 `F` 名称空间中),其中包含激活函数,损失函数等。 以及卷积和线性层等层的无状态版本。
> * `torch.optim`:包含诸如 `SGD` 的优化程序,这些优化程序在后退步骤
> * `Dataset` 中更新 `Parameter` 的权重。 具有 `__len__` 和 `__getitem__` 的对象,包括 Pytorch 提供的类,例如 `TensorDataset`
......
......@@ -73,7 +73,7 @@ def matplotlib_imshow(img, one_channel=False):
```
我们将在该教程中定义一个类似的模型架构,仅需进行少量修改即可解决以下事实:图像现在是一个通道而不是三个通道,而图像是 28x28 而不是 32x32
我们将在该教程中定义一个类似的模型架构,仅需进行少量修改即可解决以下事实:图像现在是一个通道而不是三个通道,而图像是`28x28`而不是`32x32`
```py
class Net(nn.Module):
......@@ -164,17 +164,17 @@ writer.close()
```
现在刷新 TensorBoard 后,您应该会看到一个“ Graphs”标签,如下所示:
现在刷新 TensorBoard 后,您应该会看到一个`Graphs`标签,如下所示:
![intermediate/../../_static/img/tensorboard_model_viz.png](img/8f596b99dbb3c262b61db267d5db2d63.png)
继续并双击“ Net”以展开它,查看构成模型的各个操作的详细视图。
继续并双击`Net`以展开它,查看构成模型的各个操作的详细视图。
TensorBoard 具有非常方便的功能,可在低维空间中可视化高维数据,例如图像数据。 接下来我们将介绍这一点。
## 4.在 TensorBoard 中添加“投影仪”
我们可以通过 [add_embedding](https://pytorch.org/docs/stable/tensorboard.html#torch.utils.tensorboard.writer.SummaryWriter.add_embedding) 方法可视化高维数据的低维表示
我们可以通过[`add_embedding`](https://pytorch.org/docs/stable/tensorboard.html#torch.utils.tensorboard.writer.SummaryWriter.add_embedding)方法可视化高维数据的低维表示
```py
# helper function
......@@ -210,7 +210,7 @@ writer.close()
## 5.使用 TensorBoard 跟踪模型训练
在前面的示例中,我们仅*每 2000 次迭代打印*该模型的运行损失。 现在,我们将运行损失记录到 TensorBoard 中,并通过`plot_classes_preds`函数查看模型所做的预测。
在前面的示例中,我们仅*每 2000 次迭代*打印该模型的运行损失。 现在,我们将运行损失记录到 TensorBoard 中,并通过`plot_classes_preds`函数查看模型所做的预测。
```py
# helper functions
......@@ -341,7 +341,7 @@ for i in range(len(classes)):
```
现在,您将看到一个“ PR Curves”选项卡,其中包含每个类别的精确调用曲线。 继续四处戳; 您会发现在某些类别中,模型的“曲线下面积”接近 100%,而在另一些类别中,该面积更低:
现在,您将看到一个`PR Curves`选项卡,其中包含每个类别的精确调用曲线。 继续四处戳; 您会发现在某些类别中,模型的“曲线下面积”接近 100%,而在另一些类别中,该面积更低:
![intermediate/../../_static/img/tensorboard_pr_curves.png](img/d15de2be2b754f9a4f46418764232b5e.png)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册