提交 ba38733b 编写于 作者: W wizardforcel

library => 库

上级 5c9bf80d
......@@ -893,7 +893,7 @@ Jeremy:“你还不能写一篇关于这个的论文,因为你必须做类
塞巴斯蒂安:“好吧,如果我写完所有的论文并完成你所有的消融研究,我们可以写论文吗?”
杰里米:“好吧,它就像一个我没有记录的整个图书馆,我还没有去,你不知道它是如何运作的”
杰里米:“好吧,它就像一个我没有记录的整个,我还没有去,你不知道它是如何运作的”
塞巴斯蒂安:“好吧,如果我写论文,进行消融研究,并从头开始弄清楚代码是如何工作而不打扰你的,那么我们可以写论文吗?”
......
......@@ -6,7 +6,7 @@
### 开始之前:
* Sylvain Gugger的1循环[政策](https://sgugger.github.io/the-1cycle-policy.html) 。 基于Leslie Smith的新论文,该论文采用了前两篇关键论文(循环学习率和超级收敛),并在其基础上进行了大量实验,以展示如何实现超收敛。 超级收敛使你可以比以前的逐步方法快五倍地训练模型(并且比CLR快,尽管它不到五次)。 超级融合让你可以在1到3之间达到高学习率。超融合的有趣之处在于,你可以在相当大的一部分时期内以极高的学习率进行训练,在此期间,失去的不是真的非常好。 但诀窍在于它正在通过空间进行大量搜索,以找到看似真正具有普遍性的区域。 Sylvain通过刷新丢失的部分在fastai实施了它,然后确认他实际上在CIFAR10的训练上实现了超级融合。 它目前称为`use_clr_beta`但将来会重命名。 他还为fastai图书馆增添了周期性的动力。
* Sylvain Gugger的1循环[政策](https://sgugger.github.io/the-1cycle-policy.html) 。 基于Leslie Smith的新论文,该论文采用了前两篇关键论文(循环学习率和超级收敛),并在其基础上进行了大量实验,以展示如何实现超收敛。 超级收敛使你可以比以前的逐步方法快五倍地训练模型(并且比CLR快,尽管它不到五次)。 超级融合让你可以在1到3之间达到高学习率。超融合的有趣之处在于,你可以在相当大的一部分时期内以极高的学习率进行训练,在此期间,失去的不是真的非常好。 但诀窍在于它正在通过空间进行大量搜索,以找到看似真正具有普遍性的区域。 Sylvain通过刷新丢失的部分在fastai实施了它,然后确认他实际上在CIFAR10的训练上实现了超级融合。 它目前称为`use_clr_beta`但将来会重命名。 他还为fastai增添了周期性的动力。
* [如何使用](https://towardsdatascience.com/how-to-create-data-products-that-are-magical-using-sequence-to-sequence-models-703f86a231f8) Hamel Husain的[序列到序列模型创建神奇的数据产品](https://towardsdatascience.com/how-to-create-data-products-that-are-magical-using-sequence-to-sequence-models-703f86a231f8) 。 他在博客上写了关于训练模型以总结GitHub问题的文章。 以下是基于他的博客创建的Kubeflow团队[演示](http://gh-demo.kubeflow.org/)
### 神经机器翻译 [[5:36](https://youtu.be/tY0n9OT5_nA%3Ft%3D5m36s)]
......@@ -1172,7 +1172,7 @@ RNN吐出两件事:它在每个时间步之后吐出一个状态列表( `enc
![](../img/1_exiD0uDeL6xx5EOLdPS3BA.png)
**最近邻搜索** [[2:10:56](https://youtu.be/tY0n9OT5_nA%3Ft%3D2h10m56s)] :我们现在可以做的是现在我们可以使用最近邻搜索。 所以最近的邻居搜索意味着这里是一个300维向量,这里有很多其他300维向量,它最接近的是什么? 通常这需要很长时间,因为你必须查看每个300维向量,计算它的距离,并找出它有多远。 但是有一个令人惊讶的几乎未知的库叫做**NMSLib** ,它的速度非常快。 你们中的一些人可能已经尝试了其他最近邻居的图书馆,我保证这比你们正在使用的图书馆更快 - 我可以告诉你,因为它是以人们为生,以这些东西为生。 到目前为止,这是每个可能维度上最快的。 我们想要创建角距离的索引,我们需要在所有ImageNet字向量上进行。 添加整批,创建索引,现在我们可以一次查询一堆向量,得到10个最近的邻居。 该库使用多线程,绝对是太棒了。 你可以从pip( `pip install nmslib``pip install nmslib`可以了。
**最近邻搜索** [[2:10:56](https://youtu.be/tY0n9OT5_nA%3Ft%3D2h10m56s)] :我们现在可以做的是现在我们可以使用最近邻搜索。 所以最近的邻居搜索意味着这里是一个300维向量,这里有很多其他300维向量,它最接近的是什么? 通常这需要很长时间,因为你必须查看每个300维向量,计算它的距离,并找出它有多远。 但是有一个令人惊讶的几乎未知的库叫做**NMSLib** ,它的速度非常快。 你们中的一些人可能已经尝试了其他最近邻居的库,我保证这比你们正在使用的库更快 - 我可以告诉你,因为它是以人们为生,以这些东西为生。 到目前为止,这是每个可能维度上最快的。 我们想要创建角距离的索引,我们需要在所有ImageNet字向量上进行。 添加整批,创建索引,现在我们可以一次查询一堆向量,得到10个最近的邻居。 该库使用多线程,绝对是太棒了。 你可以从pip( `pip install nmslib``pip install nmslib`可以了。
```
**import** **nmslib**
......
......@@ -12,7 +12,7 @@
这是一篇很酷的新论文,刚刚在几天前[出版](https://arxiv.org/abs/1804.03189) ,名为[Deep Painterly Harmonization](https://arxiv.org/abs/1804.03189) ,它几乎完全采用了我们将在本课中学习的技巧,并进行了一些小的调整。 但你可以看到基本的想法是将一张图片粘贴在另一张图片的顶部,然后使用某种方法将两者结合起来。 这种方法被称为“风格转移”。
在我们谈论这个之前,我想提一下William Horton的这个非常酷的贡献,他将这种随机权重平均技术添加到fastai库中,现在它已经合并并准备好了。 他写了一篇关于我强烈建议你查看的帖子,不仅因为随机权重平均让你从现有的神经网络中获得更高的性能,基本上没有额外的工作(就像为你的拟合函数添加两个参数一样简单: `use_swa``swa_start` )但他也描述了他构建这个的过程以及他如何测试它以及他如何为图书馆做出贡献。 所以我觉得如果你有兴趣做这样的事情会很有趣。 我认为威廉之前没有建立过这种类型的图书馆,因此他描述了他是如何做到的。
在我们谈论这个之前,我想提一下William Horton的这个非常酷的贡献,他将这种随机权重平均技术添加到fastai库中,现在它已经合并并准备好了。 他写了一篇关于我强烈建议你查看的帖子,不仅因为随机权重平均让你从现有的神经网络中获得更高的性能,基本上没有额外的工作(就像为你的拟合函数添加两个参数一样简单: `use_swa``swa_start` )但他也描述了他构建这个的过程以及他如何测试它以及他如何为库做出贡献。 所以我觉得如果你有兴趣做这样的事情会很有趣。 我认为威廉之前没有建立过这种类型的库,因此他描述了他是如何做到的。
![](../img/1_hJeKM7VaXaDyvVTTXWlFqg.png)
......@@ -553,7 +553,7 @@ VGG网络是接收输入并将其粘贴到多个层中的东西,我将把它
**def** actn_loss2(x): m_vgg(x) out = V(sf.features) **return** F.mse_loss(out, targ_v)*1000
```
现在我可以继续做同样的事情。 但现在我将使用不同的损失函数`actn_loss2` (激活损失#2),它不会说`out=m_vgg` ,再次,它调用`m_vgg`来执行前向传递,抛弃结果,并抓住`sf.features` 。 所以现在我的第32层激活,然后我可以做我的MSE损失。 你可能已经注意到,最后一个损失函数和这个函数都乘以一千。 为什么他们乘以一千? 这就像试图让本课不能正常工作的所有事情一样。 我不习惯有一千个而且没有训练。 今天的午餐时间,没有任何工作。 经过几天试图让这个东西起作用,最后随便注意到“天哪,失去的功能 - 数字真的很低(比如10E-7)”,我想如果它们不是那么低的话。 所以我将它们乘以一千,它就开始工作了。 那么为什么它不起作用? 因为我们正在做单精度浮点,而单精度浮点并不那么精确。 特别是一旦你获得了那么小的渐变,然后你就会乘以可以很小的学习速度,最后得到一个小数字。 如果它太小了,它们可能会变为零,这就是发生了什么,我的模型还没准备好。 我敢肯定有比乘以一千的更好的方法,但无论如何。 它工作正常。 你将损失函数乘以什么并不重要,因为你所关心的只是它的方向和相对大小。 有趣的是,这与我们训练ImageNet时的情况类似。 我们使用半精度浮点,因为Volta张量核要求。 它实际上是一种标准做法,如果你想让半精度浮动训练,你实际上必须将损失函数乘以比例因子。 我们使用的是1024或512.我认为fast.ai现在是第一个拥有内置半精度浮点所需的所有技巧的库,所以如果你有幸拥有Volta或者你可以支付一个AWS P3,如果你有一个学习者对象,你可以说`learn.half` ,它现在只是神奇地训练正确的半精度浮点数。 它也内置在模型数据对象中,并且都是自动的。 很确定没有其他图书馆这样做。
现在我可以继续做同样的事情。 但现在我将使用不同的损失函数`actn_loss2` (激活损失#2),它不会说`out=m_vgg` ,再次,它调用`m_vgg`来执行前向传递,抛弃结果,并抓住`sf.features` 。 所以现在我的第32层激活,然后我可以做我的MSE损失。 你可能已经注意到,最后一个损失函数和这个函数都乘以一千。 为什么他们乘以一千? 这就像试图让本课不能正常工作的所有事情一样。 我不习惯有一千个而且没有训练。 今天的午餐时间,没有任何工作。 经过几天试图让这个东西起作用,最后随便注意到“天哪,失去的功能 - 数字真的很低(比如10E-7)”,我想如果它们不是那么低的话。 所以我将它们乘以一千,它就开始工作了。 那么为什么它不起作用? 因为我们正在做单精度浮点,而单精度浮点并不那么精确。 特别是一旦你获得了那么小的渐变,然后你就会乘以可以很小的学习速度,最后得到一个小数字。 如果它太小了,它们可能会变为零,这就是发生了什么,我的模型还没准备好。 我敢肯定有比乘以一千的更好的方法,但无论如何。 它工作正常。 你将损失函数乘以什么并不重要,因为你所关心的只是它的方向和相对大小。 有趣的是,这与我们训练ImageNet时的情况类似。 我们使用半精度浮点,因为Volta张量核要求。 它实际上是一种标准做法,如果你想让半精度浮动训练,你实际上必须将损失函数乘以比例因子。 我们使用的是1024或512.我认为fast.ai现在是第一个拥有内置半精度浮点所需的所有技巧的库,所以如果你有幸拥有Volta或者你可以支付一个AWS P3,如果你有一个学习者对象,你可以说`learn.half` ,它现在只是神奇地训练正确的半精度浮点数。 它也内置在模型数据对象中,并且都是自动的。 很确定没有其他这样做。
```
n_iter=0 **while** n_iter <= max_iter: optimizer.step(partial(step,actn_loss2))
......
......@@ -155,7 +155,7 @@
* `1e-2` :对于我们在顶部添加的图层
* 为什么3? 实际上它们是3个ResNet块,但就目前而言,它被认为是一组层。
**问题** :如果我的图像比训练模型的图像大,怎么办? [[50:30](https://youtu.be/JNxcznsrRb8%3Ft%3D50m30s)] 简短的回答是,通过我们使用的图书馆和现代建筑,我们可以使用任何我们喜欢的尺寸。
**问题** :如果我的图像比训练模型的图像大,怎么办? [[50:30](https://youtu.be/JNxcznsrRb8%3Ft%3D50m30s)] 简短的回答是,通过我们使用的和现代建筑,我们可以使用任何我们喜欢的尺寸。
**问题** :我们可以解冻特定的图层吗? [[51:03](https://youtu.be/JNxcznsrRb8%3Ft%3D51m3s)] 我们还没有这样做,但如果你想,你可以做`lean.unfreeze_to(n)` (它将从`n``lean.unfreeze_to(n)`解冻层)。 Jeremy几乎从未发现它有用,他认为这是因为我们使用的是差异学习率,优化器可以根据需要学习。 他发现它有用的一个地方是,如果他使用的是一个非常大的内存密集型模型,并且他的GPU耗尽,你解冻的层次越少,内存和时间就越少。
......
......@@ -85,7 +85,7 @@ Quick Dogs v Cats
* `bn_freeze` :如果你在一个与ImageNet非常相似的数据集上使用更大的更深层次的模型,如ResNet50或ResNext101(数字大于34的任何东西)(即标准对象的侧面照片,其大小类似于ImageNet在200-500之间像素),你应该添加这一行。 我们将在课程的后半部分了解更多信息,但这会导致批量标准化移动平均值无法更新。
#### [如何使用其他图书馆 - Keras](https://github.com/fastai/fastai/blob/master/courses/dl1/keras_lesson1.ipynb) [[20:02](https://youtu.be/9C06ZPF8Uuc%3Ft%3D20m2s)]
#### [如何使用其他 - Keras](https://github.com/fastai/fastai/blob/master/courses/dl1/keras_lesson1.ipynb) [[20:02](https://youtu.be/9C06ZPF8Uuc%3Ft%3D20m2s)]
了解如何使用Fast.ai以外的库非常重要。 Keras是一个很好的例子,因为就像Fast.ai一样位于PyTorch之上,它位于各种库之上,如TensorFlow,MXNet,CNTK等。
......@@ -581,7 +581,7 @@ Softmax不喜欢预测多个事物。 它想要选择一件事。
def join_df(left, right, left_on, right_on=None, suffix='_y'): if right_on is None: right_on = left_on return left. **merge** (right, how='left', left_on=left_on, right_on=right_on, suffixes=("", suffix))
```
来自Fast.ai图书馆
来自Fast.ai
```
add_datepart(train, "Date", drop=False)
......
......@@ -480,7 +480,7 @@ CIFAR 10是学术界一个古老且众所周知的数据集 - 在ImageNet之前
* 批量规范所做的另一件事是它规则化,换句话说,你可以经常减少或消除辍学或体重衰减。 原因是每个小批量将与先前的小批量具有不同的平均值和不同的标准偏差。 因此,它们不断变化,并以微妙的方式改变滤波器的含义,作为噪声(即正则化)。
* 在实际版本中,它不使用此批次的均值和标准差,而是采用指数加权移动平均标准差和均值。
* `**if** self.training` - 这很重要,因为当你通过验证集时,你不想改变模型的含义。 有些类型的层实际上对网络模式敏感,无论是处于训练模式还是评估/测试模式。 当我们为MovieLens实现迷你网时出现了一个错误,即在验证过程中应用了dropout - 这是固定的。 在PyTorch中,有两个这样的层:dropout和batch norm。 `nn.Dropout`已经进行了检查。
* [[01:37:01](https://youtu.be/H3g26EVADgY%3Ft%3D1h37m1s)] [fast.ai](https://youtu.be/H3g26EVADgY%3Ft%3D1h37m1s)的关键区别在于,无论其他图书馆做什么,只要你基本上说我正在训练,这些手段和标准偏差都会在其他图书馆的训练模式中更新,无论该层是否是否可以训练。 有了预先训练好的网络,这是一个糟糕的主意。 如果你有一个预先训练好的网络,用于批量标准中的那些均值和标准偏差的特定值,如果你更改它们,它将改变那些预先训练的图层的含义。 在fast.ai中,始终默认情况下,如果你的图层被冻结,它将不会触及那些均值和标准偏差。 一旦你取消冻结它,除非你设置`learn.bn_freeze=True` ,否则它将开始更新它们。 在实践中,对于预训练的模型,这似乎通常效果更好,特别是如果你使用的数据与预训练模型的训练非常相似。
* [[01:37:01](https://youtu.be/H3g26EVADgY%3Ft%3D1h37m1s)] [fast.ai](https://youtu.be/H3g26EVADgY%3Ft%3D1h37m1s)的关键区别在于,无论其他库做什么,只要你基本上说我正在训练,这些手段和标准偏差都会在其他库的训练模式中更新,无论该层是否是否可以训练。 有了预先训练好的网络,这是一个糟糕的主意。 如果你有一个预先训练好的网络,用于批量标准中的那些均值和标准偏差的特定值,如果你更改它们,它将改变那些预先训练的图层的含义。 在fast.ai中,始终默认情况下,如果你的图层被冻结,它将不会触及那些均值和标准偏差。 一旦你取消冻结它,除非你设置`learn.bn_freeze=True` ,否则它将开始更新它们。 在实践中,对于预训练的模型,这似乎通常效果更好,特别是如果你使用的数据与预训练模型的训练非常相似。
* 你在哪里放置批量标准层? 我们稍后会谈谈更多,但就目前来说,经过`relu`
#### 消融研究 [[01:39:41](https://youtu.be/H3g26EVADgY%3Ft%3D1h39m41s)]
......@@ -488,7 +488,7 @@ CIFAR 10是学术界一个古老且众所周知的数据集 - 在ImageNet之前
在这种情况下,你可以尝试打开和关闭模型的不同部分,以查看哪些部位产生了哪些影响,而原始批次规范文件中未执行的操作之一是任何有效的消融。 因此缺少的一件事就是这个问题刚才被问到 - 在哪里提出批量规范。 这种疏忽造成了很多问题,因为事实证明原始论文并没有真正把它放在最佳位置。 从那时起,其他人现在已经想到了这一点,当Jeremy向人们展示实际上在现场更好的代码时,人们说他的批量规范是在错误的位置。
* 如果可以,请尝试并始终在每个图层上使用批量规范
* 不要停止对数据进行规范化,以便使用你的数据的人知道你如何规范化数据。 其他图书馆可能无法正确处理预训练模型的批量规范,因此当人们开始重新训练时,可能会导致问题。
* 不要停止对数据进行规范化,以便使用你的数据的人知道你如何规范化数据。 其他可能无法正确处理预训练模型的批量规范,因此当人们开始重新训练时,可能会导致问题。
```
**class** **ConvBnNet** (nn.Module): **def** __init__(self, layers, c): super().__init__() **self.conv1 = nn.Conv2d(3, 10, kernel_size=5, stride=1, padding=2)** self.layers = nn.ModuleList([ **BnLayer** (layers[i], layers[i + 1]) **for** i **in** range(len(layers) - 1)]) self.out = nn.Linear(layers[-1], c) **def** forward(self, x): x = self.conv1(x) **for** l **in** self.layers: x = l(x) x = F.adaptive_max_pool2d(x, 1) x = x.view(x.size(0), -1) **return** F.log_softmax(self.out(x), dim=-1)
......
......@@ -24,7 +24,7 @@ Yann LeCun一直在宣传我们并不称之为“深度学习”,而是称之
![](../img/1_sDycvgDmfivum0HQhHpOuA.png)
转移学习是有效使用深度学习能够做的最重要的事情。 你几乎永远不会想要或者不需要从随机权重开始,除非没有人曾经在模糊的类似数据集上训练模型,甚至远程连接的问题要像你正在做的那样解决 - 这几乎从未发生过。 Fastai图书馆专注于转移学习,这使其与其他图书馆不同。 转学习的基本思想是:
转移学习是有效使用深度学习能够做的最重要的事情。 你几乎永远不会想要或者不需要从随机权重开始,除非没有人曾经在模糊的类似数据集上训练模型,甚至远程连接的问题要像你正在做的那样解决 - 这几乎从未发生过。 Fastai库专注于转移学习,这使其与其他库不同。 转学习的基本思想是:
* 给定一个做事物A的网络,删除最后一层。
* 最后用几个随机层替换它
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册