PyTorch:生态简介

PyTorch生态简介

PyTorch的强大并不仅局限于自身的易用性,更在于开源社区围绕PyTorch所产生的一系列工具包(一般是Python package)和程序,这些优秀的工具包极大地方便了PyTorch在特定领域的使用。

比如对于计算机视觉,有TorchVision、TorchVideo等用于图片和视频处理;

对于自然语言处理,有torchtext;

对于图卷积网络,有PyTorch Geometric等。

这里只是举例,每个领域还有很多优秀的工具包供社区使用。

这些工具包共同构成了PyTorch的生态(EcoSystem)。

PyTorch生态很大程度助力了PyTorch的推广与成功。在特定领域使用PyTorch生态中的工具包,能够极大地降低入门门槛,方便复现已有的工作。

比如我们在讨论模型修改时候就用到了torchvision中预定义的resnet结构,而不需要自己重新编写。

同时,PyTorch生态有助于社区力量的加入,共同为社区提供更有价值的内容和程序,这也是开源理念所坚持的价值。

图像 torchvision

在前面的学习和实战中,我们经常会用到torchvision来调用预训练模型,加载数据集,对图片进行数据增强的操作。在本章将给大家简单介绍下torchvision以及相关操作。

经过本节的学习,将收获:

  • 了解torchvision
  • 了解torchvision的作用

torchvison简介

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

正如引言介绍的一样,我们可以知道torchvision包含了在计算机视觉中常常用到的数据集,模型和图像处理的方式,而具体的torchvision则包括了下面这几部分,带*的部分是经常会使用到的一些库,所以在下面的部分对这些库进行一个简单的介绍:

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

torchvision.datasets

torchvision.datasets主要包含了一些我们在计算机视觉中常见的数据集,在0.10.0版本的torchvision下,有以下的数据集:

https://pytorch.org/vision/stable/datasets.html

图像分类
  • Caltech101
  • Caltech256
  • CelebA
  • CIFAR10
  • CIFAR100
  • Country211
  • DTD
  • EMNIST
  • EuroSAT
  • FakeData
  • FashionMNIST
  • FER2013
  • FGVCAircraft
  • Flickr8k
  • Flickr30k
  • Flowers102
  • Food101
  • GTSRB
  • INaturalist
  • ImageNet
  • KMNIST
  • LFWPeople
  • LSUN
  • MNIST
  • Omniglot
  • OxfordIIITPet
  • Places365
  • PCAM
  • QMNIST
  • RenderedSST2
  • SEMEION
  • SBU
  • StanfordCars
  • STL10
  • SUN397
  • SVHN
  • USPS
图像检测与分割
  • CocoDetection
  • CelebA
  • Cityscapes
  • GTSRB
  • Kitti
  • OxfordIIITPet
  • SBDataset
  • VOCSegmentation
  • VOCDetection
  • WIDERFace
光流
  • FlyingChairs
  • FlyingThings3D
  • HD1K
  • KittiFlow
  • Sintel
图像匹配
  • LFWPairs
  • PhotoTour
图像标题
  • CocoCaptions
视频分类
  • HMDB51
  • Kinetics
  • Kinetics400
  • UCF101

torchvision.transforms

在计算机视觉中处理的数据集有很大一部分是图片类型的,如果获取的数据是格式或者大小不一的图片,则需要进行归一化和大小缩放等操作,这些是常用的数据预处理方法。

除此之外,当图片数据有限时,还需要通过对现有图片数据进行各种变换,如缩小或放大、水平或垂直翻转等,这些是常见的数据增强方法。

torchvision.transforms中就包含了许多这样的操作。

from torchvision import transforms

image_size = (224, 224)

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

除了上面提到的几种数据增强操作,在torchvision官方文档里提到了更多的操作,更多数据变换的操作查看
https://pytorch.org/vision/stable/transforms.html

torchvision.models

为了提高训练效率,减少不必要的重复劳动,PyTorch官方也提供了一些预训练好的模型供使用。

可以https://github.com/pytorch/vision/tree/main/torchvision/models这里进行查看现在有哪些预训练模型,下面将对如何使用这些模型进行详细介绍。 此处以torchvision0.10.0 为例,如果希望获取更多的预训练模型,可以使用使用pretrained-models.pytorch仓库。

现有预训练好的模型可以分为以下几类:

图像分类

在图像分类里面,PyTorch官方提供了以下模型,并正在不断增多。

  • AlexNet
  • VGG
  • ResNet
  • SqueezeNet
  • DenseNet
  • Inception v3
  • GoogLeNet
  • ShuffleNet v2
  • MobileNetV2
  • MobileNetV3
  • ResNeXt
  • Wide ResNet
  • MNASNet
  • EfficientNet
  • RegNet
  • VisionTransformer
  • ConvNeXt

这些模型是在ImageNet-1k进行预训练好的,具体的使用在之前有过介绍。

除此之外,也可以点击https://pytorch.org/vision/stable/models.html#去查看这些模型在ImageNet-1k的准确率。

语义分割

语义分割的预训练模型是在COCO train2017的子集上进行训练的,提供了20个类别,包括
background, aeroplane, bicycle, bird, boat, bottle, bus, car, cat, chair, cow, diningtable, dog, horse, motorbike, person, pottedplant, sheep, sofa,train, tvmonitor

模型有:

  • FCN ResNet50, ResNet101
  • DeepLabV3 ResNet50, ResNet101, MobileNetV3-Large
  • LR-ASPP MobileNetV3-Large

具体我们可以点击https://pytorch.org/vision/stable/models.html#semantic-segmentation进行查看预训练的模型的mean IOU和 global pixelwise acc

目标检测,实例分割与关键点检测

物体检测,实例分割和人体关键点检测的模型同样是在COCO train2017进行训练的,在下方提供了实例分割的类别和人体关键点检测类别:

COCO_INSTANCE_CATEGORY_NAMES = [
    '__background__', 'person', 'bicycle', 'car', 'motorcycle', 'airplane', 'bus','train', 'truck', 'boat', 'traffic light', 'fire hydrant', 'N/A', 'stop sign', 'parking meter', 'bench', 'bird', 'cat', 'dog', 'horse', 'sheep', 'cow', 'elephant', 'bear', 'zebra', 'giraffe', 'N/A', 'backpack', 'umbrella', 'N/A', 'N/A','handbag', 'tie', 'suitcase', 'frisbee', 'skis', 'snowboard', 'sports ball','kite', 'baseball bat', 'baseball glove', 'skateboard', 'surfboard', 'tennis racket','bottle', 'N/A', 'wine glass', 'cup', 'fork', 'knife', 'spoon', 'bowl','banana', 'apple', 'sandwich', 'orange', 'broccoli', 'carrot', 'hot dog', 'pizza','donut', 'cake', 'chair', 'couch', 'potted plant', 'bed', 'N/A', 'dining table','N/A', 'N/A', 'toilet', 'N/A', 'tv', 'laptop', 'mouse', 'remote', 'keyboard', 'cell phone','microwave', 'oven', 'toaster', 'sink', 'refrigerator', 'N/A', 'book','clock', 'vase', 'scissors', 'teddy bear', 'hair drier', 'toothbrush']
    
COCO_PERSON_KEYPOINT_NAMES =['nose','left_eye','right_eye','left_ear','right_ear','left_shoulder','right_shoulder','left_elbow','right_elbow','left_wrist','right_wrist','left_hip','right_hip','left_knee','right_knee','left_ankle','right_ankle']

模型有:

  • Faster R-CNN
  • FCOS
  • Mask R-CNN
  • RetinaNet
  • SSD
  • SSDlite

同样的,可以点击https://github.com/datawhalechina/thorough-pytorch/blob/main/%E7%AC%AC%E5%85%AB%E7%AB%A0%20PyTorch%E7%94%9F%E6%80%81%E7%AE%80%E4%BB%8B/8.2%20%E5%9B%BE%E5%83%8F%20-%20torchvision.md查看这些模型在COCO train 2017上的box AP,keypoint AP,mask AP

torchvision.io

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

随着torchvision的发展,io也增加了更多底层的高效率的API。

在使用torchvision.io的过程中,需要注意以下几点:

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

torchvision.ops 提供了许多计算机视觉的特定操作

包括但不仅限于NMSRoIAlign(MASK R-CNN中应用的一种方法),RoIPool(Fast R-CNN中用到的一种方法)。

在合适的时间使用可以大大降低工作量,避免重复的造轮子

想看更多的函数介绍可以点击https://pytorch.org/vision/stable/ops.html进行细致查看。

torchvision.utils

torchvision.utils 提供了一些可视化的方法,可以将若干张图片拼接在一起、可视化检测和分割的效果。

具体方法可以点击https://pytorch.org/vision/stable/utils.html进行查看。

总结

torchvision的出现帮助我们解决了常见的计算机视觉中一些重复且耗时的工作,并在数据集的获取、数据增强、模型预训练等方面大大降低了工作难度,可以让更加快速上手一些计算机视觉任务。


PyTorchVideo简介

近几年来,随着传播媒介和视频平台的发展,视频正在取代图片成为下一代的主流媒体,这也使得有关视频的深度学习模型正在获得越来越多的关注。然而,有关视频的深度学习模型仍然有着许多缺点:

  • 计算资源耗费更多,并且没有高质量的model zoo,不能像图片一样进行迁移学习和论文复现
  • 数据集处理较麻烦,但没有一个很好的视频处理工具
  • 随着多模态越来越流行,亟需一个工具来处理其他模态

在这里插入图片描述

PyTorchVideo 是一个专注于视频理解工作的深度学习库。PytorchVideo 提供了加速视频理解研究所需的可重用、模块化和高效的组件。PyTorchVideo 是使用PyTorch开发的,支持不同的深度学习视频组件,如视频模型、视频数据集和视频特定转换。

PyTorchVideo的主要部件和亮点

PytorchVideo 提供了加速视频理解研究所需的模块化和高效的API。它还支持不同的深度学习视频组件,如视频模型、视频数据集和视频特定转换,最重要的是,PytorchVideo也提供了model zoo,使得人们可以使用各种先进的预训练视频模型及其评判基准。PyTorchVideo主要亮点如下:

  • 基于 PyTorch: 使用 PyTorch 构建。使所有 PyTorch 生态系统组件的使用变得容易
  • Model Zoo: PyTorchVideo提供了包含I3D、R(2+1)D、SlowFast、X3D、MViT等SOTA模型的高质量model zoo(目前还在快速扩充中,未来会有更多SOTA model),并且PyTorchVideo的model zoo调用与PyTorch Hub做了整合,大大简化模型调用
  • 数据预处理和常见数据:,PyTorchVideo支持Kinetics-400, Something-Something V2, Charades, Ava (v2.2), Epic Kitchen, HMDB51, UCF101, Domsev等主流数据集和相应的数据预处理,同时还支持randaug, augmix等数据增强trick
  • 模块化设计: PyTorchVideo的设计类似于torchvision,也是提供许多模块方便用户调用修改,在PyTorchVideo中具体来说包括data, transforms, layer, model, accelerator等模块,方便用户进行调用和读取
  • 支持多模态: PyTorchVideo现在对多模态的支持包括了visual和audio,未来会支持更多模态,为多模态模型的发展提供支持
  • 移动端部署优化: PyTorchVideo支持针对移动端模型的部署优化(使用前述的PyTorchVideo/accelerator模块),模型经过PyTorchVideo优化了最高达7倍的提速,并实现了第一个能实时跑在手机端的X3D模型(实验中可以实时跑在2018年的三星Galaxy S8上,具体请见Android Demo APP)

PyTorchVideo的安装

可以直接使用pip来安装PyTorchVideo:

pip install PyTorchVideo

注:

  • 安装的虚拟环境的python版本 >= 3.7
  • PyTorch >= 1.8.0,安装的torchvision也需要匹配
  • CUDA >= 10.2
  • ioPath
  • fvcore版本 >= 0.1.4

Model zoo 和 benchmark

在下面这部分,将简单介绍些PyTorchVideo所提供的Model zoo和benchmark

  • Kinetics-400
archdepthpretrainframe length x sample ratetop 1top 5Flops (G) x viewsParams (M)Model
C2DR50-8x871.4689.6825.89 x 3 x 1024.33link
I3DR50-8x873.2790.7037.53 x 3 x 1028.04link
SlowR50-4x1672.4090.1827.55 x 3 x 1032.45link
SlowR50-8x874.5891.6354.52 x 3 x 1032.45link
SlowFastR50-4x1675.3491.8936.69 x 3 x 1034.48link
SlowFastR50-8x876.9492.6965.71 x 3 x 1034.57link
SlowFastR101-8x877.9093.27127.20 x 3 x 1062.83link
SlowFastR101-16x878.7093.61215.61 x 3 x 1053.77link
CSNR101-32x277.0092.9075.62 x 3 x 1022.21link
R(2+1)DR50-16x476.0192.2376.45 x 3 x 1028.11link
X3DXS-4x1269.1288.630.91 x 3 x 103.79link
X3DS-13x673.3391.272.96 x 3 x 103.79link
X3DM-16x575.9492.726.72 x 3 x 103.79link
X3DL-16x577.4493.3126.64 x 3 x 106.15link
MViTB-16x478.8593.8570.80 x 1 x 536.61link
MViTB-32x380.3094.69170.37 x 1 x 536.61link
  • Something-Something V2
archdepthpretrainframe length x sample ratetop 1top 5Flops (G) x viewsParams (M)Model
SlowR50Kinetics 4008x860.0485.1955.10 x 3 x 131.96link
SlowFastR50Kinetics 4008x861.6886.9266.60 x 3 x 134.04link
  • Charades
archdepthpretrainframe length x sample rateMAPFlops (G) x viewsParams (M)Model
SlowR50Kinetics 4008x834.7255.10 x 3 x 1031.96link
SlowFastR50Kinetics 4008x837.2466.60 x 3 x 1034.00link
  • AVA (V2.2)
archdepthpretrainframe length x sample rateMAPParams (M)Model
SlowR50Kinetics 4004x1619.531.78link
SlowFastR50Kinetics 4008x824.6733.82link

使用 PyTorchVideo model zoo

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

  • TorchHub,这些模型都已经在TorchHub存在。可以根据实际情况来选择需不需要使用预训练模型。除此之外,官方也给出了TorchHub使用的tutorial
  • PySlowFast,使用 PySlowFast workflow 去训练或测试PyTorchVideo models/datasets
  • PyTorch Lightning建立一个工作流进行处理,点击查看官方tutorial

如果想查看更多的使用教程,可以点击https://github.com/facebookresearch/pytorchvideo/tree/main/tutorials进行尝试

总结

总的来说,PyTorchVideo的使用与torchvision的使用方法类似,在有了前面的学习基础上,我们可以很快上手PyTorchVideo,具体的可以通过查看官方提供的文档和一些例程来了解使用方法:官方网址


torchtext简介

torchtext是PyTorch官方用于自然语言处理(NLP)的工具包。自然语言处理也是深度学习的一大应用场景,近年来随着大规模预训练模型的应用,深度学习在人机对话、机器翻译等领域的取得了非常好的效果,也使得NLP相关的深度学习模型获得了越来越多的关注。

由于NLP和CV在数据预处理中的不同,因此NLP的工具包torchtext和torchvision等CV相关工具包也有一些功能上的差异,如:

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

torchtext的主要组成部分

torchtext可以方便的对文本进行预处理,例如截断补长、构建词表等。torchtext主要包含了以下的主要组成部分:

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

torchtext的安装

torchtext可以直接使用pip进行安装:

pip install torchtext

构建数据集

Field及其使用

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

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

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

下面通过一个例子来简要说明一下Field的使用:

要注意torchtext的版本,有的版本会有一些导入数据包的差别

  • https://stackoverflow.com/questions/66516388/attributeerror-module-torchtext-data-has-no-attribute-field
from torchtext import data

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的

构建Field完成后就可以进一步构建dataset了:

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。

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)

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

# 检查keys是否正确
print(train[0].__dict__.keys())
print(test[0].__dict__.keys())
# 抽查内容是否正确
print(train[0].comment_text)
词汇表(vocab)

在NLP中,将字符串形式的词语(word)转变为数字形式的向量表示(embedding)是非常重要的一步,被称为Word Embedding。

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

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

TEXT.build_vocab(train)
数据迭代器

其实就是torchtext中的DataLoader,看下代码就明白了:

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)

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

使用自带数据集

与torchvision类似,torchtext也提供若干常用的数据集方便快速进行算法测试。可以查看官方文档寻找想要使用的数据集。

Text Classification
  • AG_NEWS
  • AmazonReviewFull
  • AmazonReviewPolarity
  • DBpedia
  • IMDb
  • SogouNews
  • SST2
  • YahooAnswers
  • YelpReviewFull
  • YelpReviewPolarity
Language Modeling
  • PennTreebank
  • WkiText-2
  • WikiText103
Machine Translation
  • IWSLT2016
  • IWSLT2017
  • Multi30k
  • Sequence Tagging
  • CoNLL2000Chunking
  • UDPOS
Question Answer
  • SQuAD 1.0
  • SQuAD 2.0
Unsupervised Learning
  • CC100
  • EnWik9

评测指标(metric)

NLP中部分任务的评测不是通过准确率等指标完成的

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

torchtext中可以直接调用torchtext.data.metrics.bleu_score来快速实现BLEU,下面是一个官方文档中的一个例子:

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)
0.8408964276313782

其他

值得注意的是,由于NLP常用的网络结构比较固定,torchtext并不像torchvision那样提供一系列常用的网络结构。

模型主要通过torch.nn中的模块来实现,比如torch.nn.LSTMtorch.nn.RNN等。

注意:
对于文本研究而言,当下Transformer已经成为了绝对的主流,因此PyTorch生态中的HuggingFace等工具包也受到了越来越广泛的关注。

参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

uncle_ll

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值