由 PyTorch 团队

自 PyTorch 1.0 版本发布以来,我们看到了社区不断扩展,添加新工具,为 PyTorch Hub 中不断增长的模型集做出贡献,并在研究和生产中持续增加使用。从核心角度来看,PyTorch 一直在添加功能以支持研究和生产使用,包括通过 TorchScript 连接这两个世界的能力。今天,我们非常高兴地宣布,我们推出了四个新版本,包括 PyTorch 1.2、torchvision 0.4、torchaudio 0.3 和 torchtext 0.4。您现在可以访问 pytorch.org 开始使用这些版本中的任何一个。

从核心角度来看,PyTorch 一直在添加功能以支持研究和生产使用,包括通过 TorchScript 连接这两个世界的能力。今天,我们非常高兴地宣布,我们推出了四个新版本,包括 PyTorch 1.2、torchvision 0.4、torchaudio 0.3 和 torchtext 0.4。您现在可以访问 pytorch.org 开始使用这些版本中的任何一个。

PyTorch 1.2

在 PyTorch 1.2 版本中,开源机器学习框架在投入生产使用方面迈出了重大步伐,新增了改进和更加完善的 TorchScript 环境。这些改进使得发布生产模型更加容易,扩展了对导出 ONNX 格式模型的支撑,并增强了 Transformer 模块级别的支持。除了这些新特性之外,TensorBoard 现在已不再处于实验状态——您只需输入 from torch.utils.tensorboard import SummaryWriter 即可开始使用。

TorchScript 改进

自 PyTorch 1.0 版本发布以来,TorchScript 为急切模式的 PyTorch 模型提供了通往生产环境的途径。TorchScript 编译器将 PyTorch 模型转换为静态类型图表示,为在 Python 不可用的受限环境中进行优化和执行打开了机会。您可以将模型逐步转换为 TorchScript,将编译代码与 Python 无缝混合。

PyTorch 1.2 显著扩展了 TorchScript 对 PyTorch 模型中使用的 Python 子集的支持,并提供了一个新的、更易于使用的 API 来编译模型到 TorchScript。有关详细信息,请参阅迁移指南。以下是新 API 的示例用法:

import torch

class MyModule(torch.nn.Module):
    def __init__(self, N, M):
        super(MyModule, self).__init__()
        self.weight = torch.nn.Parameter(torch.rand(N, M))

    def forward(self, input):
        if input.sum() > 0:
          output = self.weight.mv(input)
        else:
          output = self.weight + input
        return output

# Compile the model code to a static representation
my_script_module = torch.jit.script(MyModule(3, 4))

# Save the compiled code and model data so it can be loaded elsewhere
my_script_module.save("my_script_module.pt")

想要了解更多,请参阅我们的《TorchScript 简介》和《在 C++ 中加载 PyTorch 模型》教程。

扩展的 ONNX 导出功能

ONNX 社区在开放治理结构和新增的指导委员会成员、特别兴趣小组(SIGs)和工作组(WGs)的支持下持续发展。与微软合作,我们已添加对导出 ONNX Opset 版本 7(v1.2)、8(v1.3)、9(v1.4)和 10(v1.5)的全面支持。我们还增强了常量折叠传递,以支持最新的 ONNX 版本 10。ScriptModule 也得到了改进,包括支持多个输出、张量工厂以及将元组作为输入和输出。此外,用户现在可以注册自己的符号以导出自定义操作,并在导出时指定输入的动态维度。以下是所有主要改进的总结:

  • 支持多个 Opset,包括在 Opset 10 中导出 dropout、slice、flip 和 interpolate 的能力。
  • 对 ScriptModule 的改进,包括支持多个输出、张量工厂以及元组作为输入和输出。
  • 支持超过一打额外的 PyTorch 运算符,包括导出自定义运算符的能力。
  • 许多重大修复和测试基础设施改进。

您可以在此尝试最新的教程,由微软的@lara-hdr 贡献。衷心感谢整个微软团队为这次发布所付出的辛勤努力!

nn.Transformer

在 PyTorch 1.2 中,我们现在包含了一个标准的 nn.Transformer 模块,基于论文“Attention is All You Need”。 nn.Transformer 模块完全依赖于注意力机制来在输入和输出之间建立全局依赖关系。 nn.Transformer 模块的各个组件设计得可以独立采用。例如,nn.TransformerEncoder 可以单独使用,而无需更大的 nn.Transformer 。新的 API 包括:

  • nn.Transformer
  • nn.TransformerEncodernn.TransformerEncoderLayer
  • nn.TransformerDecodernn.TransformerDecoderLayer

查看 Transformer Layers 文档以获取更多信息。查看此处以获取完整的 PyTorch 1.2 版本发布说明。

领域 API 库更新

PyTorch 领域的库,如 torchvision、torchtext 和 torchaudio,提供了方便访问常用数据集、模型和转换的功能,可以快速创建最先进的基线。此外,它们还提供了常见的抽象,以减少用户可能需要反复编写的样板代码。由于研究领域的特定要求,围绕 PyTorch 出现了一个名为领域 API(DAPI)的专业化库生态系统,以简化多个领域中新算法和现有算法的开发。我们很高兴发布三个更新的 DAPI 库,分别为文本、音频和视觉,以补充 PyTorch 1.2 核心版本。

兼容 Kaldi 的 Torchaudio 0.3,新增转换

Torchaudio 专注于音频波形机器理解。它是一个提供相关信号处理功能(但不是通用信号处理库)的 ML 库。它利用 PyTorch 的 GPU 支持,提供许多工具和变换,使数据加载和标准化更加容易和可读。例如,它提供了使用 sox 的波形数据加载器,以及频谱图、重采样和 mu-law 编码解码等变换。

我们很高兴地宣布 torchaudio 0.3.0 版本的发布,该版本专注于标准化和复数,一个变换(重采样)和两个新的功能(相位声码器,ISTFT),Kaldi 兼容性,以及一个新教程。Torchaudio 被重新设计为 PyTorch 的扩展,成为领域 API(DAPI)生态系统的一部分。

标准化

在解决机器学习问题中,大量的努力都投入到数据准备中。在这个新版本中,我们更新了 torchaudio 的变换接口,以标准化以下词汇和约定。

张量假定通道为第一个维度,时间(如有适用)为最后一个维度。这使得它与 PyTorch 的维度保持一致。对于尺寸名称,使用前缀 n_ (例如,“大小为( n_freqn_mel )的张量”)而维度名称没有这个前缀(例如,“维度为(通道,时间)的张量”)。所有变换和函数的输入现在假定通道优先。这样做是为了与 PyTorch 保持一致,PyTorch 的顺序是通道后跟样本数量。所有变换和函数的通道参数现在已弃用。

STFT 的输出为(通道,频率,时间,2),这意味着对于每个通道,列是某个窗口的傅里叶变换,因此当我们水平移动时,我们可以看到每个列(傅里叶变换的波形)随时间变化。这与 librosa 的输出相匹配,因此我们不再需要在 SpectrogramMelScaleMelSpectrogramMFCC 的测试比较中进行转置。此外,由于这些新约定,我们弃用了 LC2CLBLC2CBL ,它们用于将一个信号形状转换为另一个形状。

作为本次发布的一部分,我们还引入了对复数的支持,通过维度为(…,2)的张量,并提供 magphase 将其转换为幅度和相位,同样 complex_normangle 也是如此。

标准化的详细信息请参阅 README。

函数、变换和 Kaldi 兼容性

在标准化之前,我们将状态和计算分别分离为 torchaudio.transformstorchaudio.functional

作为转换的一部分,我们在 0.3.0 版本中添加了一个新的转换: Resample . Resample 可以将波形上采样或下采样到不同的频率。

作为功能的一部分,我们引入了: phase_vocoder ,一个相位声码器,可以在不改变音调的情况下改变波形的速度,以及 ISTFT ,为了与 PyTorch 提供的 STFT 兼容而实现的逆 STFT 。这种分离使我们能够使功能弱脚本化并利用 JIT,因此 0.3.0 版本中我们有 JIT 和 CUDA 支持以下转换: SpectrogramAmplitudeToDB (之前命名为 SpectrogramToDB ), MelScaleMelSpectrogramMFCCMuLawEncodingMuLawDecoding (之前命名为 MuLawExpanding )。

我们现在还提供了一个与 Kaldi 的兼容接口,以简化用户入门并减少用户对 Kaldi 的代码依赖。我们现在有 spectrogramfbankresample_waveform 的接口。

新教程

为了展示新的规范和转换,我们有一个新的教程,演示如何使用 torchaudio 预处理波形。本教程通过一个示例,展示了如何加载一个波形并将其应用于一些可用的转换。

我们很高兴看到 torchaudio 有一个活跃的社区,并渴望进一步发展和支持它。我们鼓励您亲自尝试这个教程和可用的两个数据集:VCTK 和 YESNO!它们提供了一个下载数据集并方便格式预处理的界面。详细信息请查看发布说明。

Torchtext 0.4 与监督学习数据集

火炬文本的关键关注领域是为加速自然语言处理研究提供基本元素。这包括对常用数据集的便捷访问以及针对基于原始文本数据的预处理管道。torchtext 0.4.0 版本包括几个流行的监督学习基线,具有“一键”数据加载功能。其中包含一个教程,展示了如何使用新数据集进行文本分类分析。我们还添加和改进了一些函数,如 get_tokenizer 和 build_vocab_from_iterator,以使实现未来数据集更加容易。更多示例请见此处。

文本分类是自然语言处理中的一个重要任务,具有许多应用,例如情感分析。新版本包括几个流行的文本分类数据集,用于监督学习,包括:

  • AG_NEWS
  • SogouNews
  • DBpedia
  • Yelp 评论极性
  • Yelp 评论全文
  • Yahoo 问答
  • 亚马逊评论极性
  • 亚马逊评论全文

每个数据集都包含两部分(训练集与测试集),并且可以轻松地通过单个命令加载。数据集还支持 ngram 功能,以捕获局部词序的局部信息。请查看此处教程,了解如何使用这些新数据集进行监督问题,如文本分类分析。

from torchtext.datasets.text_classification import DATASETS
train_dataset, test_dataset = DATASETS['AG_NEWS'](ngrams=2)

除了领域库之外,PyTorch 还提供了许多工具来简化数据加载。现在,用户可以使用一些受支持的工具,如 torch.utils.data.DataLoader 和 torch.utils.data.IterableDataset,轻松加载和预处理文本分类数据集。以下是一些使用 DataLoader 包装数据的示例代码。更多示例请参考此处。

from torch.utils.data import DataLoader
data = DataLoader(train_dataset, collate_fn=generate_batch)

查看发布说明以了解更多信息,并在此尝试教程。

支持视频的 Torchvision 0.4

视频现在是 torchvision 的一等公民,支持数据加载、数据集、预训练模型和转换。torchvision 的 0.4 版本包括:

  • 高效的 IO 原语用于读取/写入视频文件(包括音频),支持任意编码和格式。
  • 标准视频数据集,兼容 torch.utils.data.Datasettorch.utils.data.DataLoader
  • 基于 Kinetics-400 数据集预训练的动作分类视频模型(包括训练脚本)。
  • 参考训练脚本,用于训练您自己的视频模型。

我们希望使用 PyTorch 处理视频数据尽可能简单,同时不牺牲太多性能。因此,我们避免了对视频进行预编码的步骤,因为这会涉及:

  • 预处理步骤,通过复制数据集来重新编码。
  • 由于这种重新编码耗时,因此会带来时间和空间上的开销。
  • 通常,应使用外部脚本来执行重新编码。

此外,我们还提供了 API,例如工具类 VideoClips ,它通过创建一组视频的所有剪辑索引,简化了在视频文件列表中按固定大小枚举所有可能剪辑的任务。它还允许您为视频指定固定的帧率。以下是一个 API 示例:

from torchvision.datasets.video_utils import VideoClips

class MyVideoDataset(object):
    def __init__(self, video_paths):
        self.video_clips = VideoClips(video_paths,
                                      clip_length_in_frames=16,
                                      frames_between_clips=1,
                                      frame_rate=15)

    def __getitem__(self, idx):
        video, audio, info, video_idx = self.video_clips.get_clip(idx)
        return video, audio

    def __len__(self):
        return self.video_clips.num_clips()

大多数面向用户的 API 是用 Python 编写的,类似于 PyTorch,这使得它易于扩展。此外,底层实现速度快——torchvision 在动态返回视频片段时尽可能少地从视频中解码。

查看 torchvision 0.4 版本发布说明以获取更多详细信息。

我们期待继续与社区合作,并听取您的反馈,以便我们进一步改进和扩展 PyTorch 深度学习平台。

我们想感谢整个 PyTorch 团队和社区为这项工作所做的所有贡献!