当前位置:首页 > 百科知识 > 正文

英雄联盟怎么玩的(英雄联盟马匹查询器啥意思)

译者 | 杜小瑞

校对 | gongyouliu


全文共12725字,预计阅读时间80分钟。



第二章 预训练网络


1. 一种用于识别图像主题的预训练模型

1.1 获取一个用于图像识别的预训练模型

1.2 AlexNet

1.3 ResNet

1.4 准备完毕,开始运行

1.5 运行!

2. 一个预训练模型在训练完成之前都是假的

2.1 GAN 游戏

2.2 CycleGAN

2.3 一个将马变成斑马的网络

3. 一个用于场景描述的训练神经网络

3.1 NeuralTalk2

4. Torch Hub

5. 结论

6. 练习

7. 总结


本章包含:

运行图像识别的预训练模型

介绍GANs和CycleGAN

可以生成图像文本描述的字幕模型

通过Torch Hub共享模型



我们结束了第一章「1.PyTorch库及深度学习介绍」,并承诺在这一章中揭示令人惊奇的事情,现在该交付内容了。由于各种原因,计算机视觉无疑是受深度学习影响最大的领域之一。对自然图像的内容进行分类或解释的需求已经存在,可以获得非常大的数据集供使用,新的构造(如卷积层)被发明出来,可以在GPU上以前所未有的精度快速运行。所有这些因素,加上互联网巨头们渴望了解数以百万计的用户用他们的移动设备拍摄并在他们的平台上托管的照片。由此形成了一场巨大的风暴。


我们将通过下载和运行已经在开放的大规模数据集上训练过的非常有趣的模型来学习如何使用该领域最好的研究人员的工作。我们可以把预训练的神经网络看作是一个接受输入并产生输出的程序。这样一个程序的行为是由神经网络的结构和它在训练中看到的例子,以及根据期望的输入-输出对,或期望的输出应该满足的属性决定的。使用现成的模型可以快速启动深度学习项目,因为它省去了设计模型的研究人员的专业知识,以及训练权重所需的计算时间。



如果你是从另一个深度学习框架来学习PyTorch的,并且你更愿意直接学习PyTorch的细节,你可以跳过下面这章。我们将在本章中介绍的内容比基础知识更有趣,并且在某种程度上独立于任何给定的深度学习工具。这并不是说他们不重要!但是如果你在其他深度学习框架中使用过预训练模型,那么你已经知道它们是多么强大。如果你已经熟悉生成对抗网络(GAN)游戏,那么你就不需要我们继续向你解释这一模型。


不过,我们希望你继续阅读,因为这一章隐藏了一些有趣的重要技巧。学习如何使用PyTorch运行预训练模型是一项有用的技能。如果模型已经在大型数据集上进行了训练,那么它就特别有用了,我们需要习惯于在真实数据上获取和运行神经网络,然后可视化和评估其输出,无论我们是否训练了它。



作为我们对深度学习的首次尝试,我们将运行一个在图象识别任务中预先训练过的最先进的深度神经网络。有许多预先训练好的网络可以通过源代码库访问。研究人员通常会发布源代码和论文,并且通常代码带有通过在参考数据集上训练模型获得的权重。使用这些模型之一可以使我们能够花费很少的精力就可以让web服务具备图像识别的功能。


我们将在这里探索的预训练网络是在ImageNet数据集的一个子集上训练的(http://imagenet.stanford.edu)。ImageNet是一个非常大的数据集,由斯坦福大学维护超过1400万张图像。所有图像都用来自WordNet数据集的名词层次结构进行标记(http://wordnet.princeton.edu),WordNet是一个大型的英语词汇数据库。


ImageNet数据集和其他几个公共数据集一样,起源于学术竞赛。传统上,竞赛是一些机构和公司的研究人员经常相互挑战的主要领域。其中,ImageNet大规模视觉识别挑战赛(ILSVRC)自2010年成立以来就广受欢迎。这个特殊的比赛基于一些任务,这些任务每年都会有所不同,例如图像分类(分析图像属于哪些类别)、对象定位(识别对象在图像中的位置)、对象检测(识别和标记图像中的对象)、场景分类(对图像中的场景进行分类),场景分析(将图像分割成与语义类别相关的区域,如奶牛、房子、奶酪、帽子)。特别地,图像分类任务包括获取输入图像并产生一个由1000个总类别中的5个标签组成的列表,按置信度排序,描述图像的内容。


ILSVRC的训练集由120万个图像组成,这些图像标有1000个名词中的一个(例如,“dog”),称为图像的类。从这个意义上说,我们将交替使用标签和类这两个术语。我们可以在图2.1中看到ImageNet中的图像。


图 2.1 ImageNet图片数据集中的一个小样本



图 2.2 推理过程


我们最终能够将我们自己拍摄的图像输入到我们的预训练模型中,如图2.2所示。这将产生该图像的预测标签列表,然后我们可以检查该列表以查看模型认为我们的图像是什么!


首先将输入图像预处理为多维数组类torch.Tensor的实例。它是一个具有高度和宽度的RGB图像,因此这个张量将有三个维度:三个颜色通道和两个特定大小的空间图像维度。(我们将在第3章中详细介绍张量的含义,但现在,把它看作是一个向量或浮点数矩阵。)我们的模型将处理后的输入图像传递到预先训练好的网络中,得到每个类别的分数。根据权重,最高分对应于最可能的类别。然后将每个类一对一地映射到一个类标签上,该输出包含在一个torch.Tensor中,包含1000个元素,每个元素表示与该类相关的分数。


在做这些之前,我们需要先了解一下网络本身,看看它是如何构造的,并了解如何在模型使用之前准备好数据。




预定义的模型可以在torchvision.models(code/p1ch2/2 _pre_trained_networks.ipynb)中找到:

我们可以看看实际的模型:



大写名称指的是实现许多流行模型的Python类。它们的体系结构不同,也就是说,在输入和输出之间发生的操作的排列上不同。小写名称是方便使用的函数,返回从这些类实例化的模型,有时使用不同的参数集。例如,resnet101返回具有101层的ResNet实例,resnet18具有18层,依此类推。我们现在将注意力转向AlexNet。



AlexNet架构以15.4%的top5测试错误率(即,正确的标签必须在前5名预测中)赢得了2012年ILSVRC。相比之下,排名第二的投稿者(并非基于深度网络)则以26.2%的错误率落后。当社区开始意识到使用深度学习解决视觉任务的潜力后,这对于计算机视觉历史来说是一个决定性的时刻。这一飞跃之后是不断的改进,更现代的体系结构和训练方法使得top5错误率低至3%。


按照今天的标准,和最先进的模型相比,AlexNet是一个相当小的网络。但是在我们的例子中,它非常适合作为我们学习的第一个神经网络,我们可以使用它来学习如何在一个新的图像上运行一个预先训练过的模型版本。


我们可以在图2.3中看到AlexNet的结构。不是说我们现在已经掌握了理解它的所有要素,而是我们可以预先了解一些方面。首先,每个块由一系列乘法和加法组成,再加上我们将在第5章中学习的输出中的少量其他函数。我们可以把它看作是一个过滤器,看成一个将一个或多个图像作为输入并生成其他图像作为输出的函数。它这样做的方式是在训练期间根据它所看到的例子和这些例子所期望的结果来确定的。



图 2.3 AlexNet的结构


在图2.3中,输入图像从左侧进入并经过五个堆叠的过滤器,每个过滤器产生许多输出图像。在每个过滤器之后,图像的大小都会减小,如注释所示。经过最后一个过滤器后产生一个4096个元素的一维向量,并产生1000个分类类别的输出概率,每一个代表一个输出类别。


为了使用AlexNet模型产生一个输出图片,我们可以创建AlexNet类的实例。按照下面的方法来做:

此时,alexnet是一个可以运行alexnet结构的对象。对于我们来说,现在还没有必要了解这个体系结构的细节。目前,AlexNet只是一个不透明的对象,可以像函数一样调用。通过向alexnet提供一些大小标准的输入数据(我们将很快看到这些输入数据应该是什么),我们可以在网络中进行前向传播。也就是说,输入通过第一组神经元后,其输出将被推送到下一组神经元,一直到最终输出。实际上,假设我们有一个正确类型的输入对象,我们可以向前运行最终产生output=alexnet(input)。


但如果我们这样做了,我们将通过整个网络传输数据,而这产生的只是一些垃圾!这是因为网络是未初始化的:它的权值(对输入做加法和乘法的数字)没有经过任何训练,网络本身是一个空白的(或者更确切地说,随机的)石板。我们要么从头开始训练,要么从以前的训练中加载,我们现在要做的就是这些。


为此,让我们回到模型模块。我们了解到大写名称对应于实现流行的计算机视觉结构的类。另一方面,小写名称是用预定义的层和单位数实例化模型的函数,可以选择下载并加载预训练的权重。请注意,使用这些函数中的一个并没有什么必要,它们只是方便地实例化模型,而模型中包含许多层和单元,这些层和单元与预训练网络的构建方式相匹配。



使用resnet101函数,我们现在将实例化一个101层的卷积神经网络。简单地说,在2015年残差网络出现之前,在这样的深度上实现稳定的训练被认为是极其困难的。残差网络使用了一个小技巧使之成为可能,通过这种方法使得当年如同扫荡一般击败了其他几个基线方法。


现在我们创建一个网络实例。我们将传递一个参数,该参数将指示函数下载在ImageNet数据集上训练的resnet101的权重,其中包含120万个图像和1000个类别:

当我们盯着下载进度时,我们可以花一点时间观察一下resnet101的4450万个参数,其中有很多参数可以自动优化!



好吧,我们得到了什么?既然我们很好奇,我们就来看看resnet101是什么样子。我们可以通过打印返回模型的值来实现。这为我们提供了与2.3中看到的信息相同的文本表示,提供了有关网络结构的详细信息。对于现在的我们来说这个信息量有些太大了,但随着我们继续阅读本书,我们将对此代码所告诉我们的内容的理解不断增强:



我们在这里看到的是模块,每行代表一个模块。请注意,它们与Python模块没有任何共同之处:它们是单独的操作,是神经网络的构建块。在其他深度学习框架中,它们也被称为层。


如果向下滚动,我们会看到许多Bottleneck模块一个接一个地重复(101个!),包含卷积和其他模块。这是一个典型的用于计算机视觉的深层神经网络的解剖结构:一个或多个过滤器和非线性函数的顺序级联,最后一层(fc)为1000个输出类(out_features)中的每一个产生预测分数。


resnet变量可以像函数一样调用,将一个或多个图像作为输入,并为1000个ImageNet类中的每个类生成对应的分数。然而,在这样做之前,我们必须对输入图像进行预处理,使其大小合适,并且使其值(颜色)大致位于相同的数值范围内。为了做到这一点,torchvision模块提供了transforms,使我们能够快速定义基本预处理功能:



在本例中,我们定义了一个预处理函数,将输入图像缩放到256×256,将图像围绕中心裁剪为224× 224,将其转换为张量(Pytorch多维数组:在本例中,是一个具有颜色、高度和宽度的3D数组),并通过定义均值和标准差对其RGB(红、绿、蓝)分量进行标准化。如果我们想让网络产生有意义的答案,这些需要与训练期间呈现给网络的内容相匹配。在第7.1.3节中,我们将在开始制作自己的图像识别模型时深入讨论转换。


我们现在可以抓取我们最喜欢的狗的图片(比如说,GitHub repo中的bobby.jpg),对它进行预处理,然后看看ResNet对它的看法。我们可以通过使用Pilllow(Python的图像处理模块)从本地文件系统加载图像开始(https://pillow.readthedocs.io/en/stable):



如果我们从一个Jupyter笔记本开始跟着一起做,我们将执行以下操作来查看内联图片(它将在下面显示<PIL.JpegImagePlugin…的位置):



否则,我们可以调用show方法,它将弹出一个带有查看器的窗口,以查看图2.4所示的图像:



图 2.4 Bobby,我们非常特殊的输入图片


接下来,我们可以通过预处理管道传递图像:



然后我们可以按照网络所期望的方式对输入张量进行调整(reshape)、裁剪和规范化。我们将在接下来的两章中对此有更多的了解;抓紧时间试一下:



现在我们准备好运行我们的模型了!


在深度学习圈中,对新数据运行训练模型的过程称为推理。为了进行推断,我们需要将网络置于eval模式:



如果我们忘记了这一点,一些预先训练好的模型,比如batch normalization和dropout,将不会产生有意义的答案,这仅仅是因为它们内部的工作方式。现在eval已经设置好了,我们可以进行推断了:



刚刚发生了一组惊人的操作,涉及4450万个参数,生成了1000个分数的向量,每个ImageNet类一个。这是不是并没有花多少时间?


我们现在需要找出获得最高分数的分类的标签。这将告诉我们模型在图像中看到了什么。如果标签与人类对图像的描述匹配,那就太好了!这意味着一切正常。如果不是,那么要么是训练过程中出了问题,要么是图像与模型期望的相差太大,以致模型无法正确处理,或者是存在其他类似的问题。


为了查看预测标签的列表,我们将加载一个文本文件,按照标签在训练期间呈现给网络的相同顺序列出标签,然后我们将在产生网络最高分数的索引处挑选标签。几乎所有用于图像识别的模型都以类似于我们将要处理的形式输出。


让我们加载包含ImageNet数据集类的1000个标签的文件:


在这一点上,我们需要确定对应于我们先前获得的out张量中的最大得分的索引。我们可以使用PyTorch中的max函数来实现,它输出张量中的最大值以及出现最大值的索引:


我们现在可以使用索引来访问标签。这里,index不是一个简单的Python数字,而是一个单元素一维张量(具体来说,就是张量([207]),所以我们需要使用index[0]将实际的数值作为索引放入标签列表中。我们还使用torch.nn.functional.softmax(http://mng.bz/BYnq)将输出标准化为[0,1]的范围,然后除以它们的和。这给了我们一些大致类似于模型对其预测的信心。在这种情况下,模型有96%的把握知道它看到的是一只金毛猎犬:


由于模型产生了分数,我们还可以找出第二名、第三名等等。为此,我们可以使用sort函数,它按升序或降序对值进行排序,并提供原始数组中已排序值的索引:



我们看到前四个是狗(redbone是一个品种;谁知道呢?),之后事情开始变得有趣起来。第五个答案是“网球”,可能是因为图片里小狗的附近有很多网球,于是模型会告诉我们,“有0.1%的可能性,我错误的认为这是一个网球。”这是一个很好的例子,说明了人类和神经网络看待世界的方式有着根本的不同,也说明了奇怪的、微妙的偏见是多么容易潜入我们的数据中。


下面是游戏时间!我们可以继续用随机的图像来检验我们的网络,看看它会产生什么结果。网络的成功与否在很大程度上取决于目标在训练中的表现是否良好。如果我们呈现的图像包含训练集之外的主题,网络很可能会以相当高的可信度给出错误的答案。对模型如何对看不见的数据做出反应进行实验和感受是很有用的。


我们刚刚运行了一个在2015年赢得了图像分类比赛的网络。它学会了从包含狗及一大堆现实世界的其他物品的图像中认出这是一条狗。现在我们将从图像生成开始,了解不同的体系结构如何实现其他类型的任务。



让我们先假设一下,我们是职业罪犯,想从事销售著名艺术家“丢失”油画的赝品。我们是罪犯,而不是画家,所以当我们画假的伦勃朗和毕加索作品时,很快就会发现我们画的是业余的模仿品,而不是真正的作品。即使我们花了很多时间练习,直到能画出一幅自己看不出来是假的画,于是试图在当地的艺术品拍卖行转手,但是还是会让我们立刻被踢出局。更糟的是被别人告知“这显然是假的,滚出去!”无助于我们的进步!我们必须随机尝试一堆东西,衡量哪些东西花了稍长的时间才被识别为赝品,并在我们未来的尝试中强调这些特征,这将花费太长的时间。


相反,我们需要找一位道德立场可疑的艺术史学家来检查我们的作品,告诉我们到底是什么让他们知道这幅画不合法。有了这些反馈,我们就可以以清晰、有针对性的方式提高我们的输出,直到那些粗心的学者不再能分辨出我们的画和真实的画。


很快,我们的画作就会出现在卢浮宫,他们的金钱也会出现在我们的口袋里。我们会很富有的!


虽然这个场景有点滑稽,但底层技术是健全的,在未来几年里,它可能会对数字数据的真实性产生深远的影响。“照片证据”的整个概念可能会不再那么可信,因为自动制作出令人信服的假图像和视频变得十分容易。而这其中唯一的关键因素是数据。让我们看看这个过程是如何工作的。



在深度学习的背景下,我们刚才的描述被称为GAN game,GAN game有两个网络,一个作为画家,另一个作为艺术史学家,在创作和发现赝品方面相互竞争。GAN代表生成对抗网络,其中生成性意味着有东西正在被创造(在本例中,是假的画作),对抗性意味着两个网络在竞争,以智慧战胜另一个,而网络则非常明显。这些网络是最近深度学习研究最原始的成果之一。


请记住,我们的首要目标是生成一类无法识别为假的图像的合成示例。当与真实的例子混合在一起时,一个熟练的检查者也将很难确定哪些是真的,哪些是我们的赝品。


生成性网络在我们的场景中扮演画家的角色,任务是从任意输入开始生成逼真的图像。鉴别器网络是一个不道德的艺术检查者,需要判断一个给定的图像是由生成器制作的还是属于一组真实的图像。这种双网络设计对于大多数深度学习体系结构来说都是非典型的,但是当用于实现一个GAN 游戏时,会产生令人难以置信的结果。


图2.5显示了正在发生的事情的大致情况。生成器的最终目标是欺骗鉴别器,使其混淆真假图像。鉴别器的最终目标是找出它何时被欺骗,但它也有助于告知生成器生成的图像中可识别的错误。一开始,生成器会产生一个混乱的三眼怪兽,看起来一点也不像伦勃朗的肖像。鉴别器很容易就能分辨出混乱的画面和真实的绘画。随着训练的进行,信息从鉴别器返回,生成器使用它来改进。在训练结束时,生成器能够产生令人信服的假货,鉴别器不再能够分辨出哪个是哪个。



图 2.5 GAN game的概念


请注意,“鉴别器胜利”或“生成器胜利”不应该被视为字面意义的胜利,因为这两者之间没有明确的比赛。这两个网络都是基于另一个网络的结果进行训练的,从而驱动每个网络参数的优化。


这项技术已经证明,它能够使用生成器从只有噪声和调节信号(比如属性(例如,面部:年轻、女性、戴眼镜)或其他图像)的内容中生成真实的图像。换言之,一个训练有素的生成器学习了一个看似合理的模型,用于生成即使在人类检查时也看起来真实的图像。



这个概念的一个有趣的演变是CycleGAN。CycleGAN可以将一个领域的图像转换为另一领域的图像(反之亦然),而无需我们在训练集中显式提供匹配对。


在图2.6中,我们有一个CycleGAN工作流,用于将马的照片变成斑马,反之亦然。请注意,有两个独立的生成器网络,以及两个不同的鉴别器。



图 2.6 训练到可以欺骗两个鉴别器网络的CycleGAN



有趣的是,在这一点上,我们不需要匹配的马/斑马对作为基本事实。从一组无关的马和斑马照片开始,生成器就可以了解他们的任务,而不仅仅是一个纯粹的监督设置。该模型的意义远不止于此:生成器学习如何在不监督学习内容的情况下有选择地更改场景中对象的外观。没有信号表明鬃毛是鬃毛,腿是腿,但是它们被翻译成与另一只动物的形状结构相吻合的东西。



我们现在可以玩这个模型了。CycleGAN网络是在从ImageNet数据集中提取的(不相关的)马图像和斑马图像数据集上训练的。该网络学习一个或多个马匹的图像,并将它们全部变成斑马,剩下的图像尽可能保持不变。虽然人类在过去几千年里没有专注的去寻找一种能把马变成斑马的工具,但这项任务展示了这些架构在远程监控下模拟复杂现实世界的能力。虽然它们有其局限性,但有迹象表明,在不久的将来,我们将无法在实时视频源中区分真假,这就像打开了一盒蠕虫罐头,我们要及时将它关闭。



netG模型已创建,但它包含随机权重。我们之前提到过,我们将运行一个在horse2zebra数据集上预训练过的生成器模型,该数据集的训练集包含两组分别为1068张马的图像和1335张斑马的图像。数据集位于http://mng.bz/8pKP。模型的权重已保存在一个.pth文件中,该文件只是模型张量参数的pickle文件。我们可以使用模型的load_state_dict方法将它们加载到ResNetGenerator中:



此时,netG已经获得了它在训练期间获得的所有知识。请注意,这与我们在第2.1.3节中从torchvision加载resnet101时发生的情况完全相同;但是torchvision.resnet101函数对我们隐藏了加载。


让我们将网络置于eval模式,就像我们对resnet101所做的那样:



像我们之前做的那样打印出模型,考虑到它的功能,我们可以理解它实际上相当简洁。它获取一幅图像,通过观察像素来识别图像中的一匹或多匹马,然后分别修改这些像素的值,使生成的图像看起来像一只真正的斑马。我们不会在打印输出(或者源代码)中识别出任何类似斑马的东西:那是因为里面没有类似斑马的东西。网络是一个脚手架,有价值的东西在权重中体现。


我们准备加载一个马的随机图像,看看我们的生成器产生了什么。首先,我们需要导入PIL和torchvision:


然后我们定义一些输入转换,以确保数据以正确的形状和大小进入网络:


让我们打开马的图片(看图片2.7):



图 2.7 一个男人骑着一匹马,但是马并不想让他骑


可以看到有个男人在马上(从图片上看,不用看很长时间。)总之,让我们通过预处理,把它变成一个形状合适的变量:



我们现在不应该关心细节。重要的是我们要从整体观察。此时,可以将批处理输入到我们的模型:



批处理输出现在是生成器的输出,我们可以将其转换回图像:



但是,谁会那样去骑斑马?由此产生的图像(图2.8)并不完美,但考虑到网络发现有人(某种程度上)骑在马背上有点不寻常。值得一提的是,学习过程还没有经过直接的监督,人类已经划定了数以万计的马匹,或者手动用Photoshop加工了成千上万的斑马条纹。生成器已经学会了产生一种图像,该图像会使鉴别者误以为是斑马,而且图像上没有任何痕迹(显然,鉴别者从未参加过牛仔竞技表演)。



图 2.8 一个男人骑着斑马,但是斑马不想让他骑


许多其他已开发的有趣生成器使用对抗性训练或其他方法。他们中的一些人能够创造出不存在的人的真实面孔;其他人可以把草图翻译成想象中风景的真实画面。生成模式也正在探索生产真正的声音,可信的文本,和愉快的音乐。这些模型很可能是未来支持创意过程的工具的基础。



到目前为止,我们已经尝试了一个模型,观察了图像和模型如何生成新的图像。我们将以一个模型结束我们的旅程,这个模型包含了一个更基本的要素:自然语言。



为了获得涉及自然语言的模型的第一手经验,我们将使用RuoTian Luo慷慨提供的预训练图像字幕模型,它是Andrej Karpathy的NeuralTalk2模型的实现。当呈现自然图像时,这种模型会生成一个描述场景的英文字幕,如图2.9所示。这个模型是在一个大的图像数据集上训练的,同时还有相应的句子描述:例如,“一只斑猫靠在一张木头桌子上,一只爪子在激光鼠标上,另一只爪子在一台黑色笔记本电脑上。”



这个字幕模型有两个相连的部分。模型的前半部分是一个网络,它学习生成场景的“描述性”数字表示(Tabby cat、laser mouse、paw),然后将其作为下半部分的输入。第二部分是一个递归神经网络,它通过把这些数字描述放在一起生成一个连贯的句子。模型的两半部分在图像-说明对上一起训练。


模型的后半部分称为递归,因为它在随后的向前传递中生成其输出(单个字),其中每个向前传递的输入包括前一个向前传递的输出。这就产生了下一个单词对先前生成的单词的依赖性,正如我们在处理句子或序列时所期望的那样。





让我们用horse.jpg图片试试。上面写着,“一个人在海滩上骑马。”很恰当。


现在,为了好玩,让我们看看我们的CycleGAN是否也能骗到这个NeuralTalk2模型。让我们在数据文件夹中添加zebra.jpg图像,然后重新运行模型:“一群斑马站在一块地里。”好吧,它把动物弄对了,但它在图像中看到了不止一只斑马。当然,这不是神经网络曾经见过的斑马的姿势,网络也没有见过骑在斑马上的骑手(有一些虚假的斑马图案)。此外,在训练数据集中,斑马很可能是成群出现的,因此我们可能需要检验一些偏差。另外,字幕网络也没有描述这个骑手。同样,这可能是出于同样的原因:在训练数据集中,网络没有显示一个骑斑马的骑手。无论如何,这是一个令人印象深刻的壮举:我们用一个不可能的情况生成了一个假图像,而且字幕网络足够灵活,能够正确地显示主题。


我们想强调的是,像这样的东西,在深度学习出现之前是很难实现的,现在我们可以用不到一千行代码,一个对马或斑马一无所知的通用架构,一个图像和它们的描述的语料库(在本例中是MS COCO数据集)就能完成。没有硬编码的标准或语法,所有的东西,包括句子,都是从数据中的模式中产生的。


最后一个例子中的网络架构,在某种程度上,比我们之前看到的更复杂,因为它包括两个网络。其中一个是循环神经网络,但它是用相同的构建块构建的,所有这些都是由PyTorch提供的。


在撰写本文的时候,像这样的模型更多的是作为应用研究或创新项目而存在,而不是有明确的具体用途。结果虽然有希望,但还不够好用。随着时间的推移(以及额外的训练数据),我们应该期望这类模型能够向视力受损的人描述世界,从视频中转录场景,并执行其他类似的任务。







在寻找有趣的预训练模型的过程中,我们现在可以搜索包含hubconf.py的GitHub存储库,我们马上就会知道可以使用torch.hub模块加载它们。让我们看看在实践中是如何做到的。为此,我们将回到TorchVision,因为它提供了一个如何与Torch Hub交互的清晰示例。



现在我们知道了repo、入口点和一个有趣的关键字参数,这就是使用torch.hub加载模型所需的全部内容,甚至不需要克隆repo。没错,Pytorch会帮我们处理的:


它设法将pytorch/vision repo的主分支的快照以及权重下载到本地目录(在我们的主目录中默认为.torch/hub)并运行resnet18入口点函数,该函数返回实例化的模型。根据环境的不同,Python可能会提示缺少一个模块,比如PIL。Torch Hub不会安装缺失的依赖项,但它会将它们报告给我们,以便我们采取行动。


与前面的方法相同,此时,我们可以使用经过适当的参数调用返回的模型,然后对其运行前向传播。非常好的一点是,现在通过这一机制发布的每一个模型都将使用相同的模式供我们使用,而且数量远远超出我们的想象。


注意,入口点应该返回模型;但是,严格地说,他们不是被动返回的。例如,我们可以有一个输入转换的入口点,另一个输入点用于将输出概率转换为文本标签。或者我们可以有一个仅用于模型的入口点,另一个入口点包括模型以及预处理和后处理步骤。通过开放这些选项,PyTorch开发人员为社区提供了足够的标准化和很大的灵活性。我们将看看这个机会将产生什么样的模式。





我们还将看到如何使用相同的构建块来构建处理不同类型数据上的不同问题的模型。PyTorch做得特别正确的一件事是,以基本工具集的形式提供这些构建块,从API的角度来看,PyTorch并不是一个非常大的库,尤其是与其他深度学习框架相比。


这本书并没有集中讨论完整的pytorch api或者回顾深度学习架构;相反,我们将建立这些构件的实际知识。这样,你就可以在一个坚实的基础上使用优秀的在线文档和知识库。


从下一章开始,我们将开始一段旅程,这段旅程将使我们能够使用PyTorch从头开始教授我们的计算机技能,就像本章所描述的那样。我们还将了解到,从预先训练好的网络开始,在新数据上对其进行微调,而不必从头开始,这是在我们拥有的数据点不是特别多的情况下解决问题的有效方法。更进一步的原因在于,对深度学习从业者来说,预训练网络是一个重要的工具。现在,是时候学习第一个基本构件“张量”了。



1、将金毛犬的图像输入马-斑马模型中。

A. 你需要对图像做什么准备处理?

B. 输出看起来像什么?


2、在github中寻找带有hubconf.py文件的项目。

A. 返回了多少项目仓库。

B. 使用hubconf.py查找一个有趣的项目。你能从文件中理解项目的目的吗?

C. 给这个项目做个标记,看完这本书再回来看看。你能理解执行情况吗?



1、预训练网络是已经在数据集上训练过的模型。这种网络通常可以在加载网络参数之后立即产生有用的结果。

2、通过了解如何使用预训练模型,我们可以将神经网络集成到项目中,而无需对其进行设计或训练。

3、AlexNet和ResNet是两个深度卷积网络,它们在发布的几年里为图像识别设定了新的基准。

4、生成对抗网络(GANs)由两部分组成:生成器和鉴别器,它们共同工作以产生与真实事物不可区分的输出。

5、CycleGAN使用一种支持在两种不同类型的图像之间来回转换的体系结构。

6、NeuralTalk2使用一种混合模型架构来消费图像并生成图像的文本描述。

7、Torch Hub是一种标准化的方法,可以使用合适的hubconf.py文件从任何项目加载模型和权重。