fast.ai 深度学习笔记(五)(1)

简介: fast.ai 深度学习笔记(五)

深度学习 2:第 2 部分第 10 课

原文:medium.com/@hiromi_suenaga/deep-learning-2-part-2-lesson-10-422d87c3340c

译者:飞龙

协议:CC BY-NC-SA 4.0

来自 fast.ai 课程的个人笔记。随着我继续复习课程以“真正”理解它,这些笔记将继续更新和改进。非常感谢 JeremyRachel 给了我这个学习的机会。

视频 / 论坛


上周回顾[0:16]

  • 许多学生在上周的内容上遇到了困难,所以如果你觉得困难,没关系。Jeremy 之所以提前放上这些内容,是为了让我们有东西可以思考、考虑,并逐渐努力,所以到第 14 课时,你将有第二次机会。
  • 要理解这些部分,您需要了解卷积层输出的形状、感受野和损失函数——这些都是您在深度学习研究中需要理解的东西。
  • 一个关键的事情是,我们从简单的开始——一个单一对象分类器,一个没有分类器的单一对象边界框,然后是一个单一对象分类器和边界框。我们转向多个对象的部分实际上几乎与此相同,只是我们首先必须解决匹配问题。我们最终创建了比我们需要的地面真实边界框更多的激活,因此我们将每个地面真实对象与这些激活的子集进行匹配。一旦我们做到了这一点,我们对每个匹配对执行的损失函数几乎与这个损失函数相同(即单一对象分类器和边界框的损失函数)。
  • 如果您感到困惑,请回到第 8 课,并确保您理解数据集、数据加载器,尤其是损失函数。
  • 因此,一旦我们有了可以预测一个对象的类别和边界框的东西,我们通过创建更多的激活来转向多个对象[2:40]。然后我们必须处理匹配问题,处理完匹配问题后,我们将每个锚框稍微移动一下,围绕一下,使其尽量与特定的地面真实对象对齐。
  • 我们讨论了如何利用网络的卷积特性,尝试使激活具有类似于我们正在预测的地面真实对象的感受野。Chloe 提供了以下出色的图片,逐行讨论了 SSD_MultiHead.forward 的功能:


Chloe Sultan提供

Chloe 在这里所做的是特别关注每个路径中张量的维度,逐渐使用步幅 2 的卷积进行下采样,确保她理解为什么会出现这些网格大小,然后理解输出是如何从中产生的。


  • 这就是你必须记住这个pbd.set_trace()的地方。我在课前刚进入SSD_MultiHead.forward,输入了pdb.set_trace(),然后运行了一个批次。然后我可以打印出所有这些的大小。我们会犯错误,这就是为什么我们有调试器并知道如何检查事物并逐步进行小的操作的原因。
  • 我们接着讨论了增加每个卷积网格单元的锚框数量k[5:49],我们可以通过不同的缩放比例、长宽比来实现,这给我们带来了大量的激活,从而预测边界框。
  • 然后我们使用非极大值抑制将数量减少到一个较小的值。
  • 非极大值抑制有点糟糕、丑陋、完全启发式,我们甚至没有讨论代码,因为它看起来很丑陋。最近有人提出了一篇论文,试图使用端到端的卷积网络来替换 NMS 部分(arxiv.org/abs/1705.02950)。

  • 不够多的人在阅读论文!我们现在在课堂上所做的是实现论文,论文是真正的真相。我认为你从与人们交谈中知道,很多人不阅读论文的原因是因为很多人认为他们没有能力阅读论文。他们认为他们不是那种阅读论文的人,但你是。你在这里。我们上周开始看一篇论文,我们读到了用英语写的文字,我们大部分都理解了。如果你仔细看上面的图片,你会意识到SSD_MultiHead.forward并不是在做同样的事情。你可能会想知道这样是否更好。我的答案可能是。因为 SSD_MultiHead.forward 是我尝试的第一件事,只是为了让一些东西出现。在这个和 YOLO3 论文之间,可能有更好的方法。
  • 特别要注意的一点是,他们使用了更小的 k,但他们有更多的网格集合 1x1、3x3、5x5、10x10、19x19、38x38——每类 8732 个。比我们拥有的要多得多,所以这将是一个有趣的实验。
  • 我注意到的另一件事是,我们有 4x4、2x2、1x1,这意味着有很多重叠——每组都适合其他组。在这种情况下,你有 1、3、5,你没有那种重叠。所以这可能会使学习变得更容易。有很多有趣的东西可以玩。

  • 我最推荐的可能是将代码和方程式放在一起。你可能是数学人或者代码人。将它们并排放置,你将学到一些另一方面的知识。
  • 学习数学很难,因为符号可能看起来很难查找,但有一些好的资源,比如wikipedia
  • 另一件你应该尝试做的事情是重新创建你在论文中看到的东西。这里是来自焦点损失论文的最重要的图 1。


  • 我上周发现了我的代码中一个小错误——我展平卷积激活的方式与我在损失函数中使用它们的方式不一致,修复这个问题使它变得更好了。

通常,当我们降采样时,我们会增加滤波器的数量,或者深度。当我们从 7x7 采样到 4x4 等时,为什么要将数量从 512 减少到 256 呢?为什么不在 SSD 头部减少维度?(与性能相关?)我们有许多输出路径,我们希望每个输出路径都是相同的,所以我们不希望每个输出路径具有不同数量的滤波器,这也是论文中所做的,所以我试图与之匹配。拥有这 256 个——这是一个不同的概念,因为我们不仅利用了最后一层,还利用了之前的层。如果我们使它们更一致,生活会更容易。

自然语言处理

我们的目标是:

我们在每节课中都看到了这个想法,即采用预训练模型,去掉一些顶部的东西,用新的东西替换它,并让它做一些类似的事情。我们深入研究了这一点,ConvLearner.pretrained有一种标准的方法,可以在顶部添加一些东西,做一些特定的事情(即分类)。然后我们发现实际上我们可以在末尾添加任何我们喜欢的 PyTorch 模块,并使用custom_head让它做任何我们喜欢的事情,所以突然间你会发现我们可以做一些非常有趣的事情。

事实上,杨露说“如果我们做一个不同类型的自定义头部会怎样?”不同的自定义头部是让我们拍摄原始图片,旋转它们,然后将我们的因变量设为该旋转的相反方向,看看它是否能学会将其旋转回来。事实上,我认为现在 Google 相册有这个选项,它会自动为您旋转照片。但酷的是,正如他在这里展示的,你可以通过完全按照我们之前的课程来构建这个网络。但是你的自定义头部会输出一个单一数字,即旋转的角度,你的数据集有一个因变量,即旋转的角度。


forums.fast.ai/t/fun-with-lesson8-rotation-adjustment-things-you-can-do-without-annotated-dataset/14261/1

所以你突然意识到,有了这个骨干加自定义头部的想法,你几乎可以做任何你想做的事情 [16:30]。

  • 今天,我们将探讨相同的想法,并看看它如何应用于自然语言处理。
  • 在下一课中,我们将进一步探讨,如果自然语言处理和计算机视觉让你可以做相同的基本想法,我们如何将两者结合起来。我们将学习一个模型,实际上可以从图像中学习找到单词结构,从单词结构中找到图像,或从图像中找到图像。如果你想进一步做像从图像到句子(即图像字幕)或从句子到图像这样的事情,那将是基础。
  • 从那里开始,我们必须更深入地思考计算机视觉,看看我们可以用这个预训练网络加自定义头部的想法做些什么其他事情。因此,我们将研究各种图像增强技术,如增加低分辨率照片的分辨率以猜测缺失的部分,或在照片上添加艺术滤镜,或将马的照片变成斑马的照片等等。
  • 最后,这将使我们回到边界框。为了达到这个目标,我们首先要学习分割,这不仅仅是找出边界框在哪里,还要找出图像中每个像素所属的部分 - 所以这个像素是人的一部分,这个像素是汽车的一部分。然后我们将使用这个想法,特别是一个叫做 UNet 的想法,事实证明 UNet 的这个想法,我们可以应用到边界框上 - 这被称为特征金字塔。我们将使用这个方法来获得边界框的非常好的结果。这就是我们从这里开始的路径。这一切都将相互建立,但会带领我们进入许多不同的领域。

torchtext 转 fastai.text [18:56]:


对于自然语言处理,我们过去依赖于一个叫做 torchtext 的库,但尽管它很好用,我后来发现它的限制太令人困扰,无法继续使用。正如你们很多人在论坛上抱怨的那样,它非常慢,部分原因是它不进行并行处理,部分原因是它不记得你上次做了什么,而是从头开始重新做。然后很难做一些相当简单的事情,比如很多人试图参加 Kaggle 上的有毒评论竞赛,这是一个多标签问题,试图用 torchtext 做到这一点,我最终搞定了,但花了我大约一周的时间,这有点荒谬。为了解决所有这些问题,我们创建了一个名为 fastai.text 的新库。Fastai.text 是 torchtext 和 fastai.nlp 的组合的替代品。所以不要再使用 fastai.nlp 了 - 那已经过时了。它更慢,更令人困惑,各方面都不如意,但有很多重叠。故意地,很多类和函数的名称都是相同的,但这是非 torchtext 版本。

IMDb [20:32]

笔记本

我们将再次使用 IMDb。对于那些忘记了的人,请返回查看 lesson 4。这是一个电影评论数据集,我们用它来找出我们是否会喜欢“Zombiegeddon”,我们认为可能是我喜欢的类型。

from fastai.text import *
import html

我们需要从这个网站下载 IMDB 大型电影评论:ai.stanford.edu/~amaas/data/sentiment/ 直接链接:链接

BOS = 'xbos'  *# beginning-of-sentence tag*
FLD = 'xfld'  *# data field tag*PATH=Path('data/aclImdb/')

fast.ai 深度学习笔记(五)(2)https://developer.aliyun.com/article/1482704

相关文章
|
14天前
|
机器学习/深度学习 自然语言处理 PyTorch
fast.ai 深度学习笔记(三)(4)
fast.ai 深度学习笔记(三)(4)
22 0
|
14天前
|
机器学习/深度学习 算法 PyTorch
fast.ai 深度学习笔记(三)(3)
fast.ai 深度学习笔记(三)(3)
30 0
|
14天前
|
机器学习/深度学习 编解码 自然语言处理
fast.ai 深度学习笔记(三)(2)
fast.ai 深度学习笔记(三)(2)
32 0
|
14天前
|
机器学习/深度学习 PyTorch 算法框架/工具
fast.ai 深度学习笔记(三)(1)
fast.ai 深度学习笔记(三)(1)
35 0
|
索引 机器学习/深度学习 计算机视觉
fast.ai 深度学习笔记(四)(3)
fast.ai 深度学习笔记(四)
40 0
|
15天前
|
机器学习/深度学习 固态存储 Python
fast.ai 深度学习笔记(四)(2)
fast.ai 深度学习笔记(四)
50 3
fast.ai 深度学习笔记(四)(2)
|
15天前
|
API 机器学习/深度学习 Python
fast.ai 深度学习笔记(四)(1)
fast.ai 深度学习笔记(四)
62 3
fast.ai 深度学习笔记(四)(1)
|
15天前
|
机器学习/深度学习 算法框架/工具 PyTorch
fast.ai 深度学习笔记(五)(4)
fast.ai 深度学习笔记(五)
71 3
fast.ai 深度学习笔记(五)(4)
|
机器学习/深度学习 自然语言处理 Web App开发
fast.ai 深度学习笔记(五)(3)
fast.ai 深度学习笔记(五)
119 2
fast.ai 深度学习笔记(五)(3)
|
15天前
|
机器学习/深度学习 自然语言处理 Python
fast.ai 深度学习笔记(五)(2)
fast.ai 深度学习笔记(五)
106 4
fast.ai 深度学习笔记(五)(2)