Skip to content

Commit 8009fa2

Browse files
committed
chore(i18n): sync translations with latest source changes (chunk 3/8, 8 changes)
1 parent 39d25b3 commit 8009fa2

File tree

8 files changed

+4057
-0
lines changed

8 files changed

+4057
-0
lines changed

translations/zh-CN/lessons/4-ComputerVision/07-ConvNets/lab/PetFaces.ipynb

Lines changed: 409 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
# 宠物面部分类
2+
3+
来自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的实验任务。
4+
5+
## 任务
6+
7+
假设你需要开发一个宠物托管应用程序,用于记录所有宠物信息。该应用程序的一个重要功能是通过照片自动识别宠物的品种。这可以通过神经网络成功实现。
8+
9+
你需要训练一个卷积神经网络,使用 **Pet Faces** 数据集对不同品种的猫和狗进行分类。
10+
11+
## 数据集
12+
13+
我们将使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),该数据集包含37种不同品种的猫和狗的图像。
14+
15+
![我们将处理的数据集](../../../../../../translated_images/zh-CN/data.50b2a9d5484bdbf0.webp)
16+
17+
要下载数据集,请使用以下代码片段:
18+
19+
```python
20+
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
21+
!tar xfz images.tar.gz
22+
!rm images.tar.gz
23+
```
24+
25+
**注意:** Oxford-IIIT Pet Dataset 的图像是按文件名组织的(例如,`Abyssinian_1.jpg``Bengal_2.jpg`)。笔记本中包含代码,将这些图像组织到按品种分类的子目录中,以便于分类。
26+
27+
## 启动笔记本
28+
29+
通过打开 [PetFaces.ipynb](PetFaces.ipynb) 开始实验。
30+
31+
## 收获
32+
33+
你已经从零开始解决了一个相对复杂的图像分类问题!尽管类别很多,你仍然能够获得合理的准确率!同时,测量 top-k 准确率也是有意义的,因为有些类别即使对人类来说也不容易区分。
34+
35+
---
36+
37+
**免责声明**
38+
本文档使用AI翻译服务 [Co-op Translator](https://github.com/Azure/co-op-translator) 进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

translations/zh-CN/lessons/4-ComputerVision/08-TransferLearning/AdversarialCat_TF.ipynb

Lines changed: 751 additions & 0 deletions
Large diffs are not rendered by default.

translations/zh-CN/lessons/4-ComputerVision/08-TransferLearning/Dropout.ipynb

Lines changed: 208 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
# 预训练网络与迁移学习
2+
3+
训练 CNN 需要耗费大量时间,并且需要大量数据。然而,大部分时间都花在学习网络可以用来从图像中提取模式的最佳低级滤波器上。一个自然的问题是:我们是否可以使用一个在某个数据集上训练过的神经网络,并将其适配到不同的图像分类任务,而无需完整的训练过程?
4+
5+
## [课前测验](https://ff-quizzes.netlify.app/en/ai/quiz/15)
6+
7+
这种方法被称为**迁移学习**,因为我们将一个神经网络模型的一些知识转移到另一个模型中。在迁移学习中,我们通常从一个预训练模型开始,该模型已经在某个大型图像数据集(例如 **ImageNet**)上进行了训练。这些模型已经能够很好地从通用图像中提取不同的特征,在许多情况下,仅仅在这些提取的特征之上构建一个分类器就可以取得不错的效果。
8+
9+
> ✅ 迁移学习是一个在其他学术领域(如教育)中也会遇到的术语,它指的是将一个领域的知识应用到另一个领域的过程。
10+
11+
## 预训练模型作为特征提取器
12+
13+
我们在上一节中讨论的卷积网络包含多个层,每一层都旨在从图像中提取一些特征,从低级像素组合(例如水平/垂直线或笔画)到高级特征组合(例如火焰的眼睛)。如果我们在足够大的通用和多样化图像数据集上训练 CNN,网络应该能够学习提取这些常见特征。
14+
15+
Keras 和 PyTorch 都包含函数,可以轻松加载一些常见架构的预训练神经网络权重,这些权重大多是在 ImageNet 图像上训练的。最常用的架构在上一课的 [CNN Architectures](../07-ConvNets/CNN_Architectures.md) 页面中有描述。特别是,你可以考虑使用以下模型之一:
16+
17+
* **VGG-16/VGG-19** 是相对简单的模型,但仍然具有良好的准确性。通常使用 VGG 作为初步尝试是一个不错的选择,可以看看迁移学习的效果如何。
18+
* **ResNet** 是微软研究院在 2015 年提出的一系列模型。它们有更多的层,因此需要更多资源。
19+
* **MobileNet** 是一系列尺寸较小的模型,适合移动设备。如果资源有限并且可以牺牲一些准确性,可以使用它们。
20+
21+
以下是 VGG-16 网络从一张猫的图片中提取的示例特征:
22+
23+
![VGG-16 提取的特征](../../../../../translated_images/zh-CN/features.6291f9c7ba3a0b95.webp)
24+
25+
## 猫与狗数据集
26+
27+
在这个例子中,我们将使用一个[猫与狗](https://www.microsoft.com/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste)数据集,这非常接近真实的图像分类场景。
28+
29+
## ✍️ 练习:迁移学习
30+
31+
让我们在相关的笔记本中看看迁移学习的实际应用:
32+
33+
* [迁移学习 - PyTorch](TransferLearningPyTorch.ipynb)
34+
* [迁移学习 - TensorFlow](TransferLearningTF.ipynb)
35+
36+
## 可视化对抗性猫
37+
38+
预训练的神经网络在其“脑海”中包含了不同的模式,包括**理想猫**(以及理想狗、理想斑马等)的概念。我们可以尝试以某种方式**可视化这个图像**。然而,这并不简单,因为这些模式分布在网络权重的各个部分,并且以层次结构组织。
39+
40+
我们可以采取的一种方法是从一个随机图像开始,然后尝试使用**梯度下降优化**技术调整该图像,使网络认为它是一只猫。
41+
42+
![图像优化循环](../../../../../translated_images/zh-CN/ideal-cat-loop.999fbb8ff306e044.webp)
43+
44+
然而,如果我们这样做,我们会得到一些非常类似于随机噪声的东西。这是因为*有很多方法可以让网络认为输入图像是一只猫*,包括一些在视觉上没有意义的方式。虽然这些图像包含了许多典型的猫的模式,但没有任何约束使它们在视觉上具有辨识度。
45+
46+
为了改善结果,我们可以在损失函数中添加另一个项,称为**变化损失**。它是一种度量,显示图像中相邻像素的相似程度。最小化变化损失可以使图像更平滑,并消除噪声,从而揭示更具视觉吸引力的模式。以下是一些这样的“理想”图像示例,它们被高概率分类为猫和斑马:
47+
48+
![理想猫](../../../../../translated_images/zh-CN/ideal-cat.203dd4597643d6b0.webp) | ![理想斑马](../../../../../translated_images/zh-CN/ideal-zebra.7f70e8b54ee15a7a.webp)
49+
-----|-----
50+
*理想猫* | *理想斑马*
51+
52+
类似的方法可以用来对神经网络进行所谓的**对抗性攻击**。假设我们想欺骗一个神经网络,让一只狗看起来像一只猫。如果我们拿一张被网络识别为狗的狗的图片,然后稍微调整它,直到网络开始将其分类为猫:
53+
54+
![狗的图片](../../../../../translated_images/zh-CN/original-dog.8f68a67d2fe0911f.webp) | ![被分类为猫的狗的图片](../../../../../translated_images/zh-CN/adversarial-dog.d9fc7773b0142b89.webp)
55+
-----|-----
56+
*狗的原始图片* | *被分类为猫的狗的图片*
57+
58+
查看以下笔记本中的代码以重现上述结果:
59+
60+
* [理想与对抗性猫 - TensorFlow](AdversarialCat_TF.ipynb)
61+
62+
## 总结
63+
64+
通过迁移学习,你可以快速构建一个用于自定义对象分类任务的分类器,并获得较高的准确性。可以看到,我们现在解决的更复杂任务需要更高的计算能力,无法轻松在 CPU 上完成。在下一单元中,我们将尝试使用更轻量化的实现来训练相同的模型,使用较低的计算资源,结果仅稍微降低准确性。
65+
66+
## 🚀 挑战
67+
68+
在配套的笔记本中,底部有关于迁移知识在某些相似训练数据(例如新类型的动物)中效果最佳的注释。尝试使用完全不同类型的图像进行实验,看看你的迁移知识模型表现得如何。
69+
70+
## [课后测验](https://ff-quizzes.netlify.app/en/ai/quiz/16)
71+
72+
## 复习与自学
73+
74+
阅读 [TrainingTricks.md](TrainingTricks.md),深入了解其他训练模型的方法。
75+
76+
## [作业](lab/README.md)
77+
78+
在这个实验中,我们将使用真实的 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 宠物数据集,其中包含 35 种猫和狗的品种,并构建一个迁移学习分类器。
79+
80+
---
81+
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
# 深度学习训练技巧
2+
3+
随着神经网络的加深,其训练过程变得越来越具有挑战性。一个主要问题是所谓的[梯度消失](https://en.wikipedia.org/wiki/Vanishing_gradient_problem)[梯度爆炸](https://deepai.org/machine-learning-glossary-and-terms/exploding-gradient-problem#:~:text=Exploding%20gradients%20are%20a%20problem,updates%20are%20small%20and%20controlled)[这篇文章](https://towardsdatascience.com/the-vanishing-exploding-gradient-problem-in-deep-neural-networks-191358470c11)对这些问题进行了很好的介绍。
4+
5+
为了使深度网络的训练更高效,可以使用一些技巧。
6+
7+
## 保持数值在合理范围内
8+
9+
为了使数值计算更稳定,我们需要确保神经网络中的所有数值都在合理的范围内,通常是 [-1..1][0..1]。这并不是一个非常严格的要求,但浮点计算的特性决定了不同数量级的数值无法被准确地一起操作。例如,如果我们将 10<sup>-10</sup> 和 10<sup>10</sup> 相加,结果很可能是 10<sup>10</sup>,因为较小的值会被“转换”到与较大值相同的数量级,从而导致尾数丢失。
10+
11+
大多数激活函数在 [-1..1] 范围内具有非线性特性,因此将所有输入数据缩放到 [-1..1][0..1] 范围是有意义的。
12+
13+
## 初始权重初始化
14+
15+
理想情况下,我们希望数值在通过网络层后仍保持在相同的范围内。因此,初始化权重时需要确保数值分布的保留。
16+
17+
正态分布 **N(0,1)** 并不是一个好选择,因为如果我们有 *n* 个输入,输出的标准差将是 *n*,数值很可能会超出 [0..1] 的范围。
18+
19+
以下是常用的初始化方法:
20+
21+
- 均匀分布 -- `uniform`
22+
- **N(0,1/n)** -- `gaussian`
23+
- **N(0,1/√n_in)** 保证对于均值为零、标准差为 1 的输入,输出的均值和标准差保持不变
24+
- **N(0,√2/(n_in+n_out))** -- 所谓的 **Xavier 初始化** (`glorot`),有助于在前向传播和反向传播中保持信号在合理范围内
25+
26+
## 批量归一化
27+
28+
即使有了合适的权重初始化,训练过程中权重仍可能变得非常大或非常小,从而使信号超出合理范围。我们可以通过使用某种**归一化**技术将信号拉回合理范围。虽然有多种归一化方法(如权重归一化、层归一化),但最常用的是批量归一化。
29+
30+
**批量归一化**的思想是考虑小批量中的所有数值,并基于这些数值进行归一化(即减去均值并除以标准差)。它被实现为一个网络层,在应用权重后但在激活函数之前进行归一化。结果是,我们通常会看到更高的最终准确率和更快的训练速度。
31+
32+
以下是关于批量归一化的[原始论文](https://arxiv.org/pdf/1502.03167.pdf)[维基百科解释](https://en.wikipedia.org/wiki/Batch_normalization)以及[一篇很好的入门博客](https://towardsdatascience.com/batch-normalization-in-3-levels-of-understanding-14c2da90a338)(还有[俄文版](https://habrahabr.ru/post/309302/))。
33+
34+
## Dropout
35+
36+
**Dropout** 是一种有趣的技术,它在训练过程中随机移除一定比例的神经元。它被实现为一个具有一个参数的层(移除神经元的百分比,通常为 10%-50%),在训练过程中,它会将输入向量的随机元素置零,然后再传递到下一层。
37+
38+
虽然这听起来像是一个奇怪的想法,但你可以在 [`Dropout.ipynb`](../../../../../lessons/4-ComputerVision/08-TransferLearning/Dropout.ipynb) 笔记本中看到 Dropout 对训练 MNIST 数字分类器的效果。它加速了训练,并使我们能够在更少的训练轮次中达到更高的准确率。
39+
40+
这种效果可以通过以下几种方式解释:
41+
42+
- 它可以被认为是对模型的随机冲击因素,从而将优化从局部最小值中拉出
43+
- 它可以被视为*隐式模型平均化*,因为我们可以说在 Dropout 过程中我们训练了略有不同的模型
44+
45+
> *有人说,当一个醉酒的人试图学习某些东西时,与清醒的人相比,他第二天早上会记得更清楚,因为一个有一些功能失常神经元的大脑会更努力地适应以抓住意义。我们自己从未验证过这是否属实。*
46+
47+
## 防止过拟合
48+
49+
深度学习中一个非常重要的方面是能够防止[过拟合](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)。虽然使用非常强大的神经网络模型可能很有吸引力,但我们应该始终平衡模型参数的数量与训练样本的数量。
50+
51+
> 确保你理解我们之前介绍的[过拟合](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)概念!
52+
53+
以下是防止过拟合的几种方法:
54+
55+
- 提前停止 -- 持续监控验证集上的误差,当验证误差开始增加时停止训练。
56+
- 显式权重衰减 / 正则化 -- 在损失函数中添加一个额外的惩罚项,用于限制权重的绝对值过大,从而防止模型产生非常不稳定的结果
57+
- 模型平均化 -- 训练多个模型,然后对结果进行平均。这有助于最小化方差。
58+
- Dropout(隐式模型平均化)
59+
60+
## 优化器 / 训练算法
61+
62+
训练的另一个重要方面是选择合适的训练算法。虽然经典的**梯度下降**是一个合理的选择,但它有时可能过于缓慢,或者导致其他问题。
63+
64+
在深度学习中,我们使用**随机梯度下降**(SGD),它是对从训练集中随机选择的小批量数据应用的梯度下降。权重通过以下公式调整:
65+
66+
w<sup>t+1</sup> = w<sup>t</sup> - η∇ℒ
67+
68+
### 动量
69+
70+
**动量 SGD** 中,我们保留了前几步的部分梯度。这类似于当我们以惯性移动时,如果受到一个不同方向的冲击,我们的轨迹不会立即改变,而是保留了一部分原始运动。这里我们引入另一个向量 v 来表示*速度*
71+
72+
- v<sup>t+1</sup> = γ v<sup>t</sup> - η∇ℒ
73+
- w<sup>t+1</sup> = w<sup>t</sup> + v<sup>t+1</sup>
74+
75+
这里参数 γ 表示我们考虑惯性的程度:γ=0 对应于经典 SGD;γ=1 是一个纯粹的运动方程。
76+
77+
### Adam, Adagrad 等
78+
79+
由于在每一层中我们将信号乘以某个矩阵 W<sub>i</sub>,根据 ||W<sub>i</sub>||,梯度可能会减小接近于 0,或者无限增大。这正是梯度爆炸/消失问题的本质。
80+
81+
解决此问题的一种方法是仅在公式中使用梯度的方向,而忽略其绝对值,即:
82+
83+
w<sup>t+1</sup> = w<sup>t</sup> - η(∇ℒ/||∇ℒ||),其中 ||∇ℒ|| = √∑(∇ℒ)<sup>2</sup>
84+
85+
这种算法被称为 **Adagrad**。其他使用相同思想的算法包括:**RMSProp****Adam**
86+
87+
> **Adam** 被认为是许多应用中非常高效的算法,因此如果你不确定使用哪种算法,可以选择 Adam。
88+
89+
### 梯度裁剪
90+
91+
梯度裁剪是上述思想的扩展。当 ||∇ℒ|| ≤ θ 时,我们在权重优化中使用原始梯度;当 ||∇ℒ|| > θ 时,我们将梯度除以其范数。这里 θ 是一个参数,在大多数情况下我们可以取 θ=1 或 θ=10。
92+
93+
### 学习率衰减
94+
95+
训练的成功往往取决于学习率参数 η。可以合理地假设,较大的 η 值会导致更快的训练,这是我们通常在训练初期所希望的,而较小的 η 值则允许我们对网络进行微调。因此,在大多数情况下,我们希望在训练过程中逐渐减小 η。
96+
97+
这可以通过在每个训练轮次后将 η 乘以某个数(例如 0.98)来实现,或者使用更复杂的**学习率调度**
98+
99+
## 不同的网络架构
100+
101+
为你的问题选择合适的网络架构可能会很棘手。通常,我们会选择一个已被证明适用于我们特定任务(或类似任务)的架构。这里有一个关于计算机视觉神经网络架构的[很好的概述](https://www.topbots.com/a-brief-history-of-neural-network-architectures/)
102+
103+
> 选择一个足够强大的架构来匹配我们拥有的训练样本数量是很重要的。选择过于强大的模型可能会导致[过拟合](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)
104+
105+
另一种好的方法是使用能够自动调整到所需复杂度的架构。在某种程度上,**ResNet** 架构和 **Inception** 是自适应的。[更多关于计算机视觉架构的信息](../07-ConvNets/CNN_Architectures.md)
106+
107+
**免责声明**
108+
本文档使用AI翻译服务[Co-op Translator](https://github.com/Azure/co-op-translator)进行翻译。尽管我们努力确保翻译的准确性,但请注意,自动翻译可能包含错误或不准确之处。原始语言的文档应被视为权威来源。对于关键信息,建议使用专业人工翻译。我们不对因使用此翻译而产生的任何误解或误读承担责任。

0 commit comments

Comments
 (0)