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

This commit is contained in:
localizeflow[bot] 2026-01-30 01:25:02 +00:00
parent d01d40ddb2
commit 8e336f5ef4
21 changed files with 20995 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/)。這兩者都提供了在 CPU 和 GPU 上操作張量的低階 API。在低階 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 使用相同的基本概念,並且設計為能很好地協同工作。
## 學習
在本課程中,我們為 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-TW/overfit1.f24b71c6f652e59e.webp) | ![過擬合模型](../../../../../translated_images/zh-TW/overfit2.131f5800ae10ca5e.webp)
-------------------------|--------------------------
**線性模型2 個參數** | **非線性模型7 個參數**
訓練誤差 = 5.3 | 訓練誤差 = 0
驗證誤差 = 5.1 | 驗證誤差 = 20
* 左圖是一個良好的直線近似。由於參數數量適中,模型正確地捕捉了點的分佈規律。
* 右圖的模型過於強大。由於我們只有 5 個點,而模型有 7 個參數,它可以調整到通過所有點,使得訓練誤差為 0。然而這阻礙了模型理解數據背後的正確模式因此驗證誤差非常高。
在模型的複雜度(參數數量)和訓練樣本數量之間找到正確的平衡非常重要。
## 為什麼會發生過擬合
* 訓練數據不足
* 模型過於強大
* 輸入數據中噪聲過多
## 如何檢測過擬合
從上圖可以看出,過擬合可以通過非常低的訓練誤差和非常高的驗證誤差來檢測。通常在訓練過程中,我們會看到訓練誤差和驗證誤差都開始下降,但在某個時候,驗證誤差可能停止下降並開始上升。這將是過擬合的跡象,表明我們應該停止訓練(或者至少保存模型的快照)。
![過擬合圖示](../../../../../translated_images/zh-TW/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-TW/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-TW/synapse-wikipedia.ed20a9e4726ea1c6.webp) | ![神經元模型](../../../../translated_images/zh-TW/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-TW/netout.1eb15eb76fd76731.webp" alt="Y = f\left(\sum_{i=1}^N X_iW_i\right)" width="131" height="53" align="center"/>
其中 f 是某種非線性的**激活函數**。
> 早期的神經元模型在 Warren McCullock 和 Walter Pitts 於1943年發表的經典論文 [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,112 @@
# 電腦視覺簡介
[電腦視覺](https://wikipedia.org/wiki/Computer_vision)是一個旨在讓電腦能夠高層次理解數位影像的學科。這是一個相當廣泛的定義,因為*理解*可以有許多不同的含義,包括在圖片中找到物件(**物件檢測**)、理解正在發生的事情(**事件檢測**、用文字描述圖片或是重建3D場景。此外還有一些與人類影像相關的特殊任務例如年齡和情緒估算、人臉檢測與識別以及3D姿態估算等。
## [課前測驗](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-TW/braille.341962ff76b1bd70.webp) | ![盲文影像預處理結果](../../../../../translated_images/zh-TW/braille-result.46530fea020b03c7.webp) | ![盲文符號](../../../../../translated_images/zh-TW/braille-symbols.0159185ab69d5339.webp)
----|-----|-----
> 圖片來自 [OpenCV.ipynb](OpenCV.ipynb)
* **使用幀差檢測影片中的運動**。如果相機是固定的,那麼相機畫面中的幀應該彼此非常相似。由於幀被表示為陣列,只需對兩個連續幀的陣列進行相減,我們就能得到像素差異,靜態幀的差異應該很低,而當影像中有顯著運動時,差異會變高。
![影片幀和幀差的影像](../../../../../translated_images/zh-TW/frame-difference.706f805491a0883c.webp)
> 圖片來自 [OpenCV.ipynb](OpenCV.ipynb)
* **使用光流檢測運動**。[光流](https://docs.opencv.org/3.4/d4/dee/tutorial_optical_flow.html) 使我們能夠理解影片幀中每個像素的移動方式。光流有兩種類型:
- **密集光流** 計算每個像素的移動向量場
- **稀疏光流** 基於影像中的一些顯著特徵(例如邊緣),並從幀到幀構建它們的軌跡。
![光流影像](../../../../../translated_images/zh-TW/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-TW/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-31T09:49:27+00:00",
"source_file": "lessons/4-ComputerVision/06-IntroCV/lab/MovementDetection.ipynb",
"language_code": "tw"
}
},
"nbformat": 4,
"nbformat_minor": 2
}

View File

@ -0,0 +1,22 @@
# 使用光流檢測移動
來自 [AI for Beginners Curriculum](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 層結構](../../../../../translated_images/zh-TW/vgg-16-arch1.d901a5583b3a51ba.webp)
如圖所示VGG 採用了傳統的金字塔架構,也就是一系列的卷積-池化層。
![ImageNet 金字塔](../../../../../translated_images/zh-TW/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-TW/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-TW/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 來尋找音頻信號中的某些特定模式——在這種情況下,濾波器將是一維的(這樣的 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-TW/filter-vert.b7148390ca0bc356.webp) | ![水平邊緣濾波器](../../../../../translated_images/zh-TW/filter-horiz.59b80ed4feb946ef.webp)
----|----
> 圖片來源Dmitry Soshnikov
例如,如果我們對 MNIST 數字應用 3x3 的垂直邊緣和水平邊緣濾波器,我們可以在原始圖像中有垂直和水平邊緣的地方得到高亮(例如高值)。因此,這兩個濾波器可以用來“尋找”邊緣。同樣,我們可以設計不同的濾波器來尋找其他低層次的模式:
<img src="../../../../../translated_images/zh-TW/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-TW/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-TW/vgg-16-arch1.d901a5583b3a51ba.webp)
![ImageNet 金字塔](../../../../../translated_images/zh-TW/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-TW/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 架構](../07-ConvNets/CNN_Architectures.md) 頁面中有描述。特別是,你可能會考慮使用以下模型之一:
* **VGG-16/VGG-19**:這些是相對簡單的模型,但仍然能提供不錯的準確率。通常,使用 VGG 作為第一次嘗試是一個不錯的選擇,可以看看遷移學習的效果如何。
* **ResNet**:這是微軟研究院在 2015 年提出的一系列模型。它們有更多的層,因此需要更多的資源。
* **MobileNet**:這是一系列尺寸較小的模型,適合移動設備。如果你的資源有限,並且可以接受稍微降低的準確率,可以考慮使用它們。
以下是 VGG-16 網路從一張貓的圖片中提取的特徵示例:
![VGG-16 提取的特徵](../../../../../translated_images/zh-TW/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-TW/ideal-cat-loop.999fbb8ff306e044.webp)
然而,如果我們這樣做,我們會得到一些非常接近隨機噪聲的東西。這是因為*有很多方法可以讓網路認為輸入圖像是一隻貓*,其中一些方法在視覺上並不合理。雖然這些圖像包含了許多典型於貓的模式,但並沒有任何約束使它們在視覺上具有辨識度。
為了改善結果,我們可以在損失函數中添加另一個項,稱為**變異損失**。這是一種衡量圖像中相鄰像素相似程度的指標。最小化變異損失可以使圖像更平滑,並消除噪聲——從而揭示出更具視覺吸引力的模式。以下是一些這樣的「理想」圖像的例子,它們被高概率地分類為貓和斑馬:
![理想貓](../../../../../translated_images/zh-TW/ideal-cat.203dd4597643d6b0.webp) | ![理想斑馬](../../../../../translated_images/zh-TW/ideal-zebra.7f70e8b54ee15a7a.webp)
-----|-----
*理想貓* | *理想斑馬*
類似的方法可以用來對神經網路進行所謂的**對抗性攻擊**。假設我們想要欺騙神經網路,讓一隻狗看起來像一隻貓。如果我們拿一張狗的圖片,該圖片被網路識別為狗,然後稍微調整它,使用梯度下降優化,直到網路開始將其分類為貓:
![狗的圖片](../../../../../translated_images/zh-TW/original-dog.8f68a67d2fe0911f.webp) | ![被分類為貓的狗圖片](../../../../../translated_images/zh-TW/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