提交 3d4d86a8 编写于 作者: W wizardforcel

dl7 fix

上级 1fba1c67
......@@ -293,7 +293,7 @@ pytext中没有fasttext Python库,但这是一个方便的技巧 [[35:03](http
_(300, 300)_
```
由于你将在稍后看到的原因,我们还想知道我们的向量的平均值和标准差是什么。 因此平均值约为零,标准差约为0.3。
由于你将在稍后看到的原因,我们还想知道我们的向量的平均值和标准差是什么。 因此平均值约为零,标准差约为0.3。
```
en_vecs = np.stack(list(en_vecd.values())) en_vecs.mean(),en_vecs.std()
......@@ -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', ':']_
......
......@@ -40,7 +40,7 @@ CIFAR10是一个相当小的数据集 [[8:06](https://youtu.be/ondivPiwQho%3Ft%3
**from** **fastai.conv_learner** **import** * PATH = Path("data/cifar10/") os.makedirs(PATH,exist_ok= **True** )
```
对于那些对他们的广播和PyTorch基本技能没有100%信心的人来说,这是一个非常好的练习,可以理解Jeremy如何提出这些`stats`数据。 这些数字是CIFAR10中每个通道的平均值和标准差。 尝试并确保你可以重新创建这些数字,看看是否可以使用不超过几行代码(无循环!)来完成。
对于那些对他们的广播和PyTorch基本技能没有100%信心的人来说,这是一个非常好的练习,可以理解Jeremy如何提出这些`stats`数据。 这些数字是CIFAR10中每个通道的平均值和标准差。 尝试并确保你可以重新创建这些数字,看看是否可以使用不超过几行代码(无循环!)来完成。
因为它们相当小,我们可以使用比平时更大的批量大小,这些图像的大小是32 [[9:46](https://youtu.be/ondivPiwQho%3Ft%3D9m46s)] 。
......@@ -131,7 +131,7 @@ Leaky ReLU(其中_x_ <0)的梯度变化但是大约0.1或0.01的常数。
在家尝试一下。 尝试运行CIFAR,看看会发生什么。 甚至乘以2或摆弄。 这可以让你的GPU做更多的工作而且非常有趣,因为绝大多数谈论不同架构表现的论文从未实际计算通过它运行批量需要多长时间。 他们说“这个每批需要X次浮点运算”,但他们从来没有像真正的实验主义者那样费心去运行,并且发现它是更快还是更慢。 许多真正着名的体系结构现在变得像糖蜜一样缓慢并且需要大量的内存并且完全没用,因为研究人员从来没有真正费心去看它们是否很快并且实际上看它们是否适合RAM正常批量大小。 因此,广泛的ResNet纸张不同寻常之处在于它实际上需要花费多长时间才能获得同样的洞察力的YOLO v3纸张。 他们可能错过了Wide ResNet论文,因为YOLO v3论文得出了许多相同的结论,但Jeremy不确定他们选择了Wide ResNet论文,所以他们可能不知道所有这些工作都已完成。 很高兴看到人们真正计时并注意到实际上有意义的东西。
**问题** :你对SELU(缩放指数线性单位)有何看法? [[29:44](https://youtu.be/ondivPiwQho%3Ft%3D29m44s)] [SELU](https://youtu.be/ondivPiwQho%3Ft%3D29m44s)主要用于全连接层,它允许你摆脱批量规范,基本的想法是,如果你使用这个不同的激活功能,它是自我规范化。 自我归一化意味着它将始终保持单位标准差和零均值,因此你不需要批量规范。 它并没有真正去过任何地方,原因是因为它非常挑剔 - 你必须使用一个非常具体的初始化,否则它不会以恰当的标准差和平均值开始。 很难将它与嵌入之类的东西一起使用,如果你这样做,你必须使用一种特殊的嵌入初始化,这对于嵌入是没有意义的。 你完成所有这些工作,很难做到正确,如果你最终做到了,那有什么意义呢? 好吧,你已经设法摆脱了一些批量标准层,无论如何都没有真正损害你。 这很有趣,因为SELU论文 - 人们注意到它的主要原因是它是由LSTM的发明者创造的,并且它有一个巨大的数学附录。 因此人们认为“很多来自一个着名人物的数学 - 它一定很棒!”但在实践中,杰里米并没有看到任何人使用它来获得任何最先进的结果或赢得任何比赛。
**问题** :你对SELU(缩放指数线性单位)有何看法? [[29:44](https://youtu.be/ondivPiwQho%3Ft%3D29m44s)] [SELU](https://youtu.be/ondivPiwQho%3Ft%3D29m44s)主要用于全连接层,它允许你摆脱批量规范,基本的想法是,如果你使用这个不同的激活功能,它是自我规范化。 自我归一化意味着它将始终保持单位标准差和零均值,因此你不需要批量规范。 它并没有真正去过任何地方,原因是因为它非常挑剔 - 你必须使用一个非常具体的初始化,否则它不会以恰当的标准差和平均值开始。 很难将它与嵌入之类的东西一起使用,如果你这样做,你必须使用一种特殊的嵌入初始化,这对于嵌入是没有意义的。 你完成所有这些工作,很难做到正确,如果你最终做到了,那有什么意义呢? 好吧,你已经设法摆脱了一些批量标准层,无论如何都没有真正损害你。 这很有趣,因为SELU论文 - 人们注意到它的主要原因是它是由LSTM的发明者创造的,并且它有一个巨大的数学附录。 因此人们认为“很多来自一个着名人物的数学 - 它一定很棒!”但在实践中,杰里米并没有看到任何人使用它来获得任何最先进的结果或赢得任何比赛。
`Darknet.make_group_layer`包含一堆`ResLayer` [[31:28](https://youtu.be/ondivPiwQho%3Ft%3D31m28s)] 。 `group_layer`将有一些频道/过滤器进入。我们将通过使用标准的`conv_layer`加倍进入的频道数量。 可选地,我们将使用2的步幅将网格大小减半。然后我们将做一大堆ResLayers - 我们可以选择多少(2,3,8等),因为记住ResLayers不会改变网格大小和它们不会更改通道数,因此你可以添加任意数量的通道而不会出现任何问题。 这将使用更多的计算和更多的RAM,但没有其他理由,你不能添加任意多的。 因此, `group_layer`最终会使通道数增加一倍,因为初始卷积使通道数增加一倍,并且根据我们在`stride`传递的内容,如果我们设置`stride=2` ,它也可以将网格大小减半。 然后我们可以根据需要进行一大堆Res块计算。
......
......@@ -138,7 +138,7 @@ Alena Harley做了一些非常有趣的事情,她试图找出如果你只用
一旦我们有`Dataset`类和一些_x_和_y_训练和验证集。 有一个方便的小方法叫做get datasets( `get_ds` ),它基本上在所有不同的东西上运行该构造函数,你需要以完全正确的格式返回所需的所有数据集,以传递给ModelData构造函数(在本例中为`ImageData`构造函数) )。 所以我们有点回到fastai的封面下并从头开始构建它。 在接下来的几个星期里,这一切都将被包装并重构为你可以在fastai中一步完成的事情。 但本课程的重点是学习一些关于幕后工作的内容。
我们之前简要介绍的一点是,当我们拍摄图像时,我们不仅使用数据增强对它们进行变换,而且还将通道尺寸移动到开始,我们减去平均值除以标准差等 [[20:08](https://youtu.be/nG3tT31nPmQ%3Ft%3D20m8s)] 。 因此,如果我们希望能够显示那些来自我们的数据集或数据加载器的图片,我们需要对它们进行去规范化。 因此,模型数据对象的( `md` )数据集( `val_ds` )具有知道如何执行此操作的denorm函数。 为了方便,我只是给它一个简短的名字:
我们之前简要介绍的一点是,当我们拍摄图像时,我们不仅使用数据增强对它们进行变换,而且还将通道尺寸移动到开始,我们减去平均值除以标准差等 [[20:08](https://youtu.be/nG3tT31nPmQ%3Ft%3D20m8s)] 。 因此,如果我们希望能够显示那些来自我们的数据集或数据加载器的图片,我们需要对它们进行去规范化。 因此,模型数据对象的( `md` )数据集( `val_ds` )具有知道如何执行此操作的denorm函数。 为了方便,我只是给它一个简短的名字:
```
denorm = md.val_ds.denorm
......@@ -286,7 +286,7 @@ Alena Harley做了一些非常有趣的事情,她试图找出如果你只用
所以首先要认识到的是当然这是在作品的某些定义下工作的,因为我们在这里有一个可学习的卷积,并且它会得到一些梯度,它可以做到最好的工作,它可以填充正确的激活,这样这输出是我们想要的东西。 所以第一步是要意识到这里没有什么特别神奇的东西。 我们可以创建任何我们喜欢的架构。 我们可以随心所欲地移动东西,我们在卷积中的权重将尽我们所能去做。 真正的问题是 - 这是个好主意吗? 对于它来说这是一件更容易的事情,并且它比转换卷积或逐个转换后的逐次取样更灵活吗? 简短的回答是肯定的,简而言之就是这里的卷积发生在低分辨率7x7空间中,这非常有效。 或者,如果我们首先进行上采样然后再进行转换,那么我们的转换将发生在21乘21空间,这是很多计算。 此外,正如我们所讨论的,最近邻上采样版本中存在大量复制和冗余。 事实上,他们实际上在本文中表明,他们有一个后续技术说明,他们提供了更多的数学细节,以确切地说正在做什么工作,并表明这项工作确实更有效率。 这就是我们要做的事情。 对于我们的上采样,我们有两个步骤:
1. 3x3转换,r²倍于我们原先想要的频道
2. 然后是像素混洗操作,它将每个网格单元格中的所有内容移动到通过这里定位的_r_网格中的小_r_ 。
2. 然后是像素打乱操作,它将每个网格单元格中的所有内容移动到通过这里定位的_r_网格中的小_r_ 。
所以这里是:
......@@ -451,7 +451,7 @@ Alena Harley做了一些非常有趣的事情,她试图找出如果你只用
m = SrResnet(64, scale)
```
然后我们将进行像素混洗卷积的`icnr`初始化 [[54:27](https://youtu.be/nG3tT31nPmQ%3Ft%3D54m27s)] 。 这是非常无聊的代码,我实际上是从其他人那里偷走的。 简而言之,它只是说好了,你有一些你想要初始化的权重张量`x`所以我们将把它视为它的形状(即特征数量)除以实际中的比例平方特征。 所以这可能是2²= 4因为我们实际上只想保留一组然后然后将它们复制四次,所以我们将它除以4并且我们创建了那个大小的东西,我们默认初始化`kaiming_normal`初始化。 然后我们只制作它的scale²副本。 其余的只是一点点移动轴。 因此,这将返回一个新的权重矩阵,其中每个初始化的子内核重复r²或`scale` ²次。 所以细节并不重要。 这里最重要的是我只是通过查看在像素shuffle之前找到实际的转换层并存储它然后我在其权重矩阵上调用`icnr`以获得我的新权重矩阵。 然后我将新的权重矩阵复制回该层。
然后我们将进行像素打乱的卷积的`icnr`初始化 [[54:27](https://youtu.be/nG3tT31nPmQ%3Ft%3D54m27s)] 。 这是非常无聊的代码,我实际上是从其他人那里偷走的。 简而言之,它只是说好了,你有一些你想要初始化的权重张量`x`所以我们将把它视为它的形状(即特征数量)除以实际中的比例平方特征。 所以这可能是2²= 4因为我们实际上只想保留一组然后然后将它们复制四次,所以我们将它除以4并且我们创建了那个大小的东西,我们默认初始化`kaiming_normal`初始化。 然后我们只制作它的scale²副本。 其余的只是一点点移动轴。 因此,这将返回一个新的权重矩阵,其中每个初始化的子内核重复r²或`scale` ²次。 所以细节并不重要。 这里最重要的是我只是通过查看在像素shuffle之前找到实际的转换层并存储它然后我在其权重矩阵上调用`icnr`以获得我的新权重矩阵。 然后我将新的权重矩阵复制回该层。
```
conv_shuffle = m.features[10][0][0] kernel = icnr(conv_shuffle.weight, scale=scale) conv_shuffle.weight.data.copy_(kernel);
......
......@@ -199,7 +199,7 @@ Sequential(
`proc_df` (进程数据框) - Fast.ai中的一个函数,它执行以下操作:
1. 拉出因变量,将其放入单独的变量中,并从原始数据框中删除它。 换句话说, `df`没有`Sales`列, `y`只包含`Sales`列。
2. `do_scale` :神经网络真的希望所有输入数据都在零左右,标准偏差大约为1.因此,我们取数据,减去均值,然后除以标准偏差即可。 它返回一个特殊对象,用于跟踪它用于该规范化的均值和标准偏差,因此你可以稍后对测试集执行相同操作( `mapper` )。
2. `do_scale` :神经网络真的希望所有输入数据都在零左右,标准差大约为1.因此,我们取数据,减去均值,然后除以标准差即可。 它返回一个特殊对象,用于跟踪它用于该规范化的均值和标准差,因此你可以稍后对测试集执行相同操作( `mapper` )。
3. 它还处理缺失值 - 对于类别变量,它变为ID:0,其他类别变为1,2,3等。 对于连续变量,它用中位数替换缺失值,并创建一个新的布尔列,说明它是否丢失。
![](../img/1_Zs6ASJF8iaAe3cduCmLYKw.png)
......
此差异已折叠。
......@@ -229,7 +229,7 @@ _分类器_是具有因变量的任何分类或二项式。 与_回归_相反,
* `bb_i,c_i = input[:, :4], input[:, 4:]` :第一个`:`用于批量维度。
* `b_i = F.sigmoid(bb_i)*224` :我们知道我们的图像是224乘`Sigmoid`将强制它在0和1之间,并将它乘以224以帮助我们的神经网络在它的范围内成为。
**问题:**作为一般规则,在ReLU [[18:02](https://youtu.be/0frKXR-2PBY%3Ft%3D18m2s)] 之前或之后放置BatchNorm会更好吗? Jeremy建议将它放在ReLU之后,因为BathNorm意味着走向零均值的单标准差。 因此,如果你把ReLU放在它之后,你将它截断为零,这样就无法创建负数。 但是如果你把ReLU然后放入BatchNorm,它确实具有这种能力并且给出稍微好一些的结果。 话虽如此,无论如何都不是太大的交易。 你在课程的这一部分看到,大多数时候,Jeremy做了ReLU然后是BatchNorm,但是当他想要与论文保持一致时,有时则相反。
**问题:**作为一般规则,在ReLU [[18:02](https://youtu.be/0frKXR-2PBY%3Ft%3D18m2s)] 之前或之后放置BatchNorm会更好吗? Jeremy建议将它放在ReLU之后,因为BathNorm意味着走向零均值的单标准差。 因此,如果你把ReLU放在它之后,你将它截断为零,这样就无法创建负数。 但是如果你把ReLU然后放入BatchNorm,它确实具有这种能力并且给出稍微好一些的结果。 话虽如此,无论如何都不是太大的交易。 你在课程的这一部分看到,大多数时候,Jeremy做了ReLU然后是BatchNorm,但是当他想要与论文保持一致时,有时则相反。
**问题** :BatchNorm之后使用dropout的直觉是什么? BatchNorm是否已经做好了正则化 [[19:12](https://youtu.be/0frKXR-2PBY%3Ft%3D19m12s)] 的工作? BatchNorm可以正常化,但如果你回想第1部分,我们讨论了一些事情,我们这样做是为了避免过拟合,添加BatchNorm就像数据增强一样。 但你完全有可能仍然过拟合。 关于 Dropout 的一个好处是,它有一个参数来说明 Dropout 的数量。 参数是特别重要的参数,决定了规则的多少,因为它可以让你构建一个漂亮的大参数化模型,然后决定规范它的程度。 Jeremy倾向于总是从`p=0`开始 Dropout ,然后当他添加正则化时,他可以改变 Dropout 参数而不用担心他是否保存了他想要能够加载它的模型,但如果他有在一个中丢弃层而在另一个中没有,它将不再加载。 所以这样,它保持一致。
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册