chore(i18n): sync translations with latest source changes (chunk 3/8, 8 changes)
This commit is contained in:
parent
658eb4e5b0
commit
c9fa7a3051
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,38 @@
|
|||
# 寵物面孔分類
|
||||
|
||||
來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗作業。
|
||||
|
||||
## 任務
|
||||
|
||||
假設你需要開發一個寵物托管應用程式,用於記錄所有寵物。這樣的應用程式的一個重要功能就是能夠從照片中自動識別寵物的品種。這可以通過神經網絡成功實現。
|
||||
|
||||
你需要訓練一個卷積神經網絡來分類不同品種的貓和狗,使用 **Pet Faces** 數據集。
|
||||
|
||||
## 數據集
|
||||
|
||||
我們將使用 [Oxford-IIIT Pet Dataset](https://www.robots.ox.ac.uk/~vgg/data/pets/),該數據集包含37種不同品種的狗和貓的圖片。
|
||||
|
||||

|
||||
|
||||
要下載數據集,請使用以下代碼片段:
|
||||
|
||||
```python
|
||||
!wget https://thor.robots.ox.ac.uk/~vgg/data/pets/images.tar.gz
|
||||
!tar xfz images.tar.gz
|
||||
!rm images.tar.gz
|
||||
```
|
||||
|
||||
**注意:** Oxford-IIIT Pet Dataset 的圖片是根據文件名組織的(例如,`Abyssinian_1.jpg`,`Bengal_2.jpg`)。筆記本中包含代碼,用於將這些圖片整理到按品種分類的子目錄中,以便於分類。
|
||||
|
||||
## 開始筆記本
|
||||
|
||||
通過打開 [PetFaces.ipynb](PetFaces.ipynb) 開始實驗。
|
||||
|
||||
## 收穫
|
||||
|
||||
你已經從零開始解決了一個相對複雜的圖像分類問題!儘管有很多類別,你仍然能夠獲得合理的準確率!同時,測量 top-k 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分。
|
||||
|
||||
---
|
||||
|
||||
**免責聲明**:
|
||||
本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於重要信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋概不負責。
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
|
@ -0,0 +1,81 @@
|
|||
# 預訓練網絡與遷移學習
|
||||
|
||||
訓練卷積神經網絡(CNN)需要大量時間,並且需要大量數據。然而,大部分時間都花在學習網絡可以用來從圖像中提取模式的最佳低層濾波器上。一個自然的問題是:我們是否可以使用在一個數據集上訓練的神經網絡,並將其適應於分類不同的圖像,而不需要完整的訓練過程?
|
||||
|
||||
## [課前小測](https://ff-quizzes.netlify.app/en/ai/quiz/15)
|
||||
|
||||
這種方法被稱為**遷移學習**,因為我們將一個神經網絡模型中的部分知識轉移到另一個模型中。在遷移學習中,我們通常從一個預訓練模型開始,該模型已經在一些大型圖像數據集(如 **ImageNet**)上進行了訓練。這些模型已經能很好地從通用圖像中提取不同的特徵,在許多情況下,只需在這些提取的特徵之上構建一個分類器,就能取得不錯的效果。
|
||||
|
||||
> ✅ 遷移學習這個術語在其他學術領域(如教育學)中也有出現,它指的是將一個領域的知識應用到另一個領域的過程。
|
||||
|
||||
## 預訓練模型作為特徵提取器
|
||||
|
||||
我們在上一節中討論的卷積網絡包含多個層,每一層都應該從圖像中提取一些特徵,從低層次的像素組合(如水平/垂直線條或筆劃)開始,到更高層次的特徵組合,對應於像火焰的眼睛這樣的東西。如果我們在足夠大的通用且多樣化的圖像數據集上訓練 CNN,網絡應該能學會提取這些常見特徵。
|
||||
|
||||
Keras 和 PyTorch 都包含了方便的函數,可以輕鬆加載一些常見架構的預訓練神經網絡權重,其中大多數是在 ImageNet 圖像上訓練的。最常用的模型在之前課程的 [CNN 架構](../07-ConvNets/CNN_Architectures.md) 頁面中有描述。特別是,你可能會考慮使用以下模型之一:
|
||||
|
||||
* **VGG-16/VGG-19**:這些是相對簡單的模型,但仍然能提供不錯的準確性。通常,使用 VGG 作為第一次嘗試是一個不錯的選擇,可以看看遷移學習的效果如何。
|
||||
* **ResNet**:這是由微軟研究院在 2015 年提出的一系列模型。它們有更多的層,因此需要更多的資源。
|
||||
* **MobileNet**:這是一系列尺寸較小的模型,適合移動設備。如果你的資源有限,並且可以接受一些準確性的損失,可以考慮使用它們。
|
||||
|
||||
以下是 VGG-16 網絡從一張貓的圖片中提取的特徵示例:
|
||||
|
||||

|
||||
|
||||
## 貓與狗數據集
|
||||
|
||||
在這個例子中,我們將使用 [貓與狗](https://www.microsoft.com/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste) 數據集,這非常接近於現實生活中的圖像分類場景。
|
||||
|
||||
## ✍️ 練習:遷移學習
|
||||
|
||||
讓我們在相應的筆記本中看看遷移學習的實際應用:
|
||||
|
||||
* [遷移學習 - PyTorch](TransferLearningPyTorch.ipynb)
|
||||
* [遷移學習 - TensorFlow](TransferLearningTF.ipynb)
|
||||
|
||||
## 可視化對抗性貓
|
||||
|
||||
預訓練的神經網絡在其「大腦」中包含了不同的模式,包括對**理想貓**(以及理想狗、理想斑馬等)的概念。能夠以某種方式**可視化這些圖像**會很有趣。然而,這並不簡單,因為這些模式分佈在網絡權重的各個部分,並且以層次結構組織。
|
||||
|
||||
我們可以採取的一種方法是從一張隨機圖像開始,然後嘗試使用**梯度下降優化**技術調整該圖像,使得網絡認為它是一隻貓。
|
||||
|
||||

|
||||
|
||||
然而,如果我們這樣做,我們會得到一些非常接近隨機噪聲的東西。這是因為*有很多方法可以讓網絡認為輸入圖像是一隻貓*,其中一些方法在視覺上並不合理。雖然這些圖像包含了許多典型於貓的模式,但並沒有任何約束使它們在視覺上具有辨識度。
|
||||
|
||||
為了改善結果,我們可以在損失函數中添加另一個項,稱為**變化損失**。這是一種衡量圖像中相鄰像素相似程度的指標。最小化變化損失可以使圖像更平滑,並消除噪聲——從而揭示出更具視覺吸引力的模式。以下是一些這樣的「理想」圖像的例子,它們被高概率分類為貓和斑馬:
|
||||
|
||||
 | 
|
||||
-----|-----
|
||||
*理想貓* | *理想斑馬*
|
||||
|
||||
類似的方法可以用於對神經網絡進行所謂的**對抗性攻擊**。假設我們想要欺騙神經網絡,讓一隻狗看起來像一隻貓。如果我們拿一張狗的圖片,該圖片被網絡識別為狗,然後稍微調整它,使用梯度下降優化,直到網絡開始將其分類為貓:
|
||||
|
||||
 | 
|
||||
-----|-----
|
||||
*原始狗圖片* | *被分類為貓的狗圖片*
|
||||
|
||||
查看以下筆記本中的代碼以重現上述結果:
|
||||
|
||||
* [理想與對抗性貓 - TensorFlow](AdversarialCat_TF.ipynb)
|
||||
|
||||
## 結論
|
||||
|
||||
通過遷移學習,你可以快速構建一個自定義對象分類任務的分類器,並獲得高準確率。你可以看到,我們現在解決的更複雜的任務需要更高的計算能力,並且無法輕易在 CPU 上解決。在下一單元中,我們將嘗試使用更輕量級的實現來訓練相同的模型,使用較低的計算資源,僅以略低的準確率為代價。
|
||||
|
||||
## 🚀 挑戰
|
||||
|
||||
在配套的筆記本中,底部有關於遷移知識如何在某些相似的訓練數據(例如新類型的動物)上效果最佳的筆記。嘗試使用完全新類型的圖像進行實驗,看看你的遷移知識模型表現得如何。
|
||||
|
||||
## [課後小測](https://ff-quizzes.netlify.app/en/ai/quiz/16)
|
||||
|
||||
## 回顧與自學
|
||||
|
||||
閱讀 [TrainingTricks.md](TrainingTricks.md) 以加深對其他訓練模型方法的了解。
|
||||
|
||||
## [作業](lab/README.md)
|
||||
|
||||
在這個實驗中,我們將使用真實的 [Oxford-IIIT](https://www.robots.ox.ac.uk/~vgg/data/pets/) 寵物數據集,其中包含 35 種貓和狗的品種,並構建一個遷移學習分類器。
|
||||
|
||||
---
|
||||
|
||||
|
|
@ -0,0 +1,108 @@
|
|||
# 深度學習訓練技巧
|
||||
|
||||
隨著神經網絡變得越來越深,其訓練過程也變得越來越具挑戰性。一個主要問題是所謂的[梯度消失](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)對這些問題進行了很好的介紹。
|
||||
|
||||
為了讓深層網絡的訓練更高效,可以採用一些技巧。
|
||||
|
||||
## 保持數值在合理範圍內
|
||||
|
||||
為了讓數值計算更穩定,我們需要確保神經網絡中的所有數值都在合理的範圍內,通常是 [-1..1] 或 [0..1]。這並不是一個非常嚴格的要求,但浮點數計算的特性使得不同量級的數值無法準確地一起操作。例如,如果我們將 10<sup>-10</sup> 和 10<sup>10</sup> 相加,結果很可能是 10<sup>10</sup>,因為較小的數值會被“轉換”到與較大數值相同的量級,從而導致尾數丟失。
|
||||
|
||||
大多數激活函數在 [-1..1] 範圍內具有非線性特性,因此將所有輸入數據縮放到 [-1..1] 或 [0..1] 範圍內是有意義的。
|
||||
|
||||
## 初始權重初始化
|
||||
|
||||
理想情況下,我們希望數值在通過網絡層後仍然保持在相同的範圍內。因此,初始化權重時需要以某種方式保留數值的分佈。
|
||||
|
||||
正態分佈 **N(0,1)** 並不是一個好主意,因為如果我們有 *n* 個輸入,輸出的標準差將是 *n*,數值很可能會跳出 [0..1] 範圍。
|
||||
|
||||
以下是常用的初始化方法:
|
||||
|
||||
- 均勻分佈 -- `uniform`
|
||||
- **N(0,1/n)** -- `gaussian`
|
||||
- **N(0,1/√n_in)** 保證對於均值為零且標準差為 1 的輸入,輸出仍然保持相同的均值和標準差
|
||||
- **N(0,√2/(n_in+n_out))** -- 所謂的 **Xavier 初始化** (`glorot`),它有助於在前向和後向傳播中保持信號在合理範圍內
|
||||
|
||||
## 批量正規化
|
||||
|
||||
即使有了適當的權重初始化,訓練過程中權重仍可能變得過大或過小,從而使信號超出合理範圍。我們可以通過使用某些**正規化**技術將信號拉回合理範圍。雖然有多種正規化技術(如權重正規化、層正規化),但最常用的是批量正規化。
|
||||
|
||||
**批量正規化**的核心思想是考慮小批量中的所有數值,並基於這些數值進行正規化(即減去均值並除以標準差)。它被實現為一個網絡層,在應用權重後但在激活函數之前執行此正規化。結果是,我們通常可以看到更高的最終準確率和更快的訓練速度。
|
||||
|
||||
這是批量正規化的[原始論文](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/))。
|
||||
|
||||
## Dropout
|
||||
|
||||
**Dropout** 是一種有趣的技術,它在訓練過程中隨機移除一定比例的神經元。它被實現為一個層,具有一個參數(要移除的神經元百分比,通常為 10%-50%),在訓練過程中,它會將輸入向量的隨機元素設為零,然後再傳遞到下一層。
|
||||
|
||||
雖然這聽起來像是一個奇怪的想法,但你可以在 [`Dropout.ipynb`](../../../../../lessons/4-ComputerVision/08-TransferLearning/Dropout.ipynb) 筆記本中看到 Dropout 對訓練 MNIST 數字分類器的效果。它加速了訓練,並使我們能夠在更少的訓練輪次中實現更高的準確率。
|
||||
|
||||
這種效果可以用幾種方式解釋:
|
||||
|
||||
- 它可以被認為是對模型的一種隨機衝擊,將優化從局部最小值中拉出
|
||||
- 它可以被認為是*隱式模型平均化*,因為我們可以說在 Dropout 過程中,我們訓練了稍微不同的模型
|
||||
|
||||
> *有人說,當一個醉酒的人試圖學習某些東西時,與清醒的人相比,他第二天早上會記得更清楚,因為一個有些神經元失效的大腦會更努力地適應以抓住意義。我們自己從未測試過這是否屬實。*
|
||||
|
||||
## 防止過擬合
|
||||
|
||||
深度學習的一個非常重要的方面是能夠防止[過擬合](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)。雖然使用非常強大的神經網絡模型可能很有吸引力,但我們應該始終平衡模型參數的數量與訓練樣本的數量。
|
||||
|
||||
> 確保你理解我們之前介紹的[過擬合](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)概念!
|
||||
|
||||
有幾種方法可以防止過擬合:
|
||||
|
||||
- 提前停止 -- 持續監控驗證集上的錯誤,當驗證錯誤開始增加時停止訓練。
|
||||
- 顯式權重衰減 / 正則化 -- 在損失函數中添加一個對權重絕對值的額外懲罰,防止模型產生非常不穩定的結果
|
||||
- 模型平均化 -- 訓練多個模型,然後對結果進行平均。這有助於最小化方差。
|
||||
- Dropout(隱式模型平均化)
|
||||
|
||||
## 優化器 / 訓練算法
|
||||
|
||||
訓練的另一個重要方面是選擇好的訓練算法。雖然經典的**梯度下降**是一個合理的選擇,但它有時可能太慢,或者導致其他問題。
|
||||
|
||||
在深度學習中,我們使用**隨機梯度下降**(SGD),這是一種應用於隨機選擇的小批量數據的梯度下降方法。權重的調整公式如下:
|
||||
|
||||
w<sup>t+1</sup> = w<sup>t</sup> - η∇ℒ
|
||||
|
||||
### 動量
|
||||
|
||||
在**動量 SGD** 中,我們保留了前幾步的部分梯度。這類似於當我們帶著慣性移動時,受到一個不同方向的衝擊,我們的軌跡不會立即改變,而是保留了一部分原來的運動。這裡我們引入另一個向量 v 來表示*速度*:
|
||||
|
||||
- v<sup>t+1</sup> = γ v<sup>t</sup> - η∇ℒ
|
||||
- w<sup>t+1</sup> = w<sup>t</sup> + v<sup>t+1</sup>
|
||||
|
||||
這裡參數 γ 表示我們考慮慣性的程度:γ=0 對應於經典 SGD;γ=1 是純粹的運動方程。
|
||||
|
||||
### Adam、Adagrad 等
|
||||
|
||||
由於在每一層中,我們將信號乘以某個矩陣 W<sub>i</sub>,根據 ||W<sub>i</sub>||,梯度可能會減小接近於 0,或者無限增大。這正是梯度爆炸/消失問題的本質。
|
||||
|
||||
解決這個問題的一種方法是僅在公式中使用梯度的方向,而忽略其絕對值,即:
|
||||
|
||||
w<sup>t+1</sup> = w<sup>t</sup> - η(∇ℒ/||∇ℒ||),其中 ||∇ℒ|| = √∑(∇ℒ)<sup>2</sup>
|
||||
|
||||
這種算法被稱為 **Adagrad**。其他使用相同思想的算法包括:**RMSProp**、**Adam**
|
||||
|
||||
> **Adam** 被認為是許多應用中非常高效的算法,因此如果你不確定該使用哪一種,選擇 Adam。
|
||||
|
||||
### 梯度裁剪
|
||||
|
||||
梯度裁剪是上述思想的擴展。當 ||∇ℒ|| ≤ θ 時,我們在權重優化中考慮原始梯度;而當 ||∇ℒ|| > θ 時,我們將梯度除以其範數。這裡 θ 是一個參數,在大多數情況下我們可以取 θ=1 或 θ=10。
|
||||
|
||||
### 學習率衰減
|
||||
|
||||
訓練的成功通常取決於學習率參數 η。可以合理地假設,較大的 η 值會導致更快的訓練,這是我們通常在訓練初期所希望的,而較小的 η 值則允許我們對網絡進行微調。因此,在大多數情況下,我們希望在訓練過程中逐漸減小 η。
|
||||
|
||||
這可以通過在每個訓練輪次後將 η 乘以某個數字(例如 0.98)來實現,或者使用更複雜的**學習率調度**。
|
||||
|
||||
## 不同的網絡架構
|
||||
|
||||
為你的問題選擇合適的網絡架構可能很棘手。通常,我們會選擇一個已被證明適用於我們特定任務(或類似任務)的架構。這裡有一個[神經網絡架構的良好概述](https://www.topbots.com/a-brief-history-of-neural-network-architectures/),適用於計算機視覺。
|
||||
|
||||
> 選擇一個對於我們擁有的訓練樣本數量來說足夠強大的架構非常重要。選擇過於強大的模型可能會導致[過擬合](../../3-NeuralNetworks/05-Frameworks/Overfitting.md)。
|
||||
|
||||
另一個不錯的方法是使用一個能自動調整到所需複雜度的架構。在某種程度上,**ResNet** 架構和 **Inception** 是自我調整的。[更多關於計算機視覺架構的信息](../07-ConvNets/CNN_Architectures.md)
|
||||
|
||||
**免責聲明**:
|
||||
本文件已使用人工智能翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原文文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Loading…
Reference in New Issue