自 PyTorch 1.0 发布以来,我们看到社区不断壮大,增加了新的工具,为 PyTorch Hub 中不断增长的模型集做出了贡献,并持续提高了其在研究和生产中的使用率。
从核心角度来看,PyTorch 继续增加功能以支持研究和生产使用,包括通过 TorchScript 连接这两个世界的能力。今天,我们很高兴地宣布,我们发布了四个新版本,包括 PyTorch 1.2、torchvision 0.4、torchaudio 0.3 和 torchtext 0.4。您现在就可以在 pytorch.org 开始使用这些版本。
PyTorch 1.2
通过 PyTorch 1.2,这个开源机器学习框架在生产使用方面迈出了重要一步,它增加了改进且更完善的 TorchScript 环境。这些改进使得生产模型的交付变得更加容易,扩展了对导出 ONNX 格式模型的支持,并增强了对 Transformers 的模块级别支持。除了这些新功能之外,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 社区通过开放的治理结构以及额外的指导委员会成员、特别兴趣小组 (SIG) 和工作组 (WG) 持续发展。与 Microsoft 合作,我们增加了对导出 ONNX Opset 版本 7(v1.2)、8(v1.3)、9(v1.4) 和 10 (v1.5) 的全面支持。我们还增强了常量折叠通行证以支持 Opset 10,这是 ONNX 的最新可用版本。ScriptModule 也得到了改进,包括支持多个输出、张量工厂以及将元组作为输入和输出。此外,用户现在可以注册自己的符号以导出自定义操作,并在导出期间指定输入的动态维度。以下是所有主要改进的总结
- 支持多种 Opsets,包括在 Opset 10 中导出 dropout、slice、flip 和 interpolate 的能力。
- ScriptModule 的改进,包括支持多个输出、张量工厂以及将元组作为输入和输出。
- 支持十几个额外的 PyTorch 运算符,包括导出自定义运算符的能力。
- 许多大型修复和测试基础设施改进。
您可以在此处尝试由 Microsoft 的 @lara-hdr 贡献的最新教程。非常感谢整个 Microsoft 团队为实现此版本所付出的辛勤工作!
nn.Transformer
在 PyTorch 1.2 中,我们现在包含一个标准的 nn.Transformer 模块,该模块基于论文“Attention is All You Need”。nn.Transformer
模块完全依赖于 注意力机制 来获取输入和输出之间的全局依赖关系。nn.Transformer
模块的各个组件被设计为可以独立采用。例如,nn.TransformerEncoder 可以单独使用,而无需更大的 nn.Transformer
。新的 API 包括
nn.Transformer
nn.TransformerEncoder
和nn.TransformerEncoderLayer
nn.TransformerDecoder
和nn.TransformerDecoderLayer

有关更多信息,请参阅 Transformer 层 文档。有关完整的 PyTorch 1.2 发布说明,请参阅 此处。
领域 API 库更新
PyTorch 领域库,如 torchvision、torchtext 和 torchaudio,提供了方便访问常用数据集、模型和转换的方法,可以快速创建最先进的基线。此外,它们还提供了常见的抽象,以减少用户可能不得不重复编写的样板代码。由于研究领域有不同的要求,PyTorch 周围已经形成了一个专门的库生态系统,称为领域 API (DAPI),以简化许多领域中新算法和现有算法的开发。我们很高兴发布三个更新的 DAPI 库,用于文本、音频和视觉,它们补充了 PyTorch 1.2 核心版本。
Torchaudio 0.3:兼容 Kaldi,新增转换

Torchaudio 专注于音频波形的机器理解。它是一个机器学习库,提供相关的信号处理功能(但不是通用的信号处理库)。它利用 PyTorch 的 GPU 支持,为波形提供许多工具和转换,使数据加载和标准化变得更简单、更易读。例如,它提供使用 sox 的波形数据加载器,以及频谱图、重采样和 mu-law 编码和解码等转换。
我们很高兴宣布 torchaudio 0.3.0 的发布,其重点是标准化和复数、一个转换(重采样)和两个新功能(相位声码器、ISTFT)、Kaldi 兼容性以及一个新的教程。Torchaudio 被重新设计为 PyTorch 的扩展,并且是领域 API (DAPI) 生态系统的一部分。
标准化
解决机器学习问题的大部分工作都投入到数据准备中。在这个新版本中,我们更新了 torchaudio 转换的接口,以围绕以下词汇和约定进行标准化。
张量假定将通道作为第一维,时间作为最后一维(如果适用)。这使其与 PyTorch 的维度保持一致。对于尺寸名称,使用前缀 n_
(例如“大小为 (n_freq
, n_mel
) 的张量”),而维度名称没有此前缀(例如“维度为 (通道,时间) 的张量”)。所有转换和函数的输入现在都假定通道优先。这样做是为了与 PyTorch 保持一致,PyTorch 具有通道后跟样本数。所有转换和函数的通道参数现在都已弃用。
STFT
的输出是 (通道, 频率, 时间, 2),这意味着对于每个通道,列是某个窗口的傅里叶变换,因此当我们水平移动时,我们可以看到每列(傅里叶变换后的波形)随时间变化。这与 librosa 的输出匹配,因此我们不再需要在与 Spectrogram
、MelScale
、MelSpectrogram
和 MFCC
的测试比较中进行转置。此外,由于这些新约定,我们弃用了用于在一种信号形状之间传输的 LC2CL
和 BLC2CBL
。
作为此版本的一部分,我们还通过维度为 (…, 2) 的张量引入了对复数的支持,并提供了 magphase
将此类张量转换为其幅度和相位,类似地还有 complex_norm
和 angle
。
标准化的详细信息在 README 中提供。
函数、转换和 Kaldi 兼容性
在标准化之前,我们将状态和计算分离到 torchaudio.transforms
和 torchaudio.functional
中。
作为转换的一部分,我们在 0.3.0 中添加了一个新转换:Resample
。Resample
可以将波形上采样或下采样到不同的频率。
作为函数的一部分,我们引入了:phase_vocoder
,一个相位声码器,用于在不改变音高的情况下改变波形的速度;以及 ISTFT
,它是 STFT
的逆变换,旨在与 PyTorch 提供的 STFT 兼容。这种分离使我们能够使函数可弱脚本化,并在 0.3.0 中利用 JIT。因此,我们对以下转换提供了 JIT 和 CUDA 支持:Spectrogram
、AmplitudeToDB
(以前名为 SpectrogramToDB
)、MelScale
、MelSpectrogram
、MFCC
、MuLawEncoding
、MuLawDecoding
(以前名为 MuLawExpanding
)。
我们现在还提供与 Kaldi 的兼容接口,以方便用户入门并减少用户代码对 Kaldi 的依赖。我们现在有 spectrogram
、fbank
和 resample_waveform
的接口。
新教程
为了展示新的约定和转换,我们有一个新教程,演示如何使用 torchaudio 预处理波形。本教程通过一个加载波形并对其应用一些可用转换的示例进行讲解。
我们很高兴看到 torchaudio 周围活跃的社区,并渴望进一步发展和支持它。我们鼓励您继续使用本教程和两个可用数据集(VCTK 和 YESNO!)自行试验。它们有一个接口可以方便地下载数据集并对其进行预处理。您可以在此处的发布说明中找到详细信息。
Torchtext 0.4 包含监督学习数据集
torchtext 的一个重点领域是提供基本元素以帮助加速 NLP 研究。这包括轻松访问常用数据集和用于处理原始文本数据的基本预处理管道。torchtext 0.4.0 版本包含几个流行的监督学习基线,支持“一键”数据加载。其中包含一个教程,展示如何使用新数据集进行文本分类分析。我们还添加并改进了一些函数,例如 get_tokenizer 和 build_vocab_from_iterator,以方便实现未来的数据集。更多示例可在此处找到。
文本分类是自然语言处理中的一项重要任务,具有许多应用,例如情感分析。新版本包含几个流行的文本分类数据集,用于监督学习,包括
- AG_NEWS
- 搜狗新闻
- DBpedia
- YelpReviewPolarity
- YelpReviewFull
- YahooAnswers
- AmazonReviewPolarity
- AmazonReviewFull
每个数据集都包含两部分(训练集与测试集),并且可以通过单个命令轻松加载。数据集还支持 N-gram 功能,以捕获有关局部词序的部分信息。请查看此处的教程,了解更多关于如何使用新数据集解决文本分类分析等监督问题的信息。
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 版本包括
- 用于读写视频文件(包括音频)的高效 I/O 原语,支持任意编码和格式。
- 标准视频数据集,与
torch.utils.data.Dataset
和torch.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 团队和社区为这项工作做出的所有贡献!