【PyTorch】7-生态简介

PyTorch:7-生态简介

注:所有资料来源且归属于thorough-pytorch(https://datawhalechina.github.io/thorough-pytorch/),下文仅为学习记录

7.1:torchvision

7.1.1:简介

The torchvision package consists of popular datasets, model architectures, and common image transformations for computer vision.

常用库:

  • torchvision.datasets
  • torchvision.models
  • torchvision.tramsforms
  • torchvision.io
  • torchvision.ops
  • torchvision.utils

7.1.2:torchvision.datasets

包含在计算机视觉中常见的数据集

例如:

  • CIFAR
  • ImageNet
  • VOC
  • MNIST

7.1.3:torchvision.transforms

包含数据预处理方法和数据增强方法

Transforming and augmenting images --- Torchvision 0.18 documentation (pytorch.org)

案例:

python 复制代码
from torchvision import transforms
data_transform = transforms.Compose([
    transforms.ToPILImage(),   # 这一步取决于后续的数据读取方式,如果使用内置数据集则不需要
    transforms.Resize(image_size),
    transforms.ToTensor()
])

7.1.4:torchvision.models

包含常用模型及其预训练模型

**图像分类:**例如AlexNet、VGG等;其预训练模型使用的数据集是ImageNet-1K

**语义分割:**例如FCN ResNet50、DeepLabV3 ResNet50等;其预训练模型使用的数据集是COCO train2017

**目标检测/实例分割/关键点检测:**例如Faster R-CNN、RetinaNet等;其预训练模型使用的数据集是COCO train2017

**视频分类:**例如ResNet 3D 18等;其预训练模型使用的数据集是COCO train2017

7.1.5:torchvision.io

提供视频、图片和文件的 IO 操作的功能,包括读取、写入、编解码处理操作

注意事项:

  • 不同版本之间,torchvision.io有着较大变化。在使用时,需要查看下当前的torchvision版本是否存在想使用的方法。
  • 除了read_video()等方法,torchvision.io提供了一个细粒度的视频API torchvision.io.VideoReader() ,它具有更高的效率并且更加接近底层处理。在使用时,需要先安装ffmpeg然后从源码重新编译torchvision我们才能我们能使用这些方法。
  • 在使用Video相关API时,最好提前安装好PyAV这个库。

7.1.6:torchvision.ops

提供许多计算机视觉的特定操作,包括但不仅限于NMS,RoIAlign(MASK R-CNN中应用的一种方法),RoIPool(Fast R-CNN中用到的一种方法)

Operators --- Torchvision 0.18 documentation (pytorch.org)

7.1.7:torchvision.utils

提供一些可视化的方法,帮助将若干张图片拼接在一起、可视化检测和分割的效果

7.2:PyTorchVideo

Meta推出了PyTorchVideo深度学习库,专注于视频理解工作

PytorchVideo 提供了加速视频理解研究所需的可重用、模块化和高效的组件。

支持不同的深度学习视频组件,如视频模型、视频数据集和视频特定转换。

7.2.1:主要部件和亮点

  • 基于 PyTorch
  • **Model Zoo:**提供包含I3D、R(2+1)D、SlowFast、X3D、MViT等SOTA模型的高质量model zoo,并且PyTorchVideo的model zoo调用与PyTorch Hub | PyTorch做了整合,大大简化模型调用。
  • **数据预处理和常见数据:**支持Kinetics-400, Something-Something V2, Charades, Ava (v2.2), Epic Kitchen, HMDB51, UCF101, Domsev等主流数据集和相应的数据预处理,同时还支持randaug, augmix等数据增强trick。
  • **模块化设计:**包括data, transforms, layer, model, accelerator等模块,方便用户进行调用和读取。
  • 支持多模态
  • 移动端部署优化

7.2.2:安装

使用pip:

复制代码
pip install pytorchvideo
  • 安装的虚拟环境的python版本 >= 3.7
  • PyTorch >= 1.8.0,安装的torchvision也需要匹配
  • CUDA >= 10.2
  • ioPath:具体情况
  • fvcore版本 >= 0.1.4:具体情况

7.2.3:model zoo和benchmark

提供三种使用方法,并且给每一种都配备了tutorial

  • TorchHub,模型已在TorchHub存在,可以根据实际情况来选择需不需要使用预训练模型。官方教程 tutorial
  • PySlowFast,使用 PySlowFast workflow 去训练或测试PyTorchVideo models/datasets.
  • PyTorch Lightning建立一个工作流进行处理,官方教程 tutorial

7.3:torchtext

用于自然语言处理(NLP)的工具包

和CV工具包的功能差异:

  • 数据集(dataset)定义方式不同
  • 数据预处理工具
  • 没有琳琅满目的model zoo

torchtext可以方便的对文本进行预处理,例如截断补长、构建词表等。

7.3.1:主要组成部分

torchtext主要包含了以下的主要组成部分:

  • 数据处理工具 torchtext.data.functional、torchtext.data.utils
  • 数据集 torchtext.data.datasets
  • 词表工具 torchtext.vocab
  • 评测指标 torchtext.metrics

7.3.2:安装

使用pip安装:

复制代码
pip install torchtext

7.3.3:构建数据集

【1】Field

Field是torchtext中定义数据类型以及转换为张量的指令。

torchtext 认为一个样本是由多个字段(文本字段,标签字段)组成,不同的字段可能会有不同的处理方式。

定义Field对象是为了明确如何处理不同类型的数据,但具体的处理则是在Dataset中完成的。

案例:

(1)构建Field

python 复制代码
tokenize = lambda x: x.split()
TEXT = data.Field(sequential=True, tokenize=tokenize, lower=True, fix_length=200)
LABEL = data.Field(sequential=False, use_vocab=False)
  • sequential:设置数据是否是顺序表示
  • tokenize:设置将字符串标记为顺序实例的函数
  • lower:设置是否将字符串全部转为小写
  • fix_length:设置此字段所有实例填充到一个固定的长度,方便后续处理
  • use_vocab:设置是否引入Vocab object,如果为False,则需要保证之后输入field中的data都是numerical的

(2)进一步构建dataset

python 复制代码
from torchtext import data
def get_dataset(csv_data, text_field, label_field, test=False):
    fields = [("id", None), # we won't be needing the id, so we pass in None as the field
                 ("comment_text", text_field), ("toxic", label_field)]       
    examples = []

    if test:
        # 如果为测试集,则不加载label
        for text in tqdm(csv_data['comment_text']):
            examples.append(data.Example.fromlist([None, text, None], fields))
    else:
        for text, label in tqdm(zip(csv_data['comment_text'], csv_data['toxic'])):
            examples.append(data.Example.fromlist([None, text, label], fields))
    return examples, fields

使用数据csv_data中有"comment_text"和"toxic"两列,分别对应text和label。

python 复制代码
train_data = pd.read_csv('train_toxic_comments.csv')
valid_data = pd.read_csv('valid_toxic_comments.csv')
test_data = pd.read_csv("test_toxic_comments.csv")
TEXT = data.Field(sequential=True, tokenize=tokenize, lower=True)
LABEL = data.Field(sequential=False, use_vocab=False)

# 得到构建Dataset所需的examples和fields
train_examples, train_fields = get_dataset(train_data, TEXT, LABEL)
valid_examples, valid_fields = get_dataset(valid_data, TEXT, LABEL)
test_examples, test_fields = get_dataset(test_data, TEXT, None, test=True)
# 构建Dataset数据集
train = data.Dataset(train_examples, train_fields)
valid = data.Dataset(valid_examples, valid_fields)
test = data.Dataset(test_examples, test_fields)

(3)检查读入的数据情况

python 复制代码
# 检查keys是否正确
print(train[0].__dict__.keys())
print(test[0].__dict__.keys())
# 抽查内容是否正确
print(train[0].comment_text)

总结

定义Field对象完成后,通过get_dataset函数可以读入数据的文本和标签,将二者(examples)连同field一起送到torchtext.data.Dataset类中,即可完成数据集的构建。

【2】词汇表vocab

Word Embedding:将字符串形式的词语(word)转变为数字形式的向量表示(embedding)

基本思想:收集一个比较大的语料库(尽量与所做的任务相关),在语料库中使用word2vec之类的方法构建词语到向量(或数字)的映射关系,之后将这一映射关系应用于当前的任务,将句子中的词语转为向量表示。

可以使用Field自带的build_vocab函数完成词汇表构建。

python 复制代码
TEXT.build_vocab(train)

【3】数据迭代器

本质:torchtext中的DataLoader

orchtext支持只对一个dataset和同时对多个dataset构建数据迭代器。

python 复制代码
from torchtext.data import Iterator, BucketIterator
# 若只针对训练集构造迭代器
# train_iter = data.BucketIterator(dataset=train, batch_size=8, shuffle=True, sort_within_batch=False, repeat=False)

# 同时对训练集和验证集进行迭代器的构建
train_iter, val_iter = BucketIterator.splits(
        (train, valid), # 构建数据集所需的数据集
        batch_sizes=(8, 8),
        device=-1, # 如果使用gpu,此处将-1更换为GPU的编号
        sort_key=lambda x: len(x.comment_text), # the BucketIterator needs to be told what function it should use to group the data.
        sort_within_batch=False
)

test_iter = Iterator(test, batch_size=8, device=-1, sort=False, sort_within_batch=False)

【4】使用自带数据集

torchtext提供若干常用的数据集方便快速进行算法测试。

7.3.4:评测指标metric

机器翻译任务常用BLEU (bilingual evaluation understudy) score来评价预测文本和标签文本之间的相似程度。

torchtext中可以直接调用torchtext.data.metrics.bleu_score来快速实现BLEU。

案例:

python 复制代码
from torchtext.data.metrics import bleu_score
candidate_corpus = [['My', 'full', 'pytorch', 'test'], ['Another', 'Sentence']]
references_corpus = [[['My', 'full', 'pytorch', 'test'], ['Completely', 'Different']], [['No', 'Match']]]
bleu_score(candidate_corpus, references_corpus)

7.3.5:其他

由于NLP常用的网络结构比较固定,torchtext并不像torchvision那样提供一系列常用的网络结构。模型主要通过torch.nn中的模块来实现,比如torch.nn.LSTM、torch.nn.RNN等。

7.4:torchaudio

用于语音处理的工具包

应用场景包括说话人识别(Speaker Identification),说话人分离(Speaker Diarization),音素识别(Phoneme Recognition),语音识别(Automatic Speech Recognition),语音分离(Speech Separation),文本转语音(TTS)等任务。

CV有torchvision,NLP有torchtext,Audio有torchaudio。

7.4.1:主要组成部分

torchaduio主要包括以下几个部分:

  • torchaudio.io:有关音频的I/O
  • torchaudio.backend:提供了音频处理的后端,包括:sox,soundfile等
  • torchaudio.functional:包含了常用的语音数据处理方法,如:spectrogram,create_fb_matrix等
  • torchaudio.transforms:包含了常用的语音数据预处理方法,如:MFCC,MelScale,AmplitudeToDB等
  • torchaudio.datasets:包含了常用的语音数据集,如:VCTK,LibriSpeech,yesno等
  • torchaudio.models:包含了常用的语音模型,如:Wav2Letter,DeepSpeech等
  • torchaudio.models.decoder:包含了常用的语音解码器,如:GreedyDecoder,BeamSearchDecoder等
  • torchaudio.pipelines:包含了常用的语音处理流水线,如:SpeechRecognitionPipeline,SpeakerRecognitionPipeline等
  • torchaudio.sox_effects:包含了常用的语音处理方法,如:apply_effects_tensor,apply_effects_file等
  • torchaudio.compliance.kaldi:包含了与Kaldi工具兼容的方法,如:load_kaldi_fst,load_kaldi_ark等
  • torchaudio.kalid_io:包含了与Kaldi工具兼容的方法,如:read_vec_flt_scp,read_vec_int_scp等
  • torchaudio.utils:包含了常用的语音工具方法,如:get_audio_backend,set_audio_backend等

7.4.2:安装

bash 复制代码
pip install torchaudio

conda install torchaudio

7.4.3:datasets的构建

对于一些公共数据集,可以主要通过torchaudio.datasets来实现。

对于私有数据集,可以通过继承torch.utils.data.Dataset来构建自己的数据集。

数据集的读取和处理,可以通过torch.utils.data.DataLoader来实现。

案例:

python 复制代码
import torchaudio
import torch

# 公共数据集的构建
yesno_data = torchaudio.datasets.YESNO('.', download=True)
data_loader = torch.utils.data.DataLoader(
    yesno_data,
    batch_size=1,
    shuffle=True,
    num_workers=4)

通过命令查看语音数据集

python 复制代码
import torchaudio
dir(torchaudio.datasets)
"""
['CMUARCTIC','CMUDict','COMMONVOICE','DR_VCTK','FluentSpeechCommands',
'GTZAN','IEMOCAP','LIBRISPEECH','LIBRITTS','LJSPEECH','LibriLightLimited',
'LibriMix','MUSDB_HQ','QUESST14','SPEECHCOMMANDS','Snips','TEDLIUM',
'VCTK_092','VoxCeleb1Identification','VoxCeleb1Verification','YESNO']
"""

7.4.4:model和pipeline构建

torchaudio.models包含了常见语音任务的模型的定义,包括:Wav2Letter,DeepSpeech,HuBERTPretrainModel等。

torchaudio.pipelines则是将预训练模型和其对应的任务组合在一起,构成了一个完整的语音处理流水线。

7.4.5:transforms和functional的使用

torchaudio.transform包含常见的音频处理和特征提取。torchaudio.functional包括了一些常见的音频操作的函数。

torchaudio.transforms继承于torch.nn.Module,但是不同于torchvision.transforms,torchaudio没有compose方法将多个transform组合起来。

因此,torchaudio构建transform pipeline的常见方法是自定义模块类或使用torch.nn.Sequential将他们在一起,然后将其移动到目标设备和数据类型。

python 复制代码
# Define custom feature extraction pipeline.
#
# 1. Resample audio
# 2. Convert to power spectrogram
# 3. Apply augmentations
# 4. Convert to mel-scale
#
class MyPipeline(torch.nn.Module):
    def __init__(
        self,
        input_freq=16000,
        resample_freq=8000,
        n_fft=1024,
        n_mel=256,
        stretch_factor=0.8,
    ):
        super().__init__()
        self.resample = Resample(orig_freq=input_freq, new_freq=resample_freq)
        self.spec = Spectrogram(n_fft=n_fft, power=2)
        self.spec_aug = torch.nn.Sequential(
            TimeStretch(stretch_factor, fixed_rate=True),
            FrequencyMasking(freq_mask_param=80),
            TimeMasking(time_mask_param=80),
        )
        self.mel_scale = MelScale(
            n_mels=n_mel, sample_rate=resample_freq, n_stft=n_fft // 2 + 1)

    def forward(self, waveform: torch.Tensor) -> torch.Tensor:
        # Resample the input
        resampled = self.resample(waveform)
        # Convert to power spectrogram
        spec = self.spec(resampled)
        # Apply SpecAugment
        spec = self.spec_aug(spec)
        # Convert to mel-scale
        mel = self.mel_scale(spec)
        return mel

7.4.6:compliance和kaldi_io的使用

Kaldi是一个用于语音识别研究的工具箱

在torchaudio.compliance.kaldi中,torchaudio提供了以下三种方法:

  • torchaudio.compliance.kaldi.spectrogram:从语音信号中提取Spectrogram特征
  • torchaudio.compliance.kaldi.fbank:从语音信号中提取FBank特征
  • torchaduio.compliance.kaldi.mfcc:从语音信号中提取MFCC特征

torchaudio.kaldi_io的主要接口包括:

  • torchaudio.kaldi_io.read_vec_int_ark:从Kaldi的scp文件中读取float类型的数据
  • torchaudio.kaldi_io.read_vec_flt_scp
  • torchaudio.kaldi_io.read_vec_flt_ark
  • torchaudio.kaldi_io.read_mat_scp
  • torchaudio.kaldi_io.read_mat_ark
相关推荐
江畔柳前堤12 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术12 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客12 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术13 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO13 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术14 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架14 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab14 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI14 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
冬奇Lab14 小时前
【无标题】
人工智能·开源