chore(i18n): sync translations with latest source changes (chunk 6/8, 21 changes)

This commit is contained in:
localizeflow[bot] 2026-01-30 01:17:34 +00:00
parent b0d8fb988f
commit 51964ff48a
21 changed files with 20981 additions and 0 deletions

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,123 @@
# 神經網路框架
正如我們已經學到的,要能有效地訓練神經網路,我們需要做到以下兩件事:
* 操作張量,例如進行乘法、加法,並計算一些函數如 sigmoid 或 softmax
* 計算所有表達式的梯度,以便執行梯度下降優化
## [課前測驗](https://ff-quizzes.netlify.app/en/ai/quiz/9)
雖然 `numpy` 庫可以完成第一部分,但我們需要某種機制來計算梯度。在[我們的框架](../04-OwnFramework/OwnFramework.ipynb)中,我們在上一節中開發的框架需要手動在 `backward` 方法中編寫所有導數函數,該方法負責反向傳播。理想情況下,一個框架應該能讓我們計算*任何表達式*的梯度。
另一個重要的事情是能夠在 GPU 或其他專用計算單元(例如 [TPU](https://en.wikipedia.org/wiki/Tensor_Processing_Unit))上執行計算。深度神經網路的訓練需要*大量*的計算,能夠在 GPU 上並行化這些計算非常重要。
> ✅ 「並行化」這個術語指的是將計算分配到多個設備上。
目前,最流行的兩個神經網路框架是:[TensorFlow](http://TensorFlow.org) 和 [PyTorch](https://pytorch.org/)。這兩者都提供了低階 API用於在 CPU 和 GPU 上操作張量。在低階 API 之上,還有高階 API分別是 [Keras](https://keras.io/) 和 [PyTorch Lightning](https://pytorchlightning.ai/)。
低階 API | [TensorFlow](http://TensorFlow.org) | [PyTorch](https://pytorch.org/)
---------|-------------------------------------|--------------------------------
高階 API | [Keras](https://keras.io/) | [PyTorch Lightning](https://pytorchlightning.ai/)
**低階 API** 在這兩個框架中允許你構建所謂的**計算圖**。這個圖定義了如何使用給定的輸入參數計算輸出(通常是損失函數),並且可以在 GPU 上執行計算(如果可用)。框架提供了函數來對這個計算圖進行微分並計算梯度,這些梯度可以用於優化模型參數。
**高階 API** 則將神經網路視為**層的序列**,使得構建大多數神經網路變得更加容易。訓練模型通常需要準備數據,然後調用 `fit` 函數來完成工作。
高階 API 允許你快速構建典型的神經網路,而不需要擔心太多細節。同時,低階 API 提供了對訓練過程的更多控制,因此在研究新型神經網路架構時經常使用低階 API。
需要理解的一點是,你可以同時使用這兩種 API。例如你可以使用低階 API 開發自己的網路層架構,然後將其用於由高階 API 構建和訓練的更大網路中。或者,你可以使用高階 API 定義一個由層組成的網路,然後使用自己的低階訓練迴圈進行優化。這兩種 API 使用相同的基本概念,並且設計上能很好地協同工作。
## 學習
在本課程中,我們提供了大部分內容,既適用於 PyTorch也適用於 TensorFlow。你可以選擇自己偏好的框架僅學習相應的筆記本。如果你不確定選擇哪個框架可以在網上閱讀一些關於 **PyTorch vs. TensorFlow** 的討論。你也可以查看這兩個框架以加深理解。
在可能的情況下,我們會使用高階 API 以簡化操作。然而,我們認為理解神經網路的基礎運作非常重要,因此在開始時,我們會從低階 API 和張量開始學習。然而,如果你希望快速入門,不想花太多時間學習這些細節,你可以跳過這些部分,直接進入高階 API 的筆記本。
## ✍️ 練習:框架
繼續學習以下筆記本:
低階 API | [TensorFlow+Keras 筆記本](IntroKerasTF.ipynb) | [PyTorch](IntroPyTorch.ipynb)
---------|-------------------------------------|--------------------------------
高階 API | [Keras](IntroKeras.ipynb) | *PyTorch Lightning*
掌握框架後,讓我們回顧一下過擬合的概念。
# 過擬合
過擬合是機器學習中一個非常重要的概念,理解它至關重要!
考慮以下近似 5 個點(圖中的 `x`)的問題:
![線性模型](../../../../../translated_images/zh-MO/overfit1.f24b71c6f652e59e.webp) | ![過擬合模型](../../../../../translated_images/zh-MO/overfit2.131f5800ae10ca5e.webp)
-------------------------|--------------------------
**線性模型2 個參數** | **非線性模型7 個參數**
訓練誤差 = 5.3 | 訓練誤差 = 0
驗證誤差 = 5.1 | 驗證誤差 = 20
* 左邊的圖是一個良好的直線近似。由於參數數量適中,模型正確地捕捉了點的分佈。
* 右邊的模型過於強大。由於我們只有 5 個點,而模型有 7 個參數,它可以調整到通過所有點,使得訓練誤差為 0。然而這阻止了模型理解數據背後的正確模式因此驗證誤差非常高。
在模型的複雜度(參數數量)和訓練樣本數量之間找到正確的平衡非常重要。
## 為什麼會發生過擬合
* 訓練數據不足
* 模型過於強大
* 輸入數據中噪音過多
## 如何檢測過擬合
如上圖所示,過擬合可以通過非常低的訓練誤差和非常高的驗證誤差來檢測。通常在訓練過程中,我們會看到訓練誤差和驗證誤差都開始下降,然後在某個時候驗證誤差可能停止下降並開始上升。這將是過擬合的跡象,也是我們應該停止訓練的指示(或者至少保存模型的快照)。
![過擬合](../../../../../translated_images/zh-MO/Overfitting.408ad91cd90b4371.webp)
## 如何防止過擬合
如果你發現過擬合發生,可以採取以下措施:
* 增加訓練數據量
* 降低模型的複雜度
* 使用一些[正則化技術](../../4-ComputerVision/08-TransferLearning/TrainingTricks.md),例如 [Dropout](../../4-ComputerVision/08-TransferLearning/TrainingTricks.md#Dropout),我們稍後會討論。
## 過擬合與偏差-方差權衡
過擬合實際上是統計學中一個更通用的問題,稱為[偏差-方差權衡](https://en.wikipedia.org/wiki/Bias%E2%80%93variance_tradeoff)。如果我們考慮模型中的可能誤差來源,可以看到兩種類型的誤差:
* **偏差誤差**是由於我們的算法無法正確捕捉訓練數據之間的關係而引起的。這可能是因為模型不夠強大(**欠擬合**)。
* **方差誤差**是由於模型近似輸入數據中的噪音而不是有意義的關係(**過擬合**)。
在訓練過程中,偏差誤差會減少(因為模型學會了近似數據),而方差誤差會增加。重要的是要停止訓練——可以手動停止(當我們檢測到過擬合時)或自動停止(通過引入正則化)——以防止過擬合。
## 結論
在本課中,你學到了兩個最流行的 AI 框架 TensorFlow 和 PyTorch 的不同 API 之間的差異。此外,你還學到了非常重要的主題——過擬合。
## 🚀 挑戰
在配套的筆記本中,你會在底部找到「任務」;請完成筆記本中的任務。
## [課後測驗](https://ff-quizzes.netlify.app/en/ai/quiz/10)
## 回顧與自學
研究以下主題:
- TensorFlow
- PyTorch
- 過擬合
問自己以下問題:
- TensorFlow 和 PyTorch 有什麼區別?
- 過擬合和欠擬合有什麼區別?
## [作業](lab/README.md)
在本次實驗中,你需要使用 PyTorch 或 TensorFlow 解決兩個分類問題,分別使用單層和多層全連接網路。
* [說明](lab/README.md)
* [筆記本](lab/LabFrameworks.ipynb)
---

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,19 @@
# 使用 PyTorch/TensorFlow 進行分類
來自 [AI for Beginners Curriculum](https://github.com/microsoft/ai-for-beginners) 的實驗作業。
## 任務
使用 PyTorch 或 TensorFlow 解決兩個分類問題,分別使用單層和多層全連接網路:
1. **[Iris 分類](https://en.wikipedia.org/wiki/Iris_flower_data_set)** 問題 - 這是一個以表格輸入數據為基礎的問題,可以用傳統機器學習方法處理。你的目標是根據 4 個數值參數將鳶尾花分類為 3 個類別。
2. **MNIST** 手寫數字分類問題,我們之前已經見過。
嘗試不同的網路架構,以獲得最佳的準確率。
## 起始 Notebook
通過打開 [LabFrameworks.ipynb](../../../../../../lessons/3-NeuralNetworks/05-Frameworks/lab/LabFrameworks.ipynb) 開始實驗。
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。雖然我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或錯誤解釋不承擔責任。

View File

@ -0,0 +1,53 @@
# 神經網絡簡介
![神經網絡簡介內容摘要的手繪圖](../../../../translated_images/zh-MO/ai-neuralnetworks.1c687ae40bc86e83.webp)
如我們在介紹中所討論的,實現智能的一種方法是訓練一個**計算機模型**或**人工大腦**。自20世紀中期以來研究人員嘗試了不同的數學模型直到最近這一方向取得了巨大成功。這些模仿大腦的數學模型被稱為**神經網絡**。
> 有時神經網絡被稱為*人工神經網絡*Artificial Neural NetworksANNs以表明我們討論的是模型而不是實際的神經元網絡。
## 機器學習
神經網絡屬於一個更大的學科,稱為**機器學習**,其目標是利用數據訓練計算機模型以解決問題。機器學習是人工智能的重要組成部分,但我們在本課程中不涉及傳統的機器學習。
> 請訪問我們的獨立課程 **[機器學習入門](http://github.com/microsoft/ml-for-beginners)**,了解更多關於傳統機器學習的內容。
在機器學習中,我們假設有一些示例數據集 **X** 和相應的輸出值 **Y**。示例通常是由**特徵**組成的N維向量而輸出被稱為**標籤**。
我們將探討兩種最常見的機器學習問題:
* **分類**,即需要將輸入對象分類到兩個或多個類別中。
* **回歸**,即需要為每個輸入樣本預測一個數值。
> 當以張量表示輸入和輸出時,輸入數據集是一個大小為 M×N 的矩陣,其中 M 是樣本數量N 是特徵數量。輸出標籤 Y 是大小為 M 的向量。
在本課程中,我們將僅專注於神經網絡模型。
## 神經元的模型
從生物學中,我們知道大腦由神經細胞(神經元)組成,每個神經元都有多個“輸入”(樹突)和一個“輸出”(軸突)。樹突和軸突都可以傳導電信號,而它們之間的連接——稱為突觸——可以表現出不同程度的導電性,這些導電性由神經遞質調節。
![神經元模型](../../../../translated_images/zh-MO/synapse-wikipedia.ed20a9e4726ea1c6.webp) | ![神經元模型](../../../../translated_images/zh-MO/artneuron.1a5daa88d20ebe6f.webp)
----|----
真實神經元 *[圖片](https://en.wikipedia.org/wiki/Synapse#/media/File:SynapseSchematic_lines.svg) 來自維基百科)* | 人工神經元 *(作者提供圖片)*
因此,神經元的最簡單數學模型包含幾個輸入 X<sub>1</sub>, ..., X<sub>N</sub> 和一個輸出 Y以及一系列權重 W<sub>1</sub>, ..., W<sub>N</sub>。輸出計算公式為:
<img src="../../../../translated_images/zh-MO/netout.1eb15eb76fd76731.webp" alt="Y = f\left(\sum_{i=1}^N X_iW_i\right)" width="131" height="53" align="center"/>
其中 f 是某種非線性的**激活函數**。
> 早期的神經元模型在1943年由 Warren McCullock 和 Walter Pitts 在經典論文 [A logical calculus of the ideas immanent in nervous activity](https://www.cs.cmu.edu/~./epxing/Class/10715/reading/McCulloch.and.Pitts.pdf) 中描述。Donald Hebb 在他的書 "[The Organization of Behavior: A Neuropsychological Theory](https://books.google.com/books?id=VNetYrB8EBoC)" 中提出了這些網絡的訓練方法。
## 本章節內容
在本章節中,我們將學習以下內容:
* [感知器](03-Perceptron/README.md),一種最早的用於二類分類的神經網絡模型
* [多層網絡](04-OwnFramework/README.md),以及配套筆記本 [如何構建我們自己的框架](04-OwnFramework/OwnFramework.ipynb)
* [神經網絡框架](05-Frameworks/README.md),包括以下筆記本:[PyTorch](05-Frameworks/IntroPyTorch.ipynb) 和 [Keras/Tensorflow](05-Frameworks/IntroKerasTF.ipynb)
* [過擬合](../../../../lessons/3-NeuralNetworks/05-Frameworks)
---
**免責聲明**
本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵資訊,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,111 @@
# 電腦視覺簡介
[電腦視覺](https://wikipedia.org/wiki/Computer_vision)是一個旨在讓電腦能夠高層次理解數位影像的學科。這是一個相當廣泛的定義,因為*理解*可以有許多不同的含義,包括在圖片中找到物件(**物件檢測**)、理解正在發生的事情(**事件檢測**)、用文字描述圖片,或重建三維場景。此外,還有一些與人類影像相關的特殊任務,例如年齡和情感估算、人臉檢測與識別,以及三維姿態估算等。
## [課前測驗](https://ff-quizzes.netlify.app/en/ai/quiz/11)
電腦視覺最簡單的任務之一是**影像分類**。
電腦視覺通常被認為是人工智慧的一個分支。如今,大多數電腦視覺任務都是使用神經網路來解決的。我們將在本章節中學習更多用於電腦視覺的特殊神經網路類型,[卷積神經網路](../07-ConvNets/README.md)。
然而,在將影像傳遞給神經網路之前,許多情況下使用一些演算法技術來增強影像是有意義的。
以下是幾個可用於影像處理的 Python 庫:
* **[imageio](https://imageio.readthedocs.io/en/stable/)** 可用於讀取/寫入不同的影像格式。它還支持 ffmpeg一個將影片幀轉換為影像的有用工具。
* **[Pillow](https://pillow.readthedocs.io/en/stable/index.html)**(也稱為 PIL功能更強大還支持一些影像操作例如形態變化、調整調色板等。
* **[OpenCV](https://opencv.org/)** 是一個用 C++ 編寫的強大影像處理庫,已成為影像處理的*事實標準*。它有一個方便的 Python 介面。
* **[dlib](http://dlib.net/)** 是一個 C++ 庫,實現了許多機器學習演算法,包括一些電腦視覺演算法。它也有 Python 介面,可用於挑戰性任務,例如人臉和面部特徵檢測。
## OpenCV
[OpenCV](https://opencv.org/) 被認為是影像處理的*事實標準*。它包含許多有用的演算法,使用 C++ 實現。你也可以從 Python 調用 OpenCV。
學習 OpenCV 的好地方是[這個 Learn OpenCV 課程](https://learnopencv.com/getting-started-with-opencv/)。在我們的課程中,我們的目標不是學習 OpenCV而是向你展示一些使用它的例子以及如何使用。
### 加載影像
在 Python 中,影像可以方便地表示為 NumPy 陣列。例如,大小為 320x200 像素的灰度影像將存儲在一個 200x320 的陣列中,而相同尺寸的彩色影像將具有 200x320x3 的形狀(代表 3 個色彩通道)。要加載影像,可以使用以下程式碼:
```python
import cv2
import matplotlib.pyplot as plt
im = cv2.imread('image.jpeg')
plt.imshow(im)
```
傳統上OpenCV 使用 BGR藍-綠-紅)編碼來表示彩色影像,而其他 Python 工具則使用更傳統的 RGB紅-綠-藍)。為了使影像顯示正確,你需要將其轉換為 RGB 色彩空間,可以通過在 NumPy 陣列中交換維度,或者調用 OpenCV 函數來完成:
```python
im = cv2.cvtColor(im,cv2.COLOR_BGR2RGB)
```
同樣的 `cvtColor` 函數也可以用於執行其他色彩空間轉換,例如將影像轉換為灰度或 HSV色相-飽和度-亮度)色彩空間。
你還可以使用 OpenCV 逐幀加載影片——在練習 [OpenCV Notebook](OpenCV.ipynb) 中提供了一個例子。
### 影像處理
在將影像傳遞給神經網路之前你可能需要應用幾個預處理步驟。OpenCV 可以執行許多操作,包括:
* 使用 `im = cv2.resize(im, (320,200),interpolation=cv2.INTER_LANCZOS)` **調整影像大小**
* 使用 `im = cv2.medianBlur(im,3)``im = cv2.GaussianBlur(im, (3,3), 0)` **模糊影像**
* 改變影像的**亮度和對比度**可以通過 NumPy 陣列操作完成,如[這篇 Stackoverflow 筆記](https://stackoverflow.com/questions/39308030/how-do-i-increase-the-contrast-of-an-image-in-python-opencv)所述。
* 使用[閾值處理](https://docs.opencv.org/4.x/d7/d4d/tutorial_py_thresholding.html),通過調用 `cv2.threshold`/`cv2.adaptiveThreshold` 函數,這通常比調整亮度或對比度更可取。
* 對影像應用不同的[變換](https://docs.opencv.org/4.5.5/da/d6e/tutorial_py_geometric_transformations.html)
- **[仿射變換](https://docs.opencv.org/4.5.5/d4/d61/tutorial_warp_affine.html)** 如果你需要結合旋轉、調整大小和傾斜影像,並且知道影像中三個點的來源和目標位置,仿射變換會很有用。仿射變換保持平行線平行。
- **[透視變換](https://medium.com/analytics-vidhya/opencv-perspective-transformation-9edffefb2143)** 當你知道影像中四個點的來源和目標位置時,透視變換會很有用。例如,如果你用智能手機相機從某個角度拍攝矩形文件的照片,並希望生成該文件本身的矩形影像。
* 使用 **[光流](https://docs.opencv.org/4.5.5/d4/dee/tutorial_optical_flow.html)** 來理解影像中的運動。
## 使用電腦視覺的例子
在我們的 [OpenCV Notebook](OpenCV.ipynb) 中,我們提供了一些使用電腦視覺執行特定任務的例子:
* **預處理盲文書的照片**。我們專注於如何使用閾值處理、特徵檢測、透視變換和 NumPy 操作來分離單個盲文符號,以便進一步由神經網路進行分類。
![盲文影像](../../../../../translated_images/zh-MO/braille.341962ff76b1bd70.webp) | ![盲文影像預處理結果](../../../../../translated_images/zh-MO/braille-result.46530fea020b03c7.webp) | ![盲文符號](../../../../../translated_images/zh-MO/braille-symbols.0159185ab69d5339.webp)
----|-----|-----
> 圖片來自 [OpenCV.ipynb](OpenCV.ipynb)
* **使用幀差檢測影片中的運動**。如果相機固定,則來自相機的幀應該彼此非常相似。由於幀表示為陣列,只需對兩個連續幀的陣列進行相減,我們就能得到像素差異,靜態幀的差異應該很低,而當影像中有顯著運動時,差異會變高。
![影片幀和幀差的影像](../../../../../translated_images/zh-MO/frame-difference.706f805491a0883c.webp)
> 圖片來自 [OpenCV.ipynb](OpenCV.ipynb)
* **使用光流檢測運動**。[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html) 使我們能夠理解影片幀中每個像素的移動方式。有兩種類型的光流:
- **密集光流** 計算顯示每個像素移動方向的向量場
- **稀疏光流** 基於提取影像中的一些顯著特徵(例如邊緣),並從幀到幀構建它們的軌跡。
![光流影像](../../../../../translated_images/zh-MO/optical.1f4a94464579a83a.webp)
> 圖片來自 [OpenCV.ipynb](OpenCV.ipynb)
## ✍️ 範例筆記本: OpenCV [嘗試 OpenCV 實作](OpenCV.ipynb)
讓我們通過探索 [OpenCV Notebook](OpenCV.ipynb) 來進行一些 OpenCV 的實驗。
## 結論
有時,像運動檢測或指尖檢測這樣相對複雜的任務可以純粹通過電腦視覺來解決。因此,了解電腦視覺的基本技術以及像 OpenCV 這樣的庫能做什麼是非常有幫助的。
## 🚀 挑戰
觀看 [這段影片](https://docs.microsoft.com/shows/ai-show/ai-show--2021-opencv-ai-competition--grand-prize-winners--cortic-tigers--episode-32?WT.mc_id=academic-77998-cacaste),了解 Cortic Tigers 項目以及他們如何通過機器人構建基於模塊的解決方案來普及電腦視覺任務。研究其他類似項目,了解它們如何幫助新學習者進入這個領域。
## [課後測驗](https://ff-quizzes.netlify.app/en/ai/quiz/12)
## 回顧與自學
閱讀更多關於光流的內容,[這篇精彩的教程](https://learnopencv.com/optical-flow-in-opencv/)。
## [作業](lab/README.md)
在這次實驗中,你將拍攝一段包含簡單手勢的影片,你的目標是使用光流提取上下左右的移動。
<img src="../../../../../translated_images/zh-MO/palm-movement.341495f0e9c47da3.webp" width="30%" alt="手掌移動幀"/>
---

View File

@ -0,0 +1,108 @@
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 使用光流技術檢測手掌移動\n",
"\n",
"此實驗是 [AI 初學者課程](http://aka.ms/ai-beginners) 的一部分。\n",
"\n",
"請參考[這段影片](../../../../../../lessons/4-ComputerVision/06-IntroCV/lab/palm-movement.mp4),影片中一個人的手掌在穩定的背景上向左/右/上/下移動。\n",
"\n",
"**你的目標**是使用光流技術來判斷影片中哪些部分包含向上/向下/向左/向右的移動。\n",
"\n",
"首先,按照課堂中的描述獲取影片幀:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"現在,按照講座中描述的計算密集光流幀,並將密集光流轉換為極座標:\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"為每個光流幀建立方向的直方圖。直方圖顯示有多少向量落在特定的區間內,並應該將幀中不同方向的運動區分開來。\n",
"\n",
"> 你可能也會想要將大小低於某個閾值的所有向量歸零。這樣可以去除影片中一些微小的多餘運動,例如眼睛和頭部的移動。\n",
"\n",
"繪製一些幀的直方圖。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"看著直方圖,應該很容易判斷移動的方向。你需要選擇那些對應於上/下/左/右方向的區間,並且超過某個閾值的區間。\n"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# Code here"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"恭喜!如果您已完成以上所有步驟,您已完成實驗!\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"\n---\n\n**免責聲明** \n本文件已使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。儘管我們努力確保翻譯的準確性,但請注意,自動翻譯可能包含錯誤或不準確之處。原始文件的母語版本應被視為權威來源。對於關鍵信息,建議使用專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。\n"
]
}
],
"metadata": {
"language_info": {
"name": "python"
},
"orig_nbformat": 4,
"coopTranslator": {
"original_hash": "153d9e417e079bf62f8f693002d0deaf",
"translation_date": "2025-08-28T11:10:32+00:00",
"source_file": "lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb",
"language_code": "mo"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -0,0 +1,22 @@
# 使用光流檢測移動
來自 [AI 初學者課程](https://aka.ms/ai-beginners) 的實驗作業。
## 任務
請參考[這段影片](../../../../../../lessons/4-ComputerVision/06-IntroCV/lab/palm-movement.mp4),影片中一個人的手掌在穩定的背景上向左/右/上/下移動。
**你的目標**是使用光流技術來判斷影片中哪些部分包含向上/向下/向左/向右的移動。
**進階目標**是實際追蹤手掌/手指的移動,使用膚色檢測,如[這篇部落格文章](https://dev.to/amarlearning/finger-detection-and-tracking-using-opencv-and-python-586m)或[這裡](http://www.benmeline.com/finger-tracking-with-opencv-and-python/)所描述。
## 起始筆記本
開啟 [MovementDetection.ipynb](../../../../../../lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb) 開始實驗。
## 收穫
有時候,像移動檢測或指尖檢測這樣相對複雜的任務,可以純粹透過電腦視覺來解決。因此,了解像 OpenCV 這樣的函式庫能做什麼是非常有幫助的。
**免責聲明**
本文件使用 AI 翻譯服務 [Co-op Translator](https://github.com/Azure/co-op-translator) 進行翻譯。我們致力於提供準確的翻譯,但請注意,自動翻譯可能包含錯誤或不準確之處。應以原始語言的文件作為權威來源。對於關鍵資訊,建議尋求專業人工翻譯。我們對因使用此翻譯而引起的任何誤解或誤釋不承擔責任。

View File

@ -0,0 +1,64 @@
# 常見的 CNN 架構
### VGG-16
VGG-16 是一個在 2014 年 ImageNet top-5 分類中達到 92.7% 準確率的網路。它的層結構如下:
![ImageNet Layers](../../../../../translated_images/zh-MO/vgg-16-arch1.d901a5583b3a51ba.webp)
如圖所示VGG 採用傳統的金字塔架構,即一系列的卷積-池化層。
![ImageNet Pyramid](../../../../../translated_images/zh-MO/vgg-16-arch.64ff2137f50dd49f.webp)
> 圖片來源:[Researchgate](https://www.researchgate.net/figure/Vgg16-model-structure-To-get-the-VGG-NIN-model-we-replace-the-2-nd-4-th-6-th-7-th_fig2_335194493)
### ResNet
ResNet 是由微軟研究院在 2015 年提出的一系列模型。ResNet 的核心概念是使用 **殘差塊**
<img src="../../../../../translated_images/zh-MO/resnet-block.aba4ccbcc0944434.webp" width="300"/>
> 圖片來源:[這篇論文](https://arxiv.org/pdf/1512.03385.pdf)
使用身份傳遞的原因是讓我們的層預測 **前一層結果與殘差塊輸出之間的差異**,因此得名 *殘差*。這些塊更容易訓練,並且可以構建包含數百個這樣的塊的網路(最常見的變體包括 ResNet-52、ResNet-101 和 ResNet-152
你也可以將這個網路理解為能夠根據數據集調整其複雜度。最初,在開始訓練網路時,權重值較小,大部分信號通過身份層傳遞。隨著訓練的進行,權重變大,網路參數的重要性增加,網路會調整以適應所需的表達能力,從而正確分類訓練圖像。
### Google Inception
Google Inception 架構進一步擴展了這一概念,將每一層構建為多條不同路徑的組合:
<img src="../../../../../translated_images/zh-MO/inception.a6605b85bcbc6f52.webp" width="400"/>
> 圖片來源:[Researchgate](https://www.researchgate.net/figure/Inception-module-with-dimension-reductions-left-and-schema-for-Inception-ResNet-v1_fig2_355547454)
在這裡,我們需要強調 1x1 卷積的作用,因為一開始它似乎沒有意義。為什麼需要用 1x1 的濾波器掃描圖像?然而,你需要記住,卷積濾波器也會處理多個深度通道(最初是 RGB 顏色,在後續層中是不同濾波器的通道),而 1x1 卷積用於通過不同的可訓練權重混合這些輸入通道。它也可以被視為在通道維度上的降維(池化)。
這裡有一篇[關於 1x1 卷積的好文章](https://medium.com/analytics-vidhya/talented-mr-1x1-comprehensive-look-at-1x1-convolution-in-deep-learning-f6b355825578),以及[原始論文](https://arxiv.org/pdf/1312.4400.pdf)。
### MobileNet
MobileNet 是一系列縮小尺寸的模型,適合用於移動設備。如果資源有限,並且可以接受稍微降低的準確率,可以使用它們。其核心概念是所謂的 **深度可分離卷積**,它允許通過空間卷積和深度通道上的 1x1 卷積的組合來表示卷積濾波器。這大大減少了參數數量,使網路尺寸更小,也更容易用較少的數據進行訓練。
這裡有一篇[關於 MobileNet 的好文章](https://medium.com/analytics-vidhya/image-classification-with-mobilenet-cc6fbb2cd470)。
## 結論
在本單元中,你已經學習了計算機視覺神經網路的主要概念——卷積網路。用於圖像分類、物體檢測甚至圖像生成的實際架構都基於 CNN只是層數更多並且加入了一些額外的訓練技巧。
## 🚀 挑戰
在附帶的筆記本中,底部有關於如何獲得更高準確率的筆記。進行一些實驗,看看是否能達到更高的準確率。
## [課後測驗](https://ff-quizzes.netlify.app/en/ai/quiz/14)
## 回顧與自學
雖然 CNN 最常用於計算機視覺任務,但它們通常也適合提取固定大小的模式。例如,如果我們處理聲音,也可以使用 CNN 在音頻信號中尋找某些特定模式——在這種情況下,濾波器將是 1 維的(這種 CNN 被稱為 1D-CNN。此外有時也會使用 3D-CNN 來提取多維空間中的特徵例如視頻中發生的某些事件——CNN 可以捕捉特徵隨時間變化的某些模式。進行一些回顧和自學,了解 CNN 還可以完成哪些其他任務。
## [作業](lab/README.md)
在本次實驗中,你的任務是分類不同的貓狗品種。這些圖像比 MNIST 數據集更複雜,尺寸更高,並且類別超過 10 種。
---

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,60 @@
# 卷積神經網絡
我們之前已經看到,神經網絡在處理圖像方面表現相當不錯,即使是單層感知器也能以合理的準確率識別 MNIST 數據集中的手寫數字。然而MNIST 數據集非常特殊,所有的數字都被居中放置在圖像中,這使得任務變得更簡單。
## [課前測驗](https://ff-quizzes.netlify.app/en/ai/quiz/13)
在現實生活中,我們希望能夠在圖片中識別物體,而不受其在圖像中具體位置的影響。計算機視覺與一般的分類不同,因為當我們試圖在圖片中找到某個物體時,我們是在掃描圖像以尋找一些特定的**模式**及其組合。例如,當尋找一隻貓時,我們可能首先尋找水平線,這些線可能形成貓的鬍鬚,然後某些鬍鬚的組合可以告訴我們這確實是一張貓的圖片。某些模式的相對位置和存在是重要的,而不是它們在圖像中的具體位置。
為了提取模式,我們將使用**卷積濾波器**的概念。正如你所知,圖像可以用二維矩陣或帶有色彩深度的三維張量來表示。應用濾波器意味著我們取一個相對較小的**濾波核**矩陣,並對原始圖像中的每個像素與其鄰近點進行加權平均。我們可以將其視為一個小窗口在整個圖像上滑動,並根據濾波核矩陣中的權重對所有像素進行平均。
![垂直邊緣濾波器](../../../../../translated_images/zh-MO/filter-vert.b7148390ca0bc356.webp) | ![水平邊緣濾波器](../../../../../translated_images/zh-MO/filter-horiz.59b80ed4feb946ef.webp)
----|----
> 圖片來源Dmitry Soshnikov
例如,如果我們對 MNIST 數字應用 3x3 的垂直邊緣和水平邊緣濾波器,我們可以在原始圖像中有垂直和水平邊緣的地方得到高亮(例如高值)。因此,這兩個濾波器可以用來“尋找”邊緣。同樣,我們可以設計不同的濾波器來尋找其他低層次的模式:
<img src="../../../../../translated_images/zh-MO/lmfilters.ea9e4868a82cf74c.webp" width="500" align="center"/>
> 圖片來源:[Leung-Malik 濾波器庫](https://www.robots.ox.ac.uk/~vgg/research/texclass/filters.html)
然而,雖然我們可以手動設計濾波器來提取某些模式,我們也可以設計網絡,使其能夠自動學習模式。這是 CNN 背後的主要思想之一。
## CNN 的主要思想
CNN 的工作方式基於以下重要思想:
* 卷積濾波器可以提取模式
* 我們可以設計網絡,使濾波器能夠自動訓練
* 我們可以使用相同的方法來在高層次特徵中找到模式而不僅僅是在原始圖像中。因此CNN 的特徵提取在特徵層次上工作,從低層次的像素組合開始,到更高層次的圖片部分組合。
![層次特徵提取](../../../../../translated_images/zh-MO/FeatureExtractionCNN.d9b456cbdae7cb64.webp)
> 圖片來源:[Hislop-Lynch 的論文](https://www.semanticscholar.org/paper/Computer-vision-based-pedestrian-trajectory-Hislop-Lynch/26e6f74853fc9bbb7487b06dc2cf095d36c9021d),基於[他們的研究](https://dl.acm.org/doi/abs/10.1145/1553374.1553453)
## ✍️ 練習:卷積神經網絡
讓我們繼續探索卷積神經網絡的工作原理,以及如何通過相關的筆記本實現可訓練的濾波器:
* [卷積神經網絡 - PyTorch](ConvNetsPyTorch.ipynb)
* [卷積神經網絡 - TensorFlow](ConvNetsTF.ipynb)
## 金字塔架構
大多數用於圖像處理的 CNN 都遵循所謂的金字塔架構。應用於原始圖像的第一個卷積層通常具有相對較少的濾波器8-16這些濾波器對應於不同的像素組合例如水平/垂直線條或筆劃。在下一層,我們減少網絡的空間維度,並增加濾波器的數量,這對應於更多簡單特徵的可能組合。隨著每一層的進展,當我們接近最終分類器時,圖像的空間維度減少,而濾波器的數量增加。
例如,讓我們看看 VGG-16 的架構,這是一個在 2014 年 ImageNet 的 top-5 分類中達到 92.7% 準確率的網絡:
![ImageNet 層](../../../../../translated_images/zh-MO/vgg-16-arch1.d901a5583b3a51ba.webp)
![ImageNet 金字塔](../../../../../translated_images/zh-MO/vgg-16-arch.64ff2137f50dd49f.webp)
> 圖片來源:[Researchgate](https://www.researchgate.net/figure/Vgg16-model-structure-To-get-the-VGG-NIN-model-we-replace-the-2-nd-4-th-6-th-7-th_fig2_335194493)
## 最知名的 CNN 架構
[繼續學習最知名的 CNN 架構](CNN_Architectures.md)
---

File diff suppressed because one or more lines are too long

View File

@ -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 種不同品種的狗和貓的圖片。
![我們將處理的數據集](../../../../../../translated_images/zh-MO/data.50b2a9d5484bdbf0.webp)
要下載數據集,請使用以下程式碼片段:
```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 準確率也是有意義的,因為有些類別即使對人類來說也不容易區分,容易混淆。
---
**免責聲明**
本文件已使用 AI 翻譯服務 [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

View File

@ -0,0 +1,81 @@
# 預訓練網絡與遷移學習
訓練 CNN 需要耗費大量時間,並且需要大量數據。然而,大部分時間都花在學習網絡用於從圖像中提取模式的最佳低層濾波器上。一個自然的問題是:我們是否可以使用在一個數據集上訓練的神經網絡,並將其適配於分類不同的圖像,而不需要完整的訓練過程?
## [課前測驗](https://ff-quizzes.netlify.app/en/ai/quiz/15)
這種方法被稱為**遷移學習**,因為我們將某些知識從一個神經網絡模型轉移到另一個模型。在遷移學習中,我們通常從一個預訓練模型開始,該模型已經在一些大型圖像數據集(例如 **ImageNet**)上進行了訓練。這些模型已經能夠很好地從通用圖像中提取不同的特徵,在許多情況下,只需在這些提取的特徵之上構建一個分類器就能取得良好的結果。
> ✅ 遷移學習這個術語在其他學術領域(例如教育)中也能找到,它指的是將一個領域的知識應用到另一個領域的過程。
## 預訓練模型作為特徵提取器
我們在上一節中討論的卷積網絡包含多層,每層都旨在從圖像中提取一些特徵,從低層的像素組合(例如水平/垂直線或筆劃)到高層的特徵組合(例如火焰的眼睛)。如果我們在足夠大的通用和多樣化的圖像數據集上訓練 CNN網絡應該能夠學習提取這些常見特徵。
Keras 和 PyTorch 都包含函數,可以輕鬆加載一些常見架構的預訓練神經網絡權重,其中大多數是在 ImageNet 圖像上訓練的。最常用的架構在上一課的 [CNN Architectures](../07-ConvNets/CNN_Architectures.md) 頁面中有描述。特別是,你可能會考慮使用以下模型之一:
* **VGG-16/VGG-19** 是相對簡單的模型,仍然能提供良好的準確性。通常使用 VGG 作為初步嘗試是一個不錯的選擇,可以看看遷移學習的效果。
* **ResNet** 是由微軟研究院在 2015 年提出的一系列模型。它們有更多層,因此需要更多資源。
* **MobileNet** 是一系列尺寸較小的模型,適合移動設備。如果資源有限並且可以接受稍微降低的準確性,可以使用它們。
以下是 VGG-16 網絡從一張貓的圖片中提取的特徵示例:
![VGG-16 提取的特徵](../../../../../translated_images/zh-MO/features.6291f9c7ba3a0b95.webp)
## 貓與狗數據集
在這個例子中,我們將使用 [貓與狗數據集](https://www.microsoft.com/download/details.aspx?id=54765&WT.mc_id=academic-77998-cacaste),這非常接近現實生活中的圖像分類場景。
## ✍️ 練習:遷移學習
讓我們在相應的筆記本中看看遷移學習的實際應用:
* [遷移學習 - PyTorch](TransferLearningPyTorch.ipynb)
* [遷移學習 - TensorFlow](TransferLearningTF.ipynb)
## 可視化對抗性貓
預訓練的神經網絡在其“腦海”中包含不同的模式,包括**理想貓**(以及理想狗、理想斑馬等)的概念。能以某種方式**可視化這些圖像**會很有趣。然而,這並不簡單,因為模式分散在網絡權重中,並且以層次結構組織。
我們可以採取的一種方法是從一張隨機圖像開始,然後嘗試使用**梯度下降優化**技術調整該圖像,使網絡開始認為它是一隻貓。
![圖像優化循環](../../../../../translated_images/zh-MO/ideal-cat-loop.999fbb8ff306e044.webp)
然而,如果我們這樣做,結果會非常接近隨機噪聲。這是因為*有很多方法可以讓網絡認為輸入圖像是一隻貓*,包括一些在視覺上沒有意義的方式。雖然這些圖像包含了許多典型的貓的模式,但並沒有任何約束使它們在視覺上更具辨識性。
為了改善結果,我們可以在損失函數中添加另一個項,稱為**變異損失**。它是一種度量,顯示圖像中相鄰像素的相似程度。最小化變異損失可以使圖像更平滑,並消除噪聲——從而揭示更具視覺吸引力的模式。以下是一些“理想”圖像的示例,它們被高概率分類為貓和斑馬:
![理想貓](../../../../../translated_images/zh-MO/ideal-cat.203dd4597643d6b0.webp) | ![理想斑馬](../../../../../translated_images/zh-MO/ideal-zebra.7f70e8b54ee15a7a.webp)
-----|-----
*理想貓* | *理想斑馬*
類似的方法可以用於對神經網絡進行所謂的**對抗性攻擊**。假設我們想要欺騙神經網絡,使一隻狗看起來像一隻貓。如果我們拿一張狗的圖片,該圖片被網絡識別為狗,然後稍微調整它,使用梯度下降優化,直到網絡開始將其分類為貓:
![狗的圖片](../../../../../translated_images/zh-MO/original-dog.8f68a67d2fe0911f.webp) | ![被分類為貓的狗圖片](../../../../../translated_images/zh-MO/adversarial-dog.d9fc7773b0142b89.webp)
-----|-----
*狗的原始圖片* | *被分類為貓的狗圖片*
查看以下筆記本中的代碼以重現上述結果:
* [理想與對抗性貓 - 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 種貓和狗的品種,我們將構建一個遷移學習分類器。
---

View File

@ -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)。
**免責聲明**
本文件使用 AI 翻譯服務 [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