提交 fc2c6711 编写于 作者: W wizardforcel

2021-01-24 18:55:00

上级 04c7b3ce
......@@ -37,7 +37,7 @@ pip install torchvision
# 定义神经网络类
在本秘籍中,我们将从了解`torchvision`的一些重要功能开始,这些功能使它能够处理图像数据并进行处理。 然后,我们将通过定义一个类来定义神经网络的基本架构,并查看可用于此的模块和方法。 在本秘籍中,我们将专注于全连接神经网络类。 它的属性是各个层,其目的是对各种类型的衣服进行分类。
在本秘籍中,我们将从了解`torchvision`的一些重要函数开始,这些函数使它能够处理图像数据并进行处理。 然后,我们将通过定义一个类来定义神经网络的基本架构,并查看可用于此的模块和方法。 在本秘籍中,我们将专注于全连接神经网络类。 它的属性是各个层,其目的是对各种类型的衣服进行分类。
我们将使用 Fashion–MNIST 数据集。 这是 Zalando 文章图片的数据集,包括 6 万个示例的训练集和 10,000 个示例的测试集。 我们将拍摄一张尺寸为`28 x 28`的灰度图像,并将其转换为 784 的向量。
......@@ -230,7 +230,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
在秘籍中,通过建立前向网络来完成网络,其中我们将构造器中定义的网络组件捆绑在一起。 用`nn.Module`定义的网络需要定义`forward()`方法。 它采用输入张量,并按照正向方法中定义的操作顺序,将其通过网络类中`__init__()`方法中定义的网络组件。
当传递输入时,将引用模型对象的名称自动调用 forward 方法。 `nn.Module`自动创建将在正向方法中使用的权重和偏差张量。 线性单元本身定义了线性函数,例如`xW + B`; 要具有非线性功能,我们需要插入非线性激活函数,在这里我们使用最流行的激活函数之一 ReLU,尽管您可以在 PyTorch 中使用其他可用的激活函数。
当传递输入时,将引用模型对象的名称自动调用 forward 方法。 `nn.Module`自动创建将在正向方法中使用的权重和偏差张量。 线性单元本身定义了线性函数,例如`xW + B`; 要具有非线性函数,我们需要插入非线性激活函数,在这里我们使用最流行的激活函数之一 ReLU,尽管您可以在 PyTorch 中使用其他可用的激活函数。
我们的输入层有 784 个单位(从`28 x 28`像素开始),第一层具有 ReLU 激活的 256 个单位,然后具有 ReLU 激活的 128 个单位,最后有 softmax 激活的 10 个单位。 我们通过 softmax 压缩最终层输出的原因是因为我们希望有 1 个输出类的概率高于所有其他类,并且输出概率之和应等于 1。softmax 函数的参数`dim=1`是为了确保在输出的各列中采用 softmax。 然后,我们使用模型类创建一个对象,并使用`print(model)`打印该类的详细信息。
......@@ -244,7 +244,7 @@ TorchVision 的`datasets`模块附带了许多受欢迎的数据集; 如果机
# 定义损失函数
机器学习模型在接受训练时,可能会在预测输出和实际输出之间存在一些偏差,这种差异称为模型的**误差**。 让我们计算该误差的函数称为**损失函数****误差函数**。 此功能提供了一种度量标准,用于评估所有可能的解决方案并选择最优化的模型。 损失函数必须能够将模型的所有属性减少到一个单一的数字,以便该损失函数值的改善代表更好的模型。
机器学习模型在接受训练时,可能会在预测输出和实际输出之间存在一些偏差,这种差异称为模型的**误差**。 让我们计算该误差的函数称为**损失函数****误差函数**。 此函数提供了一种度量标准,用于评估所有可能的解决方案并选择最优化的模型。 损失函数必须能够将模型的所有属性减少到一个单一的数字,以便该损失函数值的改善代表更好的模型。
在本秘籍中,我们将使用 PyTorch 中可用的损失函数为我们的时装数据集定义损失函数。
......@@ -479,7 +479,7 @@ Training loss: 0.2596
使用丢弃是神经网络中最流行的正则化技术之一,在这种技术中,训练时会关闭随机选择的神经元,也就是说,神经元的作用会暂时从正向传播中移除,而反向传播不会影响权重 ,因此没有一个神经元或神经元子集能获得模型的所有决定力; 相反,所有神经元都被迫为预测做出积极贡献。
丢弃可以直观地理解为创建大量集成模型,学习在一个模型的大定义下捕获各种功能
丢弃可以直观地理解为创建大量集成模型,学习在一个模型的大定义下捕获各种特征
在本秘籍中,我们将研究如何在模型定义中添加缺失,以通过防止过拟合来改善整体模型表现。 应当记住,丢弃仅在训练时才适用; 但是,在测试和实际预测期间,我们希望所有神经元都做出贡献。
......@@ -600,4 +600,4 @@ Training loss: 0.2596
# 另见
您可以通过[这个页面](https://pytorch.org/docs/stable/nn.html#torch-nn-functional)了解更多有关功能 API 的信息。
\ No newline at end of file
您可以通过[这个页面](https://pytorch.org/docs/stable/nn.html#torch-nn-functional)了解更多有关函数式 API 的信息。
\ No newline at end of file
......@@ -365,7 +365,7 @@ PyTorch 无法直接处理图像像素,需要将其内容作为张量。 为
# 另见
您可以在[这个页面](https://pytorch.org/docs/stable/torchvision/transforms.html#functional-transforms)上了解有关功能转换的更多信息。
您可以在[这个页面](https://pytorch.org/docs/stable/torchvision/transforms.html#functional-transforms)上了解有关函数式转换的更多信息。
# 执行数据扩充
......@@ -595,7 +595,7 @@ pip install torchvision==0.x.x
# 更多
`DataLoader()`模块中还有许多功能-例如,`DataLoader()`可用于多进程数据加载,而`num_workers`控制在加载数据时要使用的子进程数。 在我们的示例中,我们使用了默认值`0`,这意味着数据已在主进程中加载​​,这对于小型数据集是理想的选择,并为我们提供了更具可读性的错误跟踪。
`DataLoader()`模块中还有许多函数-例如,`DataLoader()`可用于多进程数据加载,而`num_workers`控制在加载数据时要使用的子进程数。 在我们的示例中,我们使用了默认值`0`,这意味着数据已在主进程中加载​​,这对于小型数据集是理想的选择,并为我们提供了更具可读性的错误跟踪。
# 另见
......
......@@ -96,7 +96,7 @@ model.fc = nn.Sequential(
return model
```
有了这个秘籍,我们已经准备好要获取模型的功能
有了这个秘籍,我们已经准备好要获取模型的函数
# 工作原理
......@@ -106,7 +106,7 @@ return model
# 实现模型训练
在本秘籍中,我们将实现一个在单个时期内训练模型的功能。 此功能进一步记录模型的训练指标并将其绘制到 TensorBoard 上。 我们将传入模型,训练数据,优化器和模型训练准则,并将返回训练损失。
在本秘籍中,我们将实现一个在单个时期内训练模型的函数。 此函数进一步记录模型的训练指标并将其绘制到 TensorBoard 上。 我们将传入模型,训练数据,优化器和模型训练准则,并将返回训练损失。
# 操作步骤
......@@ -151,7 +151,7 @@ return model
# 工作原理
在此秘籍中,我们定义了执行训练时期的功能。 在开始训练过程之前,我们使用`.train()`将模型设置为训练模式,并将训练损失设置为`0`。 然后,我们遍历训练数据并将输入数据点及其对应的标签移到可用设备(CPU 或 GPU)上。
在此秘籍中,我们定义了执行训练时期的函数。 在开始训练过程之前,我们使用`.train()`将模型设置为训练模式,并将训练损失设置为`0`。 然后,我们遍历训练数据并将输入数据点及其对应的标签移到可用设备(CPU 或 GPU)上。
然后,我们清除梯度,进行模型预测,然后将其传递给准则以确定训练损失。 然后,我们对损失进行了反向传播,并更新了模型的权重。 由于模型是冻结的,因此它仅更新模型中分类器的权重。
......@@ -159,11 +159,11 @@ return model
# 实现模型测试
在此秘籍中,我们将定义一个函数以在一个时期内根据验证数据测试模型。 此功能还将测试指标记录到 TensorBoard 上。 我们还将添加工具功能,通过绘制图像并以可读的方式标记这些图像来记录模型中的一些错误分类。
在此秘籍中,我们将定义一个函数以在一个时期内根据验证数据测试模型。 此函数还将测试指标记录到 TensorBoard 上。 我们还将添加工具函数,通过绘制图像并以可读的方式标记这些图像来记录模型中的一些错误分类。
# 操作步骤
在本秘籍中,我们将实现模型测试以及工具功能
在本秘籍中,我们将实现模型测试以及工具函数
1. 首先,我们将定义一个将张量转换为图像的函数:
......@@ -222,7 +222,7 @@ return model
return total_loss, accuracy
```
通过此秘籍,我们完成了测试功能
通过此秘籍,我们完成了测试函数
# 工作原理
......@@ -341,7 +341,7 @@ return model
# 定义 TensorBoard 编写器
在此秘籍中,我们将创建一个写入 TensorBoard 的对象。 我们使用`SummaryWriter`对象写入 TensorBoard。 我们可以使用 TensorBoard 编写标量值,绘图图和绘图图像以及其他功能。 我们将定义一个返回 TensorBoard `SummaryWriter`对象以记录我们的模型指标的函数。
在此秘籍中,我们将创建一个写入 TensorBoard 的对象。 我们使用`SummaryWriter`对象写入 TensorBoard。 我们可以使用 TensorBoard 编写标量值,绘图图和绘图图像以及其他。 我们将定义一个返回 TensorBoard `SummaryWriter`对象以记录我们的模型指标的函数。
# 准备
......@@ -563,7 +563,7 @@ Epoch | Training Loss | Test Loss | Accuracy |
# 工作原理
在此秘籍中,我们创建了模型并将其移至可用设备,并分别使用负对数损失和 Adam 作为我们的标准和优化器。 `train_epochs()`方法用于在定义的时期范围内训练模型。 在每个时期结束时,我们使用`writer.flush()`方法来确保所有未决事件已写入磁盘。 最后,我们使用`writer.close()`刷新关闭编写器。 我们还在此功能中保存了最佳模型,以供日后重新加载。
在此秘籍中,我们创建了模型并将其移至可用设备,并分别使用负对数损失和 Adam 作为我们的标准和优化器。 `train_epochs()`方法用于在定义的时期范围内训练模型。 在每个时期结束时,我们使用`writer.flush()`方法来确保所有未决事件已写入磁盘。 最后,我们使用`writer.close()`刷新关闭编写器。 我们还在此函数中保存了最佳模型,以供日后重新加载。
然后,我们从到目前为止的训练中重新加载了最佳模型,并对其进行了冻结以进行微调。 解冻后,所有模型参数均可用于训练。 我们将优化器设置为较低的学习率,对该未冻结的模型进行了更多的训练,并记录了模型的表现。 我们看到,通过微调,我们的模型表现更好。
......
......@@ -24,7 +24,7 @@ RL 是**人工智能**(**AI**)的领域,与我们在前面各章中介绍
深度学习算法可以学习抽象出环境状态的细节,然后学习状态的重要特征。 由于深度学习算法仅具有有限数量的参数,因此我们可以使用它将可能的状态压缩为更少的状态,然后使用该新表示形式来选择一个动作。
RL 解决方案涉及将反复试验的结果存储在查找表中,当环境变得越来越复杂时,查找表将变得非常庞大。 深度神经网络可能会学会识别程序员自己必须使用查找表方法手动设计的相同高级功能
RL 解决方案涉及将反复试验的结果存储在查找表中,当环境变得越来越复杂时,查找表将变得非常庞大。 深度神经网络可能会学会识别程序员自己必须使用查找表方法手动设计的相同高级特征
深度学习是 RL 最近取得突破的背后。 它们展现了代表性的功能,效率,灵活性,并为眼前的问题提供了简化的解决方案。
......@@ -656,11 +656,11 @@ return total_reward
return agents_score
```
现在,我们的功能已准备好进行评估。
现在,我们的函数已准备好进行评估。
# 工作原理
在本秘籍中,我们完成了深度遗传算法的一些关键功能。 我们研究了三个不同的功能-第一个功能`eval_agent()`与我们在“训练 DQN”秘籍中看到的功能非常相似,其中我们使用了智能体,该智能体是一种神经网络模型,它预测要采取的动作,并执行到`MAX_STEP`(对于`cartpole-v1`为 500)或终端为`True`并返回分数的动作。
在本秘籍中,我们完成了深度遗传算法的一些关键函数。 我们研究了三个不同的函数-第一个函数`eval_agent()`与我们在“训练 DQN”秘籍中看到的函数非常相似,其中我们使用了智能体,该智能体是一种神经网络模型,它预测要采取的动作,并执行到`MAX_STEP`(对于`cartpole-v1`为 500)或终端为`True`并返回分数的动作。
然后,我们使用第二个函数`agent_score()`返回指定数量`runs`之上的平均分数,并返回该平均分数,以确保模型的随机表现不佳。 最后一个函数`all_agent_score()`仅循环遍历一代中的所有智能体,并获得一代中所有智能体的平均分数。
......@@ -748,7 +748,7 @@ return copy.deepcopy(agents[top_id])
return np.argsort(rewards)[::-1][:num_top_parents]
```
在这里,我们定义了识别精英智能体的功能和为智能体增加噪音的功能
在这里,我们定义了识别精英智能体的函数和为智能体增加噪音的函数
# 工作原理
......@@ -760,7 +760,7 @@ return copy.deepcopy(agents[top_id])
# 训练深度 GA
在本秘籍中,我们将完成深度遗传算法的演化,并可视化执行平衡操作的关键。 我们将使用在本章的秘籍中了解到的所有功能,并针对给定的代数运行这些功能。 这将创建智能体,获取他们的分数,选择表现最佳的智能体,并将其突变为下一代。 在几代人中,我们将看到智能体的分数增加。
在本秘籍中,我们将完成深度遗传算法的演化,并可视化执行平衡操作的关键。 我们将使用在本章的秘籍中了解到的所有函数,并针对给定的代数运行这些函数。 这将创建智能体,获取他们的分数,选择表现最佳的智能体,并将其突变为下一代。 在几代人中,我们将看到智能体的分数增加。
# 操作步骤
......
......@@ -162,7 +162,7 @@ python imageapp.py
在本秘籍中,我们使用 Flask Python 框架部署了使用 RESTful API 进行推理的模型。 我们首先创建`image_classifier.py`并从`idx_class.json`加载类名。
在此文件中,第一个函数加载预先训练的`densenet161`模型,该模型在 ImageNet 数据集中具有 1,000 个类别的模型上进行训练; 我们将模型设置为评估模式,然后返回模型。 第二个函数将给定的输入图像转换为张量并对其进行变换。 我们使用了`PIL`中的`Image`模块来读取图像数据。 第三个功能通过将给定图像转换为张量并将其传递到模型中来进行预测。 这将返回图像中对象的名称。
在此文件中,第一个函数加载预先训练的`densenet161`模型,该模型在 ImageNet 数据集中具有 1,000 个类别的模型上进行训练; 我们将模型设置为评估模式,然后返回模型。 第二个函数将给定的输入图像转换为张量并对其进行变换。 我们使用了`PIL`中的`Image`模块来读取图像数据。 第三个函数通过将给定图像转换为张量并将其传递到模型中来进行预测。 这将返回图像中对象的名称。
然后,我们切换到`imageapp.py`文件,在这里我们使用 Flask 创建了 Web 应用。 在这里,我们使用`app = Flask(__name__)`创建了 Flask 应用,并使用`create_model`函数创建了模型。 此后,我们创建了一个名为`/predict`的路由,该路由使用我们创建的应用实例接收了一个`POST`请求。 然后,我们定义了`predicted`函数,该函数将在调用`/predict` URL 时被调用。 `request.files`在 POST 请求中保存文件。 在这里,我们检查了是否使用发布参数名称`image`上传了图像文件。
......
......@@ -87,7 +87,7 @@ for batch in dataloader:
`num_worker`参数决定应该操作多少个并行线程来获取数据。 这有助于避免 CPU 瓶颈,以便 CPU 可以赶上 GPU 的并行操作。 数据加载器允许用户指定是否使用固定的 CUDA 内存,这会将数据张量复制到 CUDA 的固定的内存中,然后再返回给用户。 使用固定内存是设备之间快速数据传输的关键,因为数据是由数据加载程序本身加载到固定内存中的,而无论如何,这都是由 CPU 的多个内核完成的。
大多数情况下,尤其是在进行原型制作时,开发人员可能无法使用自定义数据集,在这种情况下,自定义数据集必须依赖现有的开放数据集。 处理开放数据集的好处是,大多数数据集免于许可负担,成千上万的人已经尝试过对其进行预处理,因此社区将提供帮助。 PyTorch 提出了针对所有三种类型的数据集的工具包,这些程序包具有经过预训练的模型,经过预处理的数据集以及与这些数据集一起使用的工具功能
大多数情况下,尤其是在进行原型制作时,开发人员可能无法使用自定义数据集,在这种情况下,自定义数据集必须依赖现有的开放数据集。 处理开放数据集的好处是,大多数数据集免于许可负担,成千上万的人已经尝试过对其进行预处理,因此社区将提供帮助。 PyTorch 提出了针对所有三种类型的数据集的工具包,这些程序包具有经过预训练的模型,经过预处理的数据集以及与这些数据集一起使用的工具函数
### 工具包
......@@ -102,7 +102,7 @@ pip install torchvision
`torchvision`是 PyTorch 中最成熟,使用最多的工具包,它由数据集,预先训练的模型和预先构建的转换脚本组成。 `torchvision`具有功能强大的 API,使用户能够轻松进行数据的预处理,并且在原型阶段(甚至可能无法使用数据集)特别有用。
`torchvision`的功能分为三类:预加载的,可下载的数据集,用于几乎所有类型的计算机视觉问题; 流行的计算机视觉架构的预训练模型; 以及用于计算机视觉问题的常见转换函数。 另外一个好处是,`torchvision`软件包的功能 API 的简单性使用户可以编写自定义数据集或转换函数。 以下是`torchvision`程序包中可用的所有当前数据集的表格及其说明:
`torchvision`的功能分为三类:预加载的,可下载的数据集,用于几乎所有类型的计算机视觉问题; 流行的计算机视觉架构的预训练模型; 以及用于计算机视觉问题的常见转换函数。 另外一个好处是,`torchvision`软件包的函数式 API 的简单性使用户可以编写自定义数据集或转换函数。 以下是`torchvision`程序包中可用的所有当前数据集的表格及其说明:
| 数据集 | 描述 |
| --- | --- |
......@@ -342,7 +342,7 @@ python setup.py install
```
`torchaudio`带有两个预先构建的数据集,一些转换以及一个用于音频文件的加载和保存工具。 让我们深入探讨其中的每一个。 加载和保存音频文件总是很麻烦,并且依赖于其他几个软件包。 `torchaudio`通过提供简单的加载和保存功能 API 使其变得更加容易。 `torchtext`可以加载任何常见的音频文件并将其转换为 PyTorch 张量。 它还可以对数据进行规范化和非规范化,以及以任何通用格式写回磁盘。 保存的 API 接受文件路径,并从文件路径推断输出格式,然后将其转换为该格式,然后再将其写回磁盘。
`torchaudio`带有两个预先构建的数据集,一些转换以及一个用于音频文件的加载和保存工具。 让我们深入探讨其中的每一个。 加载和保存音频文件总是很麻烦,并且依赖于其他几个软件包。 `torchaudio`通过提供简单的加载和保存函数式 API 使其变得更加容易。 `torchtext`可以加载任何常见的音频文件并将其转换为 PyTorch 张量。 它还可以对数据进行规范化和非规范化,以及以任何通用格式写回磁盘。 保存的 API 接受文件路径,并从文件路径推断输出格式,然后将其转换为该格式,然后再将其写回磁盘。
```py
>>> data, sample_rate = torchaudio.load('foo.mp3')
......
......@@ -51,7 +51,7 @@ CNN 通过两种机制实现位置不变:跨步和合并。 步幅值决定了
PyTorch 为计算机视觉提供了几个便捷功能,其中包括卷积层和池化层。 PyTorch 在`torch.nn`包下提供`Conv1d``Conv2d``Conv3d`。 听起来,`Conv1d`处理一维卷积,`Conv2d`处理带有图像之类输入的二维卷积,`Conv3d`处理诸如视频之类的输入上的三维卷积。 显然,这很令人困惑,因为指定的尺寸从未考虑输入的深度。 例如,`Conv2d`处理四维输入,其中第一维将是批量大小,第二维将是图像的深度(在 RGB 通道中),最后两个维将是图像的高度和宽度。 图片。
除了用于计算机视觉的高层功能之外,`torchvision`还具有一些方便的工具功能来建立网络。 在本章中,我们将探讨其中的一些。
除了用于计算机视觉的高层功能之外,`torchvision`还具有一些方便的工具函数来建立网络。 在本章中,我们将探讨其中的一些。
本章使用两个神经网络应用说明 PyTorch:
......
......@@ -224,7 +224,7 @@ class RNNCell(nn.Module):
图 5.4:具有零的句子也具有针对零计算的隐藏状态
将零添加到输入将污染结果,这是非常不希望的。 打包序列是为了避免这种影响。 PyTorch 完全具有工具功能`pack_sequence`
将零添加到输入将污染结果,这是非常不希望的。 打包序列是为了避免这种影响。 PyTorch 完全具有工具函数`pack_sequence`
```py
>>> import torch.nn.utils.rnn as rnn_utils
......@@ -435,7 +435,7 @@ class Encoder(nn.Module):
return ht[-2:].transpose(0, 1).contiguous().view(batch_size, -1)
```
`LSTMCell``GRUCell`相似,LSTM 和 GRU 具有相似的功能 API,以使它们彼此兼容。 此外,与细胞对应物相比,LSTM 和 GRU 接受更多的参数,其中`num_layers``dropout``bidirectional`很重要。
`LSTMCell``GRUCell`相似,LSTM 和 GRU 具有相似的函数式 API,以使它们彼此兼容。 此外,与细胞对应物相比,LSTM 和 GRU 接受更多的参数,其中`num_layers``dropout``bidirectional`很重要。
如果将`True`作为参数,则`dropout`参数将为网络实现添加一个丢弃层,这有助于避免过拟合和规范化网络。 使用 LSTM 之类的高级 API 消除了对 Python 循环的需要,并一次接受了完整的序列作为输入。 尽管可以接受常规序列作为输入,但始终建议传递打包(掩码)输入,这样可以提高性能,因为 cuDNN 后端希望输入如此。
......@@ -467,7 +467,7 @@ RNN 实现通常是单向的,这就是到目前为止我们已经实现的。
高级`RNNClassifier`与简单`RNNClassifier`完全相同,唯一的例外是 RNN 编码器已被 LSTM 或 GRU 编码器替代。 但是,高级分类器由于使用了高度优化的 cuDNN 后端,因此可以显着提高网络表现,尤其是在 GPU 上。
我们为高级 RNN 开发的模型是多层双向 LSTM/GRU 网络。 增加对秘籍的关注可大大提高性能。 但这不会改变分类器,因为所有这些组件都将使用`Encoder`方法包装,并且分类器仅担心`Encoder`功能 API 不会改变。
我们为高级 RNN 开发的模型是多层双向 LSTM/GRU 网络。 增加对秘籍的关注可大大提高性能。 但这不会改变分类器,因为所有这些组件都将使用`Encoder`方法包装,并且分类器仅担心`Encoder`函数式 API 不会改变。
##### 注意
......@@ -491,7 +491,7 @@ RNN 实现通常是单向的,这就是到目前为止我们已经实现的。
SPINN 将输入的句子编码为固定长度的向量,就像基于 RNN 的编码器如何从每个序列创建“含义”向量一样。 来自每个数据点的两个句子都将通过 SPINN 传递并为每个句子创建编码的向量,然后使用合并网络和分类器网络对其进行处理以获得这三个类别中每个类别的得分。
如果您想知道需要在不公开 PyTorch 的任何其他功能 API 的情况下显示 SPINN 实现的方法,那么答案是 SPINN 是展示 PyTorch 如何适应任何类型的神经网络架构的最佳示例。 你发展。 无论您考虑的架构要求如何,PyTorch 都不会妨碍您。
如果您想知道需要在不公开 PyTorch 的任何其他函数式 API 的情况下显示 SPINN 实现的方法,那么答案是 SPINN 是展示 PyTorch 如何适应任何类型的神经网络架构的最佳示例。 你发展。 无论您考虑的架构要求如何,PyTorch 都不会妨碍您。
静态计算图之上构建的框架不能实现 SPINN 这样的网络架构,而不会造成混乱。 这可能是所有流行框架围绕其核心实现构建动态计算图包装的原因,例如 TensorFlow 的热切需求,MXNet,CNTK 的 Gluon API 等。 我们将看到 PyTorch 的 API 对实现任何类型的条件或循环到计算图中的 API 有多么直观。 SPINN 是展示这些的完美示例。
......
......@@ -299,7 +299,7 @@ MXNet 比其他服务模块更好。 在撰写本文时,TensorFlow 与 Python
其他模型服务器,例如 TensorRT 和 Clipper,不像 MXNet 服务器那样易于设置和管理。 而且,MXNet 附带了另一个名为 MXNet 存档器的工具,该工具将所有必需的文件打包成一个捆绑包,这些文件可以独立部署,而不必担心其他依赖项。 除了 MXNet 模型服务器具备的所有这些很酷的功能之外,最大的好处是能够自定义预处理和后处理步骤。 我们将在接下来的部分中介绍如何完成所有这些操作。
整个过程的流程从我们尝试使用模型存档器创建具有`.mar`格式的单个存档文件的位置开始。 单个捆绑包文件需要 ONNX 模型文件`signature.json`,该文件提供有关输入大小,名称等的信息。 认为它是可以随时更改的配置文件。 如果您决定将所有值硬编码到代码中,而不是从配置中读取,则它甚至不必成为存档的一部分。 然后,您需要服务文件,您可以在其中定义预处理,推理功能,后处理功能和其他工具功能
整个过程的流程从我们尝试使用模型存档器创建具有`.mar`格式的单个存档文件的位置开始。 单个捆绑包文件需要 ONNX 模型文件`signature.json`,该文件提供有关输入大小,名称等的信息。 认为它是可以随时更改的配置文件。 如果您决定将所有值硬编码到代码中,而不是从配置中读取,则它甚至不必成为存档的一部分。 然后,您需要服务文件,您可以在其中定义预处理,推理功能,后处理功能和其他工具函数
制作完模型档案后,我们可以调用模型服务器,并将位置作为输入传递给我们的模型档案。 而已; 您现在可以从超级性能模型服务器提供模型。
......
......@@ -144,7 +144,7 @@ def fgsm_attack(image, epsilon, data_grad):
### 测试函数
最后,本教程的主要结果来自`test`函数。 每次调用此测试功能都会在 MNIST 测试集上执行完整的测试步骤,并报告最终精度。 但是,请注意,此功能还需要`epsilon`输入。 这是因为`test`函数报告实力为`ε`的来自对手的攻击模型的准确率。 更具体地说,对于测试集中的每个样本,函数都会计算输入数据`data_grad`的损失梯度,并使用`fgsm_attack`创建一个扰动图像`perturbed_data`,然后检查受干扰的示例是否具有对抗性。 除了测试模型的准确率外,该功能还保存并返回了一些成功的对抗示例,以供以后可视化。
最后,本教程的主要结果来自`test`函数。 每次调用此测试函数都会在 MNIST 测试集上执行完整的测试步骤,并报告最终精度。 但是,请注意,此功能还需要`epsilon`输入。 这是因为`test`函数报告实力为`ε`的来自对手的攻击模型的准确率。 更具体地说,对于测试集中的每个样本,函数都会计算输入数据`data_grad`的损失梯度,并使用`fgsm_attack`创建一个扰动图像`perturbed_data`,然后检查受干扰的示例是否具有对抗性。 除了测试模型的准确率外,该功能还保存并返回了一些成功的对抗示例,以供以后可视化。
```py
def test( model, device, test_loader, epsilon ):
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册