提交 b7c1e8a4 编写于 作者: W wizardforcel

dl7 fix

上级 a01c76e1
......@@ -413,7 +413,7 @@ learn.sched.plot()
[ 2. 0.03372 0.02929 0.98975]
```
* 按照你的希望尽可能多,但如果你运行太久,准确可能会变得更糟。 它被称为“过拟合”,我们稍后会详细了解它。
* 按照你的希望尽可能多,但如果你运行太久,准确可能会变得更糟。 它被称为“过拟合”,我们稍后会详细了解它。
* 另一个考虑因素是你可以使用的时间。
## 提示与技巧 [[1:21:40](https://youtu.be/IPBSB1HLNLo%3Ft%3D1h21m40s)]
......
......@@ -436,7 +436,7 @@ vs,len(trn_lm)
![](../img/1_4RrK26gE8W28T8uJBl013g.png)
这是一种新的洞察力,它不是最新的,我们想要预训练一些东西。 我们从第4课就知道,如果我们通过首先创建一个语言模型,微调它,再将其作为分类器,这是有用的。 它实际上为我们带来了一个最先进的结果 - 我们获得了相当多的IMDb分类器结果。 我们的目标不是那么远,因为IMDb的电影评论与其他任何英文文档没有什么不同; 它们与随机字符串甚至中文文档的不同程度相比较。 因此,就像ImageNet允许我们训练能够识别看起来像图片的东西的东西一样,我们可以将它用在与ImageNet无关的东西上,就像卫星图像一样。 为什么我们不训练一个擅长英语的语言模型,然后对它进行微调以适用于电影评论。
这是一种新的洞察力,它不是最新的,我们想要预训练一些东西。 我们从第4课就知道,如果我们通过首先创建一个语言模型,微调它,再将其作为分类器,这是有用的。 它实际上为我们带来了一个最先进的结果 - 我们获得了相当多的IMDb分类器结果。 我们的目标不是那么远,因为IMDb的电影评论与其他任何英文文档没有什么不同; 它们与随机字符串甚至中文文档的不同程度相比较。 因此,就像ImageNet允许我们训练能够识别看起来像图片的东西的东西一样,我们可以将它用在与ImageNet无关的东西上,就像卫星图像一样。 为什么我们不训练一个擅长英语的语言模型,然后对它进行微调以适用于电影评论。
因此,这一基本见解促使Jeremy尝试在维基百科上构建语言模型。 Stephen Merity已经处理了维基百科,发现了其中大部分内容的一部分,抛弃了留下较大文章的愚蠢小文章。 他称之为wikitext103。 Jeremy获取了wikitext103并训练了一个语言模型。 他使用完全相同的方法向你展示训练IMDb语言模型,但他训练了一个wikitext103语言模型。 他保存了它并将其提供给任何想要在[此URL](http://files.fast.ai/models/wt103/)上使用它的人。 现在的想法是让我们训练一个以这些权重开始的IMDb语言模型。 希望对你们来说,这是一个非常明显的,极具争议性的想法,因为它基本上就是我们迄今为止在几乎所有课程中所做的。 但是,当Jeremy在去年6月或7月向NLP社区的人们首次提到这一点时,可能并没有那么少的兴趣,并被告知它是愚蠢的 [[45:03](https://youtu.be/h5Tz7gZT9Fo%3Ft%3D45m3s)] 。 因为杰里米很顽固,所以即使他们对NLP有了更多了解并且无论如何尝试它,他都会忽视他们。 让我们看看发生了什么。
......@@ -454,7 +454,7 @@ vs,len(trn_lm)
em_sz,nh,nl = 400,1150,3
```
这是我们预先训练的路径和我们预先训练的语言模型路径。
这是我们预训练的路径和我们预训练的语言模型路径。
```python
PRE_PATH = PATH/'models'/'wt103'
......@@ -512,7 +512,7 @@ wgts['0.encoder.weight'] = T(new_w) wgts['0.encoder_with_dropout.embed.weight']
* 然后按照惯例,我们可以调用`learner.fit` 。 我们在最后一层做了一个迭代,只是为了得到好的。 它的设置方式是最后一层是嵌入词,这显然是错误的,因为很多嵌入权重甚至不存在于词汇中。 因此,我们将训练每轮的嵌入权重。
* 然后我们将开始做完整模型的几个迭代。 怎么样? 在第4课中,我们在14轮之后损失了4.23。 在这种情况下,我们在1个迭代后有4.12的损失。 因此,通过对wikitext103进行预训练,我们在1个时期之后获得了比在语言模型中获得的最佳损失更好的损失。
**问题** :wikitext103型号是什么? 再次是AWD LSTM [[52:41]( data-href=)] ? 是的,我们即将深入研究。 我训练它的方式实际上是你在上面看到的相同代码行,但没有在wikitext103上预训练它。
**问题** :wikitext103型号是什么? 再次是AWD LSTM [[52:41]( data-href=)] ? 是的,我们即将深入研究。 我训练它的方式实际上是你在上面看到的相同代码行,但没有在wikitext103上预训练它。
* * *
......@@ -598,7 +598,7 @@ md = LanguageModelData(PATH, 1, vs, trn_dl, val_dl, bs=bs, bptt=bptt)
最后把它变成一个学习器 [[1:12:41]( data-href=)] 。 所以学习器,你只需传入模型,然后将其变成学习器。 在这种情况下,我们已经覆盖了学习器,我们唯一做的就是说我希望默认的损失函数是交叉熵。 整套自定义模型,自定义模型数据,自定义学习器都适合单个屏幕。 他们总是基本上看起来像这样。
这个代码库的有趣部分是`get_language_model` [[1:13:18]( data-href=)] 。 因为这给了我们AWD LSTM。 它实际上包含了很大的想法。 一个非常简单的大想法,这里的NLP社区中每个人都非常明显的认为,杰里米思考的这个想法是疯了。 也就是说,每个模型都可以被认为是一个主干和头部,如果你预训练骨干并坚持随机头,你可以进行微调,这是一个好主意。
这个代码库的有趣部分是`get_language_model` [[1:13:18]( data-href=)] 。 因为这给了我们AWD LSTM。 它实际上包含了很大的想法。 一个非常简单的大想法,这里的NLP社区中每个人都非常明显的认为,杰里米思考的这个想法是疯了。 也就是说,每个模型都可以被认为是一个主干和头部,如果你预训练骨干并坚持随机头,你可以进行微调,这是一个好主意。
![](../img/1_QoAsI-zGJ3XKMBDY-3o1Rg.png)
......@@ -644,7 +644,7 @@ learner.metrics = [accuracy] learner.freeze_to(-1)
#### 计算精度 [[1:21:45]( data-href=)]
一个重要的想法可能看起来很小,但同样令人难以置信的争议是我们应该在看一个语言模型时测量准确性。 通常对于语言模型,我们会看到一个损失值,它只是交叉熵损失,但具体来说,我们几乎总是将这一点视为NLP社区称之为“困惑”的能力。 所以困惑只是`e^(cross entropy)` 。 基于交叉熵损失比较事物存在很多问题。 现在还不确定是否有时间详细介绍它,但基本问题在于它就像我们在焦点丢失方面所学到的那样。 交叉熵损失 - 如果你是对的,它希望你真的相信你是对的。 所以它真的惩罚了一个没有说“我确定这是错的”的模型,这是错误的。 准确性根本不在意你是多么自信 - 它关心你是否正确。 这通常是你在现实生活中关心的事情。 准确性是我们经常猜测下一个单词的频率,并且它是一个更稳定的数字来跟踪。 所以这是杰里米做的一件简单的小事。
一个重要的想法可能看起来很小,但同样令人难以置信的争议是我们应该在看一个语言模型时测量准确率。 通常对于语言模型,我们会看到一个损失值,它只是交叉熵损失,但具体来说,我们几乎总是将这一点视为NLP社区称之为“困惑”的能力。 所以困惑只是`e^(cross entropy)` 。 基于交叉熵损失比较事物存在很多问题。 现在还不确定是否有时间详细介绍它,但基本问题在于它就像我们在焦点丢失方面所学到的那样。 交叉熵损失 - 如果你是对的,它希望你真的相信你是对的。 所以它真的惩罚了一个没有说“我确定这是错的”的模型,这是错误的。 准确率根本不在意你是多么自信 - 它关心你是否正确。 这通常是你在现实生活中关心的事情。 准确率是我们经常猜测下一个单词的频率,并且它是一个更稳定的数字来跟踪。 所以这是杰里米做的一件简单的小事。
```python
learner.model.load_state_dict(wgts)
......@@ -669,7 +669,7 @@ learner.lr_find(start_lr=lrs/10, end_lr=lrs*10, linear=True)
learner.sched.plot()
```
我们训练了一段时间,我们的交叉熵损失为3.9,相当于~49.40的困惑( `e^3.9`[[1:23:14]( data-href=)] 。 为了让你了解语言模型所发生的事情,如果你看约18个月前的学术论文,你会看到他们讨论的是一百多种最先进的困惑。 我们理解语言和计算语言模型准确或困惑的能力并不是理解语言的可靠代理。 如果我能猜出你接下来会说些什么,我需要很好地理解语言以及你可能会说得很好的事情。 令人困惑的数字刚刚下降到令人惊讶的程度,而且它会下降得更多。 在过去12-18个月的NLP中,它真的感觉像2011-2012计算机视觉。 我们开始了解转移学习和微调,基本模型变得更好。 你想到NLP能做什么和不能做什么的一切都很快就会过时。 还有很多东西,NLP明显不擅长。 就像在2012年,有很多东西计算机视觉不擅长。 但现在的变化非迅速,现在是非常好的时期,可以非常擅长NLP或者以NLP为基础创办初创公司,因为有两大堆电脑在两年前绝对不可思议,在两年前和现在不太好的东西,再过几年,他们会比人好得多。
我们训练了一段时间,我们的交叉熵损失为3.9,相当于~49.40的困惑( `e^3.9`[[1:23:14]( data-href=)] 。 为了让你了解语言模型所发生的事情,如果你看约18个月前的学术论文,你会看到他们讨论的是一百多种最先进的困惑。 我们理解语言和计算语言模型准确或困惑的能力并不是理解语言的可靠代理。 如果我能猜出你接下来会说些什么,我需要很好地理解语言以及你可能会说得很好的事情。 令人困惑的数字刚刚下降到令人惊讶的程度,而且它会下降得更多。 在过去12-18个月的NLP中,它真的感觉像2011-2012计算机视觉。 我们开始了解转移学习和微调,基本模型变得更好。 你想到NLP能做什么和不能做什么的一切都很快就会过时。 还有很多东西,NLP明显不擅长。 就像在2012年,有很多东西计算机视觉不擅长。 但现在的变化非迅速,现在是非常好的时期,可以非常擅长NLP或者以NLP为基础创办初创公司,因为有两大堆电脑在两年前绝对不可思议,在两年前和现在不太好的东西,再过几年,他们会比人好得多。
```python
learner.fit(lrs, 1, wds=wd, use_clr=(20,10), cycle_len=15)
......@@ -700,9 +700,9 @@ epoch trn_loss val_loss accuracy
**问题** :通过训练你的 Dropout 率是相同的,还是相应地调整它和相应的权重 [[1:26:27]( data-href=)] ? 不同的 Dropout 非常有趣,最近有一些论文表明逐渐改变 Dropout [[1:28:09]( data-href=)] 。 要么逐梯度小或逐梯度大,要么是个好主意,我不确定哪个。 也许我们中的一个人可以在一周内尝试找到它。 我没有看到它被广泛使用。 我用我写的最新论文尝试了一下,得到了一些好的结果。 我想我渐梯度小了,但我记不得了。
**问题** :我认为这种语言模型是基于词嵌入构建的吗? 尝试使用短语或句子嵌入是否有价值? 我问这个是因为我前几天从谷歌那里看到了通用句码编码器 [[1:28:45]( data-href=)] 。 这要好得多。 这不仅仅是一个句子的嵌入,这是一个完整的模型。 按定义嵌入就像固定的东西。 句子或阶段嵌入始终是创建它的模型。 我们有一个试图理解语言的模型。 它不仅仅是短语或句子 - 它最终是一个文本,它不仅仅是我们在整个过程中进行训练的嵌入。 这是NLP多年来的一个巨大问题,现在这是他们必须嵌入的附件。 即使是社区最近对[AI2]( data-href=) (艾伦人工智能研究所)最感兴趣的论文称为ELMo--他们在许多模型中发现了更好的结果,但同样是嵌入式。 他们采用固定的模型并创建了一组固定的数字,然后将它们输入模型中。 但是在计算机视觉方面,我们多年来已经知道这种具有固定功能的方法,它们被称为计算机视觉中的超级列,人们在3或4年前停止使用它们,因为微调整个模型的工作量很大更好。 对于那些花费了大量时间使用NLP且没有太多时间使用计算机视觉的人,你将不得不开始重新学习。 所有这些东西都被告知这个想法,有些东西叫做嵌入,你提前学习它们,然后你应用这些固定的东西,无论是单词级别还是短语级别或者其他级别 - 不要这样做。 你希望实际创建一个预训练好的模型并对其进行端到端的微调,然后你将看到一些特定的结果。
**问题** :我认为这种语言模型是基于词嵌入构建的吗? 尝试使用短语或句子嵌入是否有价值? 我问这个是因为我前几天从谷歌那里看到了通用句码编码器 [[1:28:45]( data-href=)] 。 这要好得多。 这不仅仅是一个句子的嵌入,这是一个完整的模型。 按定义嵌入就像固定的东西。 句子或阶段嵌入始终是创建它的模型。 我们有一个试图理解语言的模型。 它不仅仅是短语或句子 - 它最终是一个文本,它不仅仅是我们在整个过程中进行训练的嵌入。 这是NLP多年来的一个巨大问题,现在这是他们必须嵌入的附件。 即使是社区最近对[AI2]( data-href=) (艾伦人工智能研究所)最感兴趣的论文称为ELMo--他们在许多模型中发现了更好的结果,但同样是嵌入式。 他们采用固定的模型并创建了一组固定的数字,然后将它们输入模型中。 但是在计算机视觉方面,我们多年来已经知道这种具有固定功能的方法,它们被称为计算机视觉中的超级列,人们在3或4年前停止使用它们,因为微调整个模型的工作量很大更好。 对于那些花费了大量时间使用NLP且没有太多时间使用计算机视觉的人,你将不得不开始重新学习。 所有这些东西都被告知这个想法,有些东西叫做嵌入,你提前学习它们,然后你应用这些固定的东西,无论是单词级别还是短语级别或者其他级别 - 不要这样做。 你希望实际创建一个预训练好的模型并对其进行端到端的微调,然后你将看到一些特定的结果。
**问题** :为了使用准确性而不是困惑度作为模型的度量,我们可以将其用于损失函数而不是仅仅将其用作度量 [[1:31:21]( data-href=)] 吗? 不,你永远不想这样做,无论是计算机视觉还是NLP或其他什么。 它太坎坷了。 因此,交叉熵可以作为损失函数。 而且我不是说,而是使用它。 我认为查看准确度并查看交叉熵是很好的。但是对于你的损失函数,你需要一些漂亮而顺畅的东西。准确性不是很好。
**问题** :为了使用准确率而不是困惑度作为模型的度量,我们可以将其用于损失函数而不是仅仅将其用作度量 [[1:31:21]( data-href=)] 吗? 不,你永远不想这样做,无论是计算机视觉还是NLP或其他什么。 它太坎坷了。 因此,交叉熵可以作为损失函数。 而且我不是说,而是使用它。 我认为查看准确度并查看交叉熵是很好的。但是对于你的损失函数,你需要一些漂亮而顺畅的东西。准确率不是很好。
```python
learner.sav('lm1')
......@@ -931,7 +931,7 @@ learn.sched.plot_loss()
learn.save('clas_2')
```
然后我们微调整个东西 [[1:40:47]( data-href=)] 。这是我们的论文在使用预训练的模型之前的主要尝试:
然后我们微调整个东西 [[1:40:47]( data-href=)] 。这是我们的论文在使用预训练的模型之前的主要尝试:
[在翻译中学到:语境化的单词向量]( data-href=)
......
......@@ -72,7 +72,7 @@
#### 编码器≈骨干 [[15:18](https://youtu.be/tY0n9OT5_nA%3Ft%3D15m18s)]
斯蒂芬使用“编码器”这个词,但我们倾向于使用“骨干”这个词。 就像我们谈到为现有模型添加自定义头部时一样,例如,现有的预训练过的ImageNet模型,我们说这是我们的支柱,然后我们会在它上面坚持一些能够完成我们想要的任务的头部。 顺序学习序列,他们使用单词编码器,但它基本上是相同的东西 - 它是一个神经网络架构的一部分,它接受输入并将其转换为一些表示,然后我们可以在顶部粘贴更多层从我们为分类器中抓取一些东西,我们在分类器上堆叠一个线性层,将int变成情绪。 但这一次,我们有一些东西比创造情绪更难 [[16:12](https://youtu.be/tY0n9OT5_nA%3Ft%3D16m12s)] 。 我们不是将隐藏状态转变为正面或负面情绪,而是将其变成一系列标记,其中标记序列是斯蒂芬的例子中的德语句子。
斯蒂芬使用“编码器”这个词,但我们倾向于使用“骨干”这个词。 就像我们谈到为现有模型添加自定义头部时一样,例如,现有的预训练过的ImageNet模型,我们说这是我们的支柱,然后我们会在它上面坚持一些能够完成我们想要的任务的头部。 顺序学习序列,他们使用单词编码器,但它基本上是相同的东西 - 它是一个神经网络架构的一部分,它接受输入并将其转换为一些表示,然后我们可以在顶部粘贴更多层从我们为分类器中抓取一些东西,我们在分类器上堆叠一个线性层,将int变成情绪。 但这一次,我们有一些东西比创造情绪更难 [[16:12](https://youtu.be/tY0n9OT5_nA%3Ft%3D16m12s)] 。 我们不是将隐藏状态转变为正面或负面情绪,而是将其变成一系列标记,其中标记序列是斯蒂芬的例子中的德语句子。
这听起来更像是语言模型而不是分类器,因为语言有多个标记(对于每个输入词,都有一个输出词)。 但语言模型也更容易,因为语言模型输出中的标记数量与语言模型输入中的标记数量相同。 它们不仅长度相同,而且它们完全匹配(例如,在第一个词出现第二个词之后,第二个词出现第三个词,依此类推)。 对于翻译语言,你不一定知道单词“he”将被翻译为输出中的第一个单词(不幸的是,在这种特殊情况下)。 通常情况下,主题对象顺序会有所不同,或者会插入一些额外的单词,或者我们需要添加一些性别文章等一些代词。这是我们要处理的关键问题是我们有一个任意长度的输出,其中输出中的标记不对应于输入中的相同顺序或特定标记 [[17:31](https://youtu.be/tY0n9OT5_nA%3Ft%3D17m31s)] 。 但总体思路是一样的。 这是一个对输入进行编码的RNN,将其转换为某种隐藏状态,然后我们要学习的新事物就是生成一个序列输出。
......@@ -239,7 +239,7 @@
#### 单词向量 [[32:53](https://youtu.be/tY0n9OT5_nA%3Ft%3D32m53s)]
本周我们在论坛上花了很多时间讨论无意义的单词向量是如何以及如何停止对它们如此兴奋 - 现在我们将使用它们。 为什么? 我们一直在学习使用语言模型和预训练的适当模型而不是预先训练的线性单层(这是单词向量)的所有内容同样适用于序列到序列。 但杰里米和塞巴斯蒂安开始关注这一点。 对于任何有兴趣创造一些真正新的高度可发表结果的人来说,有一个完整的事情,用预先训练的语言模型排序的整个序列区域还没有被触及。 杰里米认为它会和分类一样好。 如果你正在努力解决这个问题,那么你就会发现一些令人兴奋的东西并希望帮助发布它,Jeremy非常乐意帮助共同撰写论文。 因此,当你有一些有趣的结果时,请随时与我们联系。
本周我们在论坛上花了很多时间讨论无意义的单词向量是如何以及如何停止对它们如此兴奋 - 现在我们将使用它们。 为什么? 我们一直在学习使用语言模型和预训练的适当模型而不是预训练的线性单层(这是单词向量)的所有内容同样适用于序列到序列。 但杰里米和塞巴斯蒂安开始关注这一点。 对于任何有兴趣创造一些真正新的高度可发表结果的人来说,有一个完整的事情,用预训练的语言模型排序的整个序列区域还没有被触及。 杰里米认为它会和分类一样好。 如果你正在努力解决这个问题,那么你就会发现一些令人兴奋的东西并希望帮助发布它,Jeremy非常乐意帮助共同撰写论文。 因此,当你有一些有趣的结果时,请随时与我们联系。
在这个阶段,我们没有任何这个,所以我们将使用很少的fastai [[34:14](https://youtu.be/tY0n9OT5_nA%3Ft%3D34m14s)] 。 我们所拥有的只是单词向量 - 所以让我们至少使用体面的单词向量。 Word2vec是非常古老的单词词向量。 现在有更好的单词向量和fast.text是一个非常好的单词向量源。 有数百种语言可供他们使用,你的语言可能会被表示出来。
......@@ -413,7 +413,7 @@ pytext中没有fasttext Python库,但这是一个方便的技巧 [[35:03](http
* `weight`属性是一个具有`data`属性的`Variable`
* `data`属性是张量
现在我们已经得到了我们的权重张量,我们可以通过我们的词汇表,我们可以在预先训练的向量中查找单词,如果我们找到它,我们将用预先训练的向量替换随机权重 [[52] :35](https://youtu.be/tY0n9OT5_nA%3Ft%3D52m35s)] 。 随机权重的标准差为1.我们的预训练向量的标准差约为0.3。 再说一遍,这就是Jeremy在做原型时所做的那种hacky事情,他只是将它乘以3.当你看到这个视频时,我们可以将所有这些序列放到fastai库中。 ,你不会在那里找到那种可怕的黑客(肯定希望)。 但是当你进行原型设计时就会被砍掉。 有些事情不会在fast.text中,在这种情况下,我们只会跟踪它 [[53:22](https://youtu.be/tY0n9OT5_nA%3Ft%3D53m22s)] 。 打印声明在那里,以便我们可以看到发生了什么(即为什么我们缺少东西?)。 请记住,我们有大约30,000,所以我们不会错过太多。
现在我们已经得到了我们的权重张量,我们可以通过我们的词汇表,我们可以在预训练的向量中查找单词,如果我们找到它,我们将用预训练的向量替换随机权重 [[52] :35](https://youtu.be/tY0n9OT5_nA%3Ft%3D52m35s)] 。 随机权重的标准差为1.我们的预训练向量的标准差约为0.3。 再说一遍,这就是Jeremy在做原型时所做的那种hacky事情,他只是将它乘以3.当你看到这个视频时,我们可以将所有这些序列放到fastai库中。 ,你不会在那里找到那种可怕的黑客(肯定希望)。 但是当你进行原型设计时就会被砍掉。 有些事情不会在fast.text中,在这种情况下,我们只会跟踪它 [[53:22](https://youtu.be/tY0n9OT5_nA%3Ft%3D53m22s)] 。 打印声明在那里,以便我们可以看到发生了什么(即为什么我们缺少东西?)。 请记住,我们有大约30,000,所以我们不会错过太多。
```
_3097 ['l'', "d'", 't_up', 'd'', "qu'"]_ _1285 ["'s", ''s', "n't", 'n't', ':']_
......
......@@ -20,7 +20,7 @@
#### [cifar10-darknet.ipynb](https://github.com/fastai/fastai/blob/master/courses/dl2/cifar10-darknet.ipynb) [[7:17](https://youtu.be/ondivPiwQho%3Ft%3D7m17s)]
笔记本电脑被称为[暗网,](https://pjreddie.com/darknet/)因为我们要看的特定架构非常接近暗网架构。 但是你会在整个过程中看到暗网结构不是整个YOLO v3端到端的东西,而只是它们在ImageNet上预训练过来进行分类的部分。 它几乎就像你能想到的最通用的简单架构,所以它是实验的一个非常好的起点。 因此我们将其称为“暗网”,但它并不是那样,你可以摆弄它来创造绝对不是暗网的东西。 它实际上只是几乎所有基于ResNet的现代架构的基础。
笔记本电脑被称为[暗网,](https://pjreddie.com/darknet/)因为我们要看的特定架构非常接近暗网架构。 但是你会在整个过程中看到暗网结构不是整个YOLO v3端到端的东西,而只是它们在ImageNet上预训练过来进行分类的部分。 它几乎就像你能想到的最通用的简单架构,所以它是实验的一个非常好的起点。 因此我们将其称为“暗网”,但它并不是那样,你可以摆弄它来创造绝对不是暗网的东西。 它实际上只是几乎所有基于ResNet的现代架构的基础。
CIFAR10是一个相当小的数据集 [[8:06](https://youtu.be/ondivPiwQho%3Ft%3D8m6s)] 。 图像大小只有32 x 32,这是一个很好的数据集,因为:
......@@ -280,7 +280,7 @@ GAN的基本思想是它是一个生成模型 [[51:23](https://youtu.be/ondivPiw
我们要做的第一件事就是建立一个鉴别者 [[57:47](https://youtu.be/ondivPiwQho%3Ft%3D57m47s)] 。 鉴别器将接收图像作为输入,并且它将输出一个数字。 如果它认为这个图像是真实的,那么该数字应该更低。 当然,“它为较低数量做了什么”的事情并没有出现在架构中,而是出现在损失函数中。 因此,我们所要做的就是创建一个带图像并输出数字的东西。 很多这些代码都是从本文的原始作者那里借来的,因此一些命名方案与我们习惯的方法不同。 但它看起来与我们以前的相似。 我们从卷积开始(conv,ReLU,批量规范)。 然后我们有一堆额外的转换层 - 这不会使用残差,所以它看起来非常类似于一堆额外的层之前,但这些将是转换层而不是res层。 最后,我们需要追加足够的步幅2转换层,我们将网格尺寸减小到不大于4x4。 所以它将继续使用步幅2,将大小除以2,并重复直到我们的网格大小不大于4.这是一种很好的方法,可以在网络中创建任意数量的层来处理任意大小的图像和将它们转换为固定的已知网格大小。
**问题** :GAN是否需要比狗与猫或NLP更多的数据? 或者它是否可比 [[59:48](https://youtu.be/ondivPiwQho%3Ft%3D59m48s)] ? 老实说,我有点不好意思说我不是GAN的专家。 我在第一部分讲的内容是我很乐意说的事情,我知道做这些事情的最好方法,所以我可以向你展示最先进的结果,就像我们在CIFAR10的帮助下做的一样学生们。 GANs我根本不在那里,所以我不太确定你需要多少。 一般来说,它似乎需要相当多但是记住我们在狗和猫中不需要太多的唯一原因是因为我们有一个预先训练过的模型,我们可以利用预先训练过的GAN模型并对它们进行微调,可能。 据我所知,我认为没有人这么做过。 这对于人们思考和实验来说可能是非常有趣的事情。 也许人们已经做到了,有些文献我们没有遇到过。 我对GAN中的主要文献有点熟悉,但我不知道所有这些,所以也许我错过了关于GAN中转学的一些内容。 但这不是需要太多数据的诀窍。
**问题** :GAN是否需要比狗与猫或NLP更多的数据? 或者它是否可比 [[59:48](https://youtu.be/ondivPiwQho%3Ft%3D59m48s)] ? 老实说,我有点不好意思说我不是GAN的专家。 我在第一部分讲的内容是我很乐意说的事情,我知道做这些事情的最好方法,所以我可以向你展示最先进的结果,就像我们在CIFAR10的帮助下做的一样学生们。 GANs我根本不在那里,所以我不太确定你需要多少。 一般来说,它似乎需要相当多但是记住我们在狗和猫中不需要太多的唯一原因是因为我们有一个预训练过的模型,我们可以利用预训练过的GAN模型并对它们进行微调,可能。 据我所知,我认为没有人这么做过。 这对于人们思考和实验来说可能是非常有趣的事情。 也许人们已经做到了,有些文献我们没有遇到过。 我对GAN中的主要文献有点熟悉,但我不知道所有这些,所以也许我错过了关于GAN中转学的一些内容。 但这不是需要太多数据的诀窍。
**问** :那么巨大的加速结合了一个周期学习率和动量退火加上八个GPU并行训练的半精度? 是否只能用消费者GPU进行半精度计算? 另一个问题是,为什么计算从单精度到半精度的速度提高了8倍,而从单精度加倍只有2倍 [[1:01:09](https://youtu.be/ondivPiwQho%3Ft%3D1h1m9s)] ? 好的,所以CIFAR10结果,从单一到一半的速度不是8倍。 它从单一到一半快2到3倍。 NVIDIA声称张量核的触发器表现在学术上是正确的,但实际上没有意义,因为它实际上取决于你需要什么样的电话 - 所以大约有2或3倍的改进。 所以半精度有点帮助,额外的GPU有点帮助,一个循环有助于大量,然后另一个关键部分是玩我告诉你的参数。 因此,仔细阅读广泛的ResNet论文,确定他们在那里找到的东西,然后编写你刚看到的架构版本,这使我们很容易摆弄参数,熬夜尝试各种可能的组合不同内核大小,内核数量,层组数量,层组大小。 请记住,我们确实存在瓶颈,但实际上我们倾向于将注意力集中在扩大上,因此我们增加了尺寸然后减小它,因为它更好地利用了GPU。 所有这些事情结合在一起,我会说一个周期可能是最关键的,但每个周期都会导致大幅加速。 这就是为什么我们能够比最先进的CIFAR10获得30倍的改进。 我们对其他事情有一些想法 - 在这个DAWN工作台完成之后,也许我们会尝试进一步看看我们是否能在一天内击败一分钟。 那会很有趣。
......
......@@ -779,7 +779,7 @@ x = val_tfms.denorm(np.rollaxis(to_np(opt_img_v.data),1,4))[0] plt
**问题**:两个问题 - 早些时候有一些人对你对Pyro和概率编程的想法表示了兴趣 [[2:02:34](https://youtu.be/xXXiC4YRGrQ%3Ft%3D2h2m34s)]。所以TensorFlow现在已经获得了TensorFlow的概率。那里有一堆概率编程框架。我认为它们很吸引人,但是从某种意义上来说还没有得到证实,我没有看到任何概率编程系统所做的任何事情,没有它们就没有做得更好。基本前提是它允许你创建更多关于你如何思考世界的模型,然后插入参数。所以,当我20年前从事管理咨询工作时,我们曾经做过很多工作,我们会使用电子表格,然后我们会有这些蒙特卡罗模拟插件 - 有一个叫做风险(?)和一个叫水晶球。几十年后我不知道它们是否仍然存在。基本上他们会让你更改一个电子表格单元格,说这不是一个特定的值,但它实际上代表了这个均值和标准差的值的分布,或者它得到了这个分布,然后你会点击一个按钮,电子表格会重新计算千万次从这些发行版中提取随机数,并向你显示你的结果的分布,可能是利润或市场份额或其他。我们一直都在使用它们。显然觉得电子表格是做这种工作的一个更明显的地方,因为你可以更自然地看到它,但我不知道。走着瞧。在这个阶段,我希望它变得有用,因为我发现它非常有吸引力,并且它吸引我说我曾经做过很多的工作。那里'实际上围绕这些东西的整个实践,他们曾经称之为系统动力学,它真的建立在这种东西之上,但它并没有完全消失。
**问题**:然后有一个关于通用风格转移的预训练的问题 [[2:04:57](https://youtu.be/xXXiC4YRGrQ%3Ft%3D2h4m57s)] 。我不认为你可以预先训练一般的风格,但你可以预先训练一张特定风格的通用照片,这是我们要去的地方。虽然,它可能最终成为一个功课。我还没有决定。但是我要做所有的事情。
**问题**:然后有一个关于通用风格转移的预训练的问题 [[2:04:57](https://youtu.be/xXXiC4YRGrQ%3Ft%3D2h4m57s)] 。我不认为你可以预训练一般的风格,但你可以预训练一张特定风格的通用照片,这是我们要去的地方。虽然,它可能最终成为一个功课。我还没有决定。但是我要做所有的事情。
**问**:请让他谈谈多GPU [[2:05:31](https://youtu.be/xXXiC4YRGrQ%3Ft%3D2h5m31s)] 。哦,是的,我没有关于那个幻灯片。我们即将打到它。
......
......@@ -1264,7 +1264,7 @@ flatten_channel = Lambda(lambda x:x [:,0])
simple_up = nn.Sequential( nn.ReLU(), StdUpsample(512,256), StdUpsample(256,256), StdUpsample(256,256), StdUpsample(256,256), nn.ConvTranspose2d(256, 1, 2, stride=2), flatten_channel )
```
鉴于我们想要了解汽车的外观,我们可能希望从预训练好的ImageNet网络开始。所以我们将从ResNet34开始。有了`ConvnetBuilder`,我们可以抓住我们的ResNet34,我们可以添加一个自定义头。自定义头部将会出现多次上升,我们现在要做的事情真的很愚蠢,我们只是要做一个ConvTranspose2d,批量规范,ReLU。
鉴于我们想要了解汽车的外观,我们可能希望从预训练好的ImageNet网络开始。所以我们将从ResNet34开始。有了`ConvnetBuilder`,我们可以抓住我们的ResNet34,我们可以添加一个自定义头。自定义头部将会出现多次上升,我们现在要做的事情真的很愚蠢,我们只是要做一个ConvTranspose2d,批量规范,ReLU。
这就是我所说的 - 你们中的任何一个人都可以在没有查看任何笔记本的情况下构建它,或者至少你有以前课程的信息。根本没有新的东西。所以在最后,我们有一个过滤器。现在,这将给我们一些批量大小为1乘128乘128的东西。但我们想要的是批量大小为128乘128的东西。所以我们必须删除那个单位轴,所以我在这里有一个lambda层。 Lambda层非常有用,因为这里没有lambda层,只是通过将其索引为0而没有lambda层来删除单位轴,我必须创建一个带有自定义forward方法的自定义类,依此类推。但是通过创建一个执行一个自定义位的lambda层,我现在可以将它放入Sequential中,这样可以让生活更轻松。
......@@ -1340,7 +1340,7 @@ PyTorch人对这种方法很有说服力。Lambda层实际上是fastai库的一
![](../img/1_cp-SvDXQPGdN6k-8JL2CMw.png)
让我们解开,因为到目前为止我们所做的一切都是培养定制头。 让我们做更多。
让我们解开,因为到目前为止我们所做的一切都是训练定制头。 让我们做更多。
```
learn.unfreeze()
......@@ -1640,7 +1640,7 @@ PyTorch人对这种方法很有说服力。Lambda层实际上是fastai库的一
[笔记本](https://github.com/fastai/fastai/blob/master/courses/dl2/carvana-unet.ipynb) / [](https://arxiv.org/abs/1505.04597)
U-Net网络非常壮观。 使用之前的方法,我们预训练好的ImageNet网络一直被压缩到7x7,然后一直扩展到224x224(1024被压缩到比7x7大得多)。 然后再次扩展所有这些意味着它必须以某种方式存储关于小版本中更大版本的所有信息。 实际上,关于更大版本的大部分信息都是在原始图片中。 所以这似乎不是一个很好的方法 - 这种压扁和不会压扁。
U-Net网络非常壮观。 使用之前的方法,我们预训练好的ImageNet网络一直被压缩到7x7,然后一直扩展到224x224(1024被压缩到比7x7大得多)。 然后再次扩展所有这些意味着它必须以某种方式存储关于小版本中更大版本的所有信息。 实际上,关于更大版本的大部分信息都是在原始图片中。 所以这似乎不是一个很好的方法 - 这种压扁和不会压扁。
![](../img/1_PvXW__XxRQIMoFoVFJq-Zw.png)
......@@ -1842,7 +1842,7 @@ TRAIN_DN = 'train' MASKS_DN = 'train_masks_png' sz = 128 bs = 64 nw = 16
让我们试试U-Net吧。 我称之为U-net(ish),因为按照惯例,我正在创建我自己的有点hacky版本 - 尝试保持与你习惯的类似的东西,并做我觉得有意义的事情。 所以你应该有足够的机会通过查看确切的网格大小来至少使这个更真实的U-net,并看看这里(左上方的转换)大小是如何下降的。 所以他们显然没有添加任何填充,然后有一些裁剪正在进行 - 有一些差异。 但有一件事是因为我想利用转移学习 - 这意味着我不能完全使用U-Net。
所以这是另一个重要的机会,如果你创建U-Net下行路径然后在末尾添加分类器然后在ImageNet上训练它。 你现在已经拥有了ImageNet训练分类器,专门设计为U-Net的良好骨干。 那么你现在应该能够回来并且非常接近赢得这场旧比赛(实际上并不是那么久 - 这是最近的比赛)。 因为之前没有预先训练好的网络。 但是如果你想想YOLO v3做了什么,基本上就是这样。 他们创建了一个DarkNet,他们在ImageNet上预先训练了它,然后他们用它作为边框的基础。 同样,这种预先训练的想法不仅仅是为了分类而是为其他事物而设计 - 这只是没有人做过的事情。 但正如我们所展示的那样,你现在可以在三小时内以25美元的价格训练ImageNet。 如果社区中的人有兴趣这样做,希望我能得到你可以帮助你的学分,所以如果你这样做,设置它的工作并给我一个脚本,我可以为你运行它。 但就目前而言,我们还没有。 所以我们将使用ResNet。
所以这是另一个重要的机会,如果你创建U-Net下行路径然后在末尾添加分类器然后在ImageNet上训练它。 你现在已经拥有了ImageNet训练分类器,专门设计为U-Net的良好骨干。 那么你现在应该能够回来并且非常接近赢得这场旧比赛(实际上并不是那么久 - 这是最近的比赛)。 因为之前没有预训练好的网络。 但是如果你想想YOLO v3做了什么,基本上就是这样。 他们创建了一个DarkNet,他们在ImageNet上预训练了它,然后他们用它作为边框的基础。 同样,这种预训练的想法不仅仅是为了分类而是为其他事物而设计 - 这只是没有人做过的事情。 但正如我们所展示的那样,你现在可以在三小时内以25美元的价格训练ImageNet。 如果社区中的人有兴趣这样做,希望我能得到你可以帮助你的学分,所以如果你这样做,设置它的工作并给我一个脚本,我可以为你运行它。 但就目前而言,我们还没有。 所以我们将使用ResNet。
```
**class** **SaveFeatures** (): features= **None** **def** __init__(self, m): self.hook = m.register_forward_hook(self.hook_fn) **def** hook_fn(self, module, input, output): self.features = output **def** remove(self): self.hook.remove()
......
......@@ -100,7 +100,7 @@ learn.fit(1e-2, 1)
[ 2. 0.02189 0.0196 0.99316]
```
* 坏消息是准确没有提高。 训练损失正在减少,但验证损失不是,但我们并没有过拟合。 当训练损失远低于验证损失时,才是过拟合。 换句话说,当你的模型在训练集上做得比在验证集上做得好得多时,这意味着你的模型泛化性较差。
* 坏消息是准确没有提高。 训练损失正在减少,但验证损失不是,但我们并没有过拟合。 当训练损失远低于验证损失时,才是过拟合。 换句话说,当你的模型在训练集上做得比在验证集上做得好得多时,这意味着你的模型泛化性较差。
* `cycle_len=1` [[30:17](https://youtu.be/JNxcznsrRb8%3Ft%3D30m17s)] :这样可以**通过重启(SGDR)**实现**随机梯度下降** 。 基本的想法是,当你以最小的损失越来越接近现场时,你可能想要开始降低学习率(采取较小的步骤),以便到达正确的位置。
* 在训练时降低学习率的想法称为**学习率退火** ,这是非常常见的。 最常见和“hacky”的方法是在一段时间内训练具有一定学习速度的模型,当它停止改进时,手动降低学习率(逐步退火)。
* 一个更好的方法就是选择某种功能形式 - 结果是真正好的功能形式是cosign曲线的一半,它在开始时保持一段时间的高学习率,然后当迭代次数增多时迅速下降。
......@@ -141,7 +141,7 @@ learn.fit(1e-2, 1)
## 微调和差分学习率 [[43:49](https://youtu.be/JNxcznsrRb8%3Ft%3D43m49s)]
* 到目前为止,我们没有重新训练任何预先训练的特征 - 特别是卷积内核中的任何权重。 我们所做的就是在顶部添加了一些新层,并学习如何混合和匹配预先训练的功能。
* 到目前为止,我们没有重新训练任何预训练的特征 - 特别是卷积内核中的任何权重。 我们所做的就是在顶部添加了一些新层,并学习如何混合和匹配预训练的功能。
* 卫星图像,CT扫描等图像具有完全不同的特征(与ImageNet图像相比),因此你需要重新训练多个层。
* 对于狗和猫,图像类似于模型预训练的图像,但我们仍然可能发现稍微调整一些后面的层是有帮助的。
* 以下是告诉学习器我们想要开始实际更改卷积过滤器的方法:
......@@ -537,7 +537,7 @@ label_df.pivot_table(index='breed', aggfunc=len).sort_values('id', ascending=Fal
**问题**`precompute=True``unfreeze`之间的区别?
* 我们从一个预训练好的网络开始
* 我们从一个预训练好的网络开始
* 我们在它的末尾添加了几层,随机开始。 一切都冻结了, `precompute=True` ,我们所学的就是我们添加的层。
* 使用`precompute=True` ,数据增强不会执行任何操作,因为我们每次都显示完全相同的激活。
* 然后我们设置`precompute=False` ,这意味着我们仍然只训练我们添加的层,因为它被冻结但数据增强现在正在工作,因为它实际上正在通过并从头开始重新计算所有激活。
......@@ -594,7 +594,7 @@ label_df.pivot_table(index='breed', aggfunc=len).sort_values('id', ascending=Fal
* `transforms_top_down` - 由于它们是卫星图像,因此它们在垂直翻转时仍然有意义。
* 更高的学习率 - 与此特定数据集有关
* `lrs = np.array([lr/9,lr/3,lr])` - 差异学习率现在变化3倍,因为图像与ImageNet图像完全不同
* `sz=64` - 这有助于避免过拟合卫星图像,但他不会那样做``dogs. vs. cats````dog breed``(与ImageNet相似的图像),64*64非常小,可能会破坏预训练过的权重。
* `sz=64` - 这有助于避免过拟合卫星图像,但他不会那样做``dogs. vs. cats````dog breed``(与ImageNet相似的图像),64*64非常小,可能会破坏预训练过的权重。
## 如何获得你的AWS设置 [[01:58:54](https://youtu.be/JNxcznsrRb8%3Ft%3D1h58m54s)]
......
......@@ -311,7 +311,7 @@ for layer in model.layers[split_at:]:
* 注意:在最大池层之后,你可以执行许多操作。 其中一个是在整个大小上做另一个最大池。 在旧架构或结构化数据中,我们使用全连接层。 大量使用全连接层的架构容易过拟合而且速度较慢。 ResNet和ResNext不使用非常大的完全连接层。
**问题** :如果输入有3个通道会发生什么? [[1:05:30](https://youtu.be/9C06ZPF8Uuc%3Ft%3D1h5m30s)]
它看起来类似于具有2个通道的Conv1层 - 因此,滤波器每个滤波器有2个通道。 预训练的ImageNet模型使用3个通道。 当你有少于3个频道时,你可以复制其中一个频道使其成为3,或者如果你有2,则获得平均值并将其视为第三个频道。 如果你有4个通道,你可以用全部为0的卷积内核添加额外的通道。
它看起来类似于具有2个通道的Conv1层 - 因此,滤波器每个滤波器有2个通道。 预训练的ImageNet模型使用3个通道。 当你有少于3个频道时,你可以复制其中一个频道使其成为3,或者如果你有2,则获得平均值并将其视为第三个频道。 如果你有4个通道,你可以用全部为0的卷积内核添加额外的通道。
### 接下来发生什么? [[1:08:47](https://youtu.be/9C06ZPF8Uuc%3Ft%3D1h8m47s)]
......@@ -448,7 +448,7 @@ Softmax不喜欢预测多个事物。 它只想做单一选择。
data = data.resize(int(sz*1.3), 'tmp')
```
* 我们不会将`sz=64`用于猫狗比赛,因为我们开始使用经过预训练的ImageNet网络,这种网络几乎完美无缺。 如果我们用64x64的图像重新训练整个集合,我们就会破坏已经非常好的权重。 请记住,大多数ImageNet模型都使用224 x 224或299 x 299图像进行训练。
* 我们不会将`sz=64`用于猫狗比赛,因为我们开始使用经过预训练的ImageNet网络,这种网络几乎完美无缺。 如果我们用64x64的图像重新训练整个集合,我们就会破坏已经非常好的权重。 请记住,大多数ImageNet模型都使用224 x 224或299 x 299图像进行训练。
* ImageNet中没有与上面相似的图像。 只有前几层对我们有用。 因此,在这种情况下,从较小的图像开始效果很好。
```py
......@@ -610,7 +610,7 @@ Softmax不喜欢预测多个事物。 它只想做单一选择。
![](../img/1_2Ocl12SOFKZ75iV4bqg-OQ.png)
你可以跳过最后一层的训练,直接使用不同的学习率,但你可能不想这样做。 卷积层都包含预训练的权重,因此它们不是随机的 - 对于接近ImageNet的东西,它们确实很好; 对于那些与ImageNet不相近的东西,它们总比没有好。 然而,我们所有全连接层都是完全随机的。 因此,你总是希望通过先训练它们来使完全连接的权重优于随机。 否则,如果你直接解冻,那么当你后来的那些仍然是随机的时候,你实际上是要摆弄那些早期的层权重 - 这可能不是你想要的。
你可以跳过最后一层的训练,直接使用不同的学习率,但你可能不想这样做。 卷积层都包含预训练的权重,因此它们不是随机的 - 对于接近ImageNet的东西,它们确实很好; 对于那些与ImageNet不相近的东西,它们总比没有好。 然而,我们所有全连接层都是完全随机的。 因此,你总是希望通过先训练它们来使完全连接的权重优于随机。 否则,如果你直接解冻,那么当你后来的那些仍然是随机的时候,你实际上是要摆弄那些早期的层权重 - 这可能不是你想要的。
问题:当你使用差异学习率时,这三种学习率是否在各层之间均匀分布? [[01:55:35](https://youtu.be/9C06ZPF8Uuc%3Ft%3D1h55m35s)] 我们将在后面的课程中详细讨论这个问题,但是fast.ai库中有一个“层组”的概念。 在类似ResNet50的东西中,有数百个层,你可能不想写出数百个学习率,因此库决定如何拆分它们,最后一个总是指我们随机初始化的全连接层并补充说。
......
......@@ -70,7 +70,7 @@ Sequential(
这对于进行现代深度学习工作以及解决泛化问题至关重要。 Geoffrey Hinton和他的同事们提出了这个想法,这个想法受到大脑工作方式的启发。
* `p=0.01`将丢弃1%的激活。 它根本不会改变任何东西,也不会阻止过拟合(不是一般化)。
* `p=0.99`将抛弃99%的激活。 不会过度适应并且非常适合概括,但会破坏你的准确
* `p=0.99`将抛弃99%的激活。 不会过度适应并且非常适合概括,但会破坏你的准确
* 默认情况下,第一层为`0.25` ,第二层为`0.5` [17:54]。 如果你发现它过拟合,就开始碰撞它 - 尝试将全部设置为`0.5` ,仍然过拟合,尝试`0.7`等。如果你不合适,你可以尝试降低它,但你不太可能需要降低它。
* ResNet34具有较少的参数,因此它不会过度匹配,但对于像ResNet50这样的更大的架构,你通常需要增加丢失。
......@@ -132,7 +132,7 @@ Sequential(
* 如果有疑问,请为每个全连接层使用相同的压差。
* 通常人们只会在最后一个线性层上投入 Dropout 。
**问题** :为什么要监控损失而不是准确[[23:53](https://youtu.be/gbceqO8PpBg%3Ft%3D23m53s)] 损失是我们唯一可以看到的验证集和训练集。 正如我们后来所了解的那样,损失是我们实际上正在优化的事情,因此更容易监控和理解这意味着什么。
**问题** :为什么要监控损失而不是准确[[23:53](https://youtu.be/gbceqO8PpBg%3Ft%3D23m53s)] 损失是我们唯一可以看到的验证集和训练集。 正如我们后来所了解的那样,损失是我们实际上正在优化的事情,因此更容易监控和理解这意味着什么。
**问题** :我们是否需要在添加 Dropout 后调整学习率? [[24:33](https://youtu.be/gbceqO8PpBg%3Ft%3D24m33s)] 它似乎不足以影响学习率。 理论上,它可能但不足以影响我们。
......@@ -492,7 +492,7 @@ Sequential(
...a new approach to the analysis of wireless networks <eos>
```
语言模型可以非常深刻和微妙,所以我们将尝试构建它 - 不是因为我们关心这一点,而是因为我们正在尝试创建一个用于执行其他任务的预训练模型。 例如,鉴于IMDB电影评论,我们将确定它们是正面还是负面。 这很像猫与狗 - 分类问题。 所以我们真的想使用预训练好的网络,至少知道如何阅读英语。 因此,我们将训练一个模型来预测句子的下一个单词(即语言模型),就像在计算机视觉中一样,在最后粘贴一些新的层并要求它预测某些东西是正面的还是负面的。
语言模型可以非常深刻和微妙,所以我们将尝试构建它 - 不是因为我们关心这一点,而是因为我们正在尝试创建一个用于执行其他任务的预训练模型。 例如,鉴于IMDB电影评论,我们将确定它们是正面还是负面。 这很像猫与狗 - 分类问题。 所以我们真的想使用预训练好的网络,至少知道如何阅读英语。 因此,我们将训练一个模型来预测句子的下一个单词(即语言模型),就像在计算机视觉中一样,在最后粘贴一些新的层并要求它预测某些东西是正面的还是负面的。
### IMDB [[1:31:11](https://youtu.be/gbceqO8PpBg?t=1h31m11s)]
......@@ -500,7 +500,7 @@ Sequential(
我们要做的是训练语言模型,使其成为分类模型的预训练模型。 换句话说,我们正在努力充分利用我们在计算机视觉中学到的知识,即如何进行微调以创建强大的分类模型。
**问题** :为什么直接做你想做的不行? [[01:31:34](https://youtu.be/gbceqO8PpBg?t=1h31m34s)] 事实证明它不是凭经验。 有几个原因。 首先,我们知道对预训练好的网络进行微调非常强大。 因此,如果我们首先可以让它学习一些相关的任务,那么我们可以使用所有这些信息来尝试并帮助它完成第二项任务。 另一个是IMDB电影评论长达数千字。 因此,在阅读了几千个单词后,对英语的结构或单词或标点符号的概念一无所知,所得到的只是1或0(正面或负面)。 试图学习整个英语结构,然后从一个数字表达积极和消极的情绪,这太过于期待了。
**问题** :为什么直接做你想做的不行? [[01:31:34](https://youtu.be/gbceqO8PpBg?t=1h31m34s)] 事实证明它不是凭经验。 有几个原因。 首先,我们知道对预训练好的网络进行微调非常强大。 因此,如果我们首先可以让它学习一些相关的任务,那么我们可以使用所有这些信息来尝试并帮助它完成第二项任务。 另一个是IMDB电影评论长达数千字。 因此,在阅读了几千个单词后,对英语的结构或单词或标点符号的概念一无所知,所得到的只是1或0(正面或负面)。 试图学习整个英语结构,然后从一个数字表达积极和消极的情绪,这太过于期待了。
**问题** :这与卡尔帕西的Char-RNN相似吗? [[01:33:09](https://youtu.be/gbceqO8PpBg?t=1h33m9s)] 这有点类似于Char-RNN,它预测下一个字母给出了许多以前的字母。 语言模型通常在单词级别工作(但他们没有必要),我们将在本课程中专注于单词级别建模。
......@@ -724,7 +724,7 @@ Fast.ai使用由Stephen Merity开发的最先进的[AWD LSTM语言模型](https:
* `learner.clip=0.3` :当你查看你的梯度并将它们乘以学习率来决定更新你的权重多少时,这将不允许它们超过0.3。 这是一个很酷的小技巧,可以防止我们采取太大的措施。
* 现在细节并不重要,所以你可以按原样使用它们。
**问题** :Word2vec或GloVe中存在单词嵌入。 它们与此有何不同? 为什么不用那些初始化权重? [[02:02:29](https://youtu.be/gbceqO8PpBg?t=2h2m29s)] 人们在进行各种其他任务之前已经预先训练了这些嵌入矩阵。 它们不称为预训练模型; 它们只是一个预先训练好的嵌入矩阵,你可以下载它们。 没有理由我们无法下载它们。 我发现以这种方式构建一个完整的预训练模型似乎并没有从使用预训练的单词向量中获益多少; 使用整个预训练语言模型的其他地方产生了更大的差异。 也许我们可以将两者结合起来,使它们更好一些。
**问题** :Word2vec或GloVe中存在单词嵌入。 它们与此有何不同? 为什么不用那些初始化权重? [[02:02:29](https://youtu.be/gbceqO8PpBg?t=2h2m29s)] 人们在进行各种其他任务之前已经预训练了这些嵌入矩阵。 它们不称为预训练模型; 它们只是一个预训练好的嵌入矩阵,你可以下载它们。 没有理由我们无法下载它们。 我发现以这种方式构建一个完整的预训练模型似乎并没有从使用预训练的单词向量中获益多少; 使用整个预训练语言模型的其他地方产生了更大的差异。 也许我们可以将两者结合起来,使它们更好一些。
**问题:**模型的架构是什么? [[02:03:55](https://youtu.be/gbceqO8PpBg?t=2h3m55s)] 我们将在[上一课](https://youtu.be/gbceqO8PpBg?t=2h3m55s)中学习模型架构,但目前,它是一个使用LSTM(长期短期记忆)的反复神经网络。
......@@ -764,7 +764,7 @@ Fast.ai使用由Stephen Merity开发的最先进的[AWD LSTM语言模型](https:
learner.load_encoder('adam3_20_enc')
```
语言建模的准确通常使用度量_复杂_度来度量,这只是我们使用的损失函数的`exp()`
语言建模的准确通常使用度量_复杂_度来度量,这只是我们使用的损失函数的`exp()`
```
math.exp(4.165)
......@@ -826,9 +826,9 @@ Fast.ai使用由Stephen Merity开发的最先进的[AWD LSTM语言模型](https:
### 情绪 [[02:05:09](https://youtu.be/gbceqO8PpBg?t=2h5m9s)]
所以我们预训练了一种语言模型,现在我们想对其进行微调以进行情感分类。
所以我们预训练了一种语言模型,现在我们想对其进行微调以进行情感分类。
要使用预训练的模型,我们需要从语言模型中保存的词汇,因为我们需要确保相同的单词映射到相同的ID。
要使用预训练的模型,我们需要从语言模型中保存的词汇,因为我们需要确保相同的单词映射到相同的ID。
```
TEXT = pickle.load(open(f' **{PATH}** models/TEXT.pkl','rb'))
......@@ -898,7 +898,7 @@ fastai可以直接从torchtext `splits`创建`ModelData`对象。
_[ 0\. 0.29202 0.19023 0.92768]_
```
我们确保冻结最后一层以外的所有层。 然后我们训练一下,解冻它,训练一下。 好的一点是,一旦你有一个预训练好的语言模型,它实际上训练得非常快。
我们确保冻结最后一层以外的所有层。 然后我们训练一下,解冻它,训练一下。 好的一点是,一旦你有一个预训练好的语言模型,它实际上训练得非常快。
```
m3.fit(lrs, 7, metrics=[accuracy], cycle_len=2, cycle_save_name='imdb2')
......@@ -929,8 +929,8 @@ Bradbury等人最近的一篇论文, [学习翻译:语境化词汇向量](ht
有很多机会可以进一步改善这一点,尽管我们无法在本课程的第2部分之前找到它们。
* 例如,我们可以开始训练查看大量医学期刊的语言模型,然后我们可以制作一个可下载的医学语言模型,然后任何人都可以使用它来微调医学文献的前列腺癌子集。
* 我们还可以将它与预训练的单词向量相结合
* 我们可以预训练一个维基百科语料库语言模型,然后将其微调成IMDB语言模型,然后将其微调成IMDB情绪分析模型,我们会得到比这更好的东西。
* 我们还可以将它与预训练的单词向量相结合
* 我们可以预训练一个维基百科语料库语言模型,然后将其微调成IMDB语言模型,然后将其微调成IMDB情绪分析模型,我们会得到比这更好的东西。
有一位名叫塞巴斯蒂安·鲁德(Sebastian Ruder)的非常出色的研究员,他是唯一一位真正在NLP中进行预训练,微调和转学习的NLP研究员。 Jeremy问他为什么这不会发生更多,他的观点是因为没有软件可以让它变得简单。 希望Fast.ai会改变这一点。
......
此差异已折叠。
......@@ -529,7 +529,7 @@ Matplotlib之所以如此命名是因为它最初是Matlab绘图库的克隆。
![](../img/1_CbjuSpn8ZnX6SMLNiBzoag.png)
如你所见,已经对输入做了大量事情,以便将其传递给预训练的模型。 因此我们有一个名为`denorm` for denormalize的函数,并且还修复了维度顺序等等。因为非规范化取决于变换 [[1:37:52](https://youtu.be/Z0ssNAbe81M%3Ft%3D1h37m52s)] ,并且数据集知道使用什么变换来创建它,所以这就是你必须要做的事情`md.val_ds.denorm`并将其转换为numpy数组后传递小批量:
如你所见,已经对输入做了大量事情,以便将其传递给预训练的模型。 因此我们有一个名为`denorm` for denormalize的函数,并且还修复了维度顺序等等。因为非规范化取决于变换 [[1:37:52](https://youtu.be/Z0ssNAbe81M%3Ft%3D1h37m52s)] ,并且数据集知道使用什么变换来创建它,所以这就是你必须要做的事情`md.val_ds.denorm`并将其转换为numpy数组后传递小批量:
```
show_img(md.val_ds.denorm(to_np(x))[0]);
......
......@@ -279,7 +279,7 @@ _分类器_是具有因变量的任何分类或二项式。 与_回归_相反,
检测精度低至80,与以前相同。 这并不奇怪,因为ResNet旨在进行分类,因此我们不希望以这种简单的方式改进事物。 它当然不是为了进行边框回归而设计的。 它显然实际上是以不关心几何的方式设计的 - 它需要最后7到7个激活网格并将它们平均放在一起扔掉所有关于来自何处的信息。
有趣的是,当我们同时进行准确(分类)和边框时,L1似乎比我们刚进行边框回归时要好一些 [[22:46](https://youtu.be/0frKXR-2PBY%3Ft%3D22m46s)] 。 如果这对你来说是违反直觉的,那么这将是本课后要考虑的主要事项之一,因为这是一个非常重要的想法。 这个想法是这样的 - 弄清楚图像中的主要对象是什么,是一种困难的部分。 然后确定边框的确切位置以及它的类别是一个简单的部分。 所以当你有一个网络既说对象是什么,对象在哪里时,它就会分享关于找到对象的所有计算。 所有共享计算都非常有效。 当我们返回传播类和地方中的错误时,这就是有助于计算找到最大对象的所有信息。 因此,只要你有多个任务分享这些任务完成工作所需要的概念,他们很可能应该至少共享网络的某些层。 今天晚些时候,我们将看一个模型,其中除了最后一层之外,大多数层都是共享的。
有趣的是,当我们同时进行准确(分类)和边框时,L1似乎比我们刚进行边框回归时要好一些 [[22:46](https://youtu.be/0frKXR-2PBY%3Ft%3D22m46s)] 。 如果这对你来说是违反直觉的,那么这将是本课后要考虑的主要事项之一,因为这是一个非常重要的想法。 这个想法是这样的 - 弄清楚图像中的主要对象是什么,是一种困难的部分。 然后确定边框的确切位置以及它的类别是一个简单的部分。 所以当你有一个网络既说对象是什么,对象在哪里时,它就会分享关于找到对象的所有计算。 所有共享计算都非常有效。 当我们返回传播类和地方中的错误时,这就是有助于计算找到最大对象的所有信息。 因此,只要你有多个任务分享这些任务完成工作所需要的概念,他们很可能应该至少共享网络的某些层。 今天晚些时候,我们将看一个模型,其中除了最后一层之外,大多数层都是共享的。
结果如下 [[24:34](https://youtu.be/0frKXR-2PBY%3Ft%3D24m34s)] 。 和以前一样,当图像中有单个主要对象时,它做得很好。
......@@ -341,7 +341,7 @@ _分类器_是具有因变量的任何分类或二项式。 与_回归_相反,
其中一名学生指出,通过使用Pandas,我们可以比使用`collections.defaultdict`更简单,并分享[这个要点](https://gist.github.com/binga/1bc4ebe5e41f670f5954d2ffa9d6c0ed) 。 你越了解熊猫,你越经常意识到它是解决许多不同问题的好方法。
**问题** :当你在较小的模型上逐步构建时,是否将它们重新用作预先训练过的权重? 或者你把它扔掉然后从头开始重新训练 [[27:11](https://youtu.be/0frKXR-2PBY%3Ft%3D27m11s)] ? 当Jeremy在他这样做时想出东西时,他通常会倾向于扔掉,因为重复使用预先训练过的砝码会带来不必要的复杂性。 然而,如果他试图达到他可以在真正大的图像上进行训练的程度,他通常会从更小的角度开始,并且经常重新使用这些权重。
**问题** :当你在较小的模型上逐步构建时,是否将它们重新用作预训练过的权重? 或者你把它扔掉然后从头开始重新训练 [[27:11](https://youtu.be/0frKXR-2PBY%3Ft%3D27m11s)] ? 当Jeremy在他这样做时想出东西时,他通常会倾向于扔掉,因为重复使用预训练过的砝码会带来不必要的复杂性。 然而,如果他试图达到他可以在真正大的图像上进行训练的程度,他通常会从更小的角度开始,并且经常重新使用这些权重。
```
f_model=resnet34 sz=224 bs=64
......@@ -1071,7 +1071,7 @@ Jeremy读取**匹配策略**和**训练目标** (又名损失函数) [[2:01:
[使用深度神经网络的可扩展对象检测](https://arxiv.org/pdf/1312.2249.pdf)
*培养目标”是损失函数
*训练目标”是损失函数
* 双条和两个2是这样的意思是均方误差
![](../img/1_LubBtX9ODFMBgI34bFHtdw.png)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册