返回文章列表

影像分類別進階技術與遷移學習策略

本文探討影像分類別進階技術,包含遷移學習、微調策略與卷積神經網路。從預訓練模型的應用開始,逐步講解如何利用 TensorFlow Hub 和 Keras 載入與調整 MobileNet

機器學習 影像處理

本章節從機器學習模型的限制出發,探討如何利用影像的空間特性提升分類別效能。由於傳統的全連線層未能有效利用畫素間的關聯性,因此引入了遷移學習和卷積神經網路的概念。遷移學習的核心在於利用預訓練模型(如 MobileNet)提取影像特徵,並將這些特徵應用於新的分類別任務。透過 TensorFlow Hub 和 Keras,我們可以方便地載入和調整預訓練模型,並根據特定任務的需求進行微調。微調過程中,學習率的調整至關重要,適當的學習率排程策略(如熱身上升和指數衰減)以及差異化學習率的應用,可以有效提升模型的收斂性和準確度。此外,卷積神經網路透過卷積濾波器有效捕捉影像的空間特徵,每個濾波器學習不同的影像模式,並透過多個濾波器組合提取更豐富的資訊,進而提升影像分類別的效能。

第2章重點回顧與術語解析

本章探討如何構建簡單的資料管道,以讀取影像檔案並建立2D浮點數陣列。這些陣列被用作全連線機器學習模型的輸入。首先從線性模型開始,然後新增更多的密集層。研究發現,正則化對於限制過擬合至關重要,而改變學習率則會影響學習能力。

2.1 機器學習模型限制與未來方向

本章建立的模型並未充分利用影像的特殊結構,即相鄰畫素高度相關的特性。這將在第3章中進一步探討。然而,本章介紹的讀取影像、視覺化影像、建立機器學習模型以及使用機器學習模型進行預測的工具,仍將適用於更複雜的模型。本章所學的技術,如隱藏層、改變學習率、正則化、提前停止、超引數調優、丟棄法和批次歸一化,將在後續章節中持續應用。

2.2 重要術語解析

以下是本章介紹的重要術語,以供快速參考:

2.2.1 評估指標

  • 準確率(Accuracy):衡量分類別模型正確預測的比例,計算公式為 (TP + TN) / (TP + FP + TN + FN),其中TP代表真陽性,TN代表真陰性,FP代表假陽性,FN代表假陰性。
  • 精確率(Precision):衡量被識別為陽性的樣本中,真陽性的比例,計算公式為 TP / (TP + FP)。
  • 召回率(Recall):衡量所有真實陽性樣本中,被正確識別的比例,計算公式為 TP / (TP + FN)。
  • AUC(曲線下面積):真陽性率與假陽性率曲線下的面積,是一種閾值無關的評估指標。

2.2.2 機器學習模型元件

  • 啟用函式(Activation Function):對神經元輸入的加權和進行非線性轉換的函式,常見的有ReLU和sigmoid函式。
  • 密集層(Dense Layer):神經元之間全連線的層。
  • 神經元(Neuron):神經網路的基本單元,計算輸入的加權和,加上偏差後透過啟用函式輸出。
  • 張量(Tensor):一種多維數值容器,支援GPU加速的TensorFlow操作。

2.2.3 訓練相關概念

  • 批次(Batch 或 Mini-batch):訓練資料被分成批次進行訓練,有助於演算法收斂。批次維度通常是資料張量的第一維度。
  • 批次歸一化(Batch Normalization):在訓練過程中對每個神經元的輸入資料進行歸一化處理,引入兩個可學習引數。
  • 丟棄法(Dropout):一種正則化技術,在每次訓練迭代中隨機丟棄部分神經元。
  • 提前停止(Early Stopping):當驗證集誤差開始惡化時停止訓練。
  • 學習率(Learning Rate):控制每次訓練迭代中權重和偏差更新幅度的超引數。

2.2.4 其他重要概念

  • 交叉熵損失(Cross-entropy Loss):常用於分類別問題的損失函式。
  • Logits:神經元輸出在經過啟用函式之前的狀態,通常與sigmoid或softmax函式相關。
  • 正則化(Regularization):對模型權重或函式施加懲罰,以限制過擬合。常見的有L1和L2正則化。
  • Softmax:一種特殊的啟用函式,用於多分類別問題,將輸出轉化為機率分佈。

2.3 結語

本章為讀者奠定了機器學習模型開發的基礎,包括資料處理、模型構建、訓練和評估等關鍵步驟。後續章節將在此基礎上,進一步探討如何利用影像的特殊結構來提升模型效能。

影像視覺技術的革新:利用預訓練模型提升影像分類別準確度

在前一章中,我們探討了將畫素視為獨立輸入的機器學習模型。然而,傳統的全連線神經網路層在處理影像時表現不佳,因為它們未能充分利用相鄰畫素之間的高度相關性。本章將探討利用影像特殊性質的技術和模型架構,從而改善影像分類別的效能。

影像嵌入技術:從預訓練模型到遷移學習

深度神經網路可以被視為一種嵌入建立工具,能夠將輸入影像壓縮成一個低維度的表示向量(embedding)。這種表示向量捕捉了影像中的關鍵資訊,為後續的分類別任務提供了有力的支援。我們可以利用預訓練模型來建立嵌入,並透過遷移學習和微調來適應不同的資料集。

預訓練模型的優勢

預訓練模型是在大型資料集上訓練得到的,能夠學習到通用的特徵表示。將預訓練模型的嵌入建立部分應用於我們的資料集,可以有效地利用其學習到的知識。我們可以丟棄預訓練模型的最後一層(預測頭),並替換為我們自己的分類別層,從而實作知識的遷移。

使用 MobileNet 預訓練模型

MobileNet 是一種在 ImageNet 資料集上訓練的模型,具有百萬級別的引數。我們可以利用 TensorFlow Hub 載入預訓練的 MobileNet 模型,並將其作為 Keras 層新增到我們的模型中。

import tensorflow_hub as hub

hub_url = "https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4"
mobilenet_embedding_layer = hub.KerasLayer(
    handle=hub_url,
    input_shape=(IMG_HEIGHT, IMG_WIDTH, IMG_CHANNELS),
    trainable=False,
    name='mobilenet_embedding'
)

內容解密:

  1. hub.KerasLayer的使用:透過TensorFlow Hub匯入預訓練的MobileNet模型,並將其封裝為Keras層。
  2. trainable=False的設定:確保預訓練模型的權重在我們的任務中保持不變,避免因資料量不足導致的過擬合。
  3. input_shape引數:指定輸入影像的形狀,與我們的資料集保持一致。

遷移學習與模型構建

在載入預訓練模型後,我們可以構建一個新的模型,將預訓練模型作為第一層,後接全連線層進行分類別。

layers = [
    mobilenet_embedding_layer,
    tf.keras.layers.Dense(units=16, activation='relu', name='dense_hidden'),
    tf.keras.layers.Dense(units=len(CLASS_NAMES), activation='softmax', name='flower_prob')
]
model = tf.keras.Sequential(layers, name='flower_classification')

內容解密:

  1. 模型層次結構:利用預訓練模型的嵌入能力,後接兩層全連線層進行分類別。
  2. Dense層的選擇:第一層Dense使用ReLU啟用函式進行非線性變換,第二層Dense使用softmax啟用函式輸出分類別機率。
  3. units引數的設定:根據我們的分類別任務,調整每一層的神經元數量。

遷移學習與微調在影像分類別中的應用

遷移學習是一種利用預訓練模型來解決新任務的技術。在影像分類別任務中,預訓練模型通常是在大型資料集(如ImageNet)上訓練的深度神經網路。這些模型已經學習到了豐富的特徵,可以用來識別不同的影像。在本文中,我們將介紹如何在TensorFlow中使用預訓練模型進行遷移學習和微調。

使用TensorFlow Hub進行遷移學習

TensorFlow Hub是一個用於分享和重用機器學習模型的平台。我們可以使用TensorFlow Hub來載入預訓練的模型,並將其用於我們的影像分類別任務。

首先,我們需要載入預訓練的模型。在本例中,我們使用MobileNet模型,該模型是在ImageNet資料集上預訓練的。我們將模型的輸入層替換為我們的影像資料,並凍結模型的權重,只訓練最後兩層全連線層。

# 載入預訓練的MobileNet模型
hub_layer = hub.KerasLayer("https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/feature_vector/4",
                           input_shape=(224, 224, 3),
                           trainable=False)

# 建立新的模型
model = tf.keras.Sequential([
    hub_layer,
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(len(CLASSES), activation='softmax')
])

內容解密:

  1. 載入預訓練模型:使用hub.KerasLayer載入預訓練的MobileNet模型。該模型的輸入形狀為(224, 224, 3),表示輸入影像的大小為224x224,顏色通道數為3。
  2. 凍結模型權重:將trainable引數設為False,以凍結模型的權重。這樣可以防止在訓練過程中更新模型的權重。
  3. 新增全連線層:在預訓練模型的基礎上新增兩層全連線層。第一層具有256個神經元,使用ReLU啟用函式。第二層具有與類別數相同的神經元,使用softmax啟用函式。

使用Keras進行遷移學習

Keras提供了許多預訓練模型的實作,可以直接使用。我們可以使用tf.keras.applications模組來載入預訓練模型。

# 載入預訓練的MobileNetV2模型
pretrained_model = tf.keras.applications.MobileNetV2(
    weights='imagenet',
    include_top=False,
    input_shape=[IMG_HEIGHT, IMG_WIDTH, 3])

# 將模型的權重凍結
pretrained_model.trainable = False

# 建立新的模型
model = tf.keras.Sequential([
    tf.keras.layers.Lambda(lambda data: tf.keras.applications.mobilenet_v2.preprocess_input(tf.cast(data, tf.float32))),
    pretrained_model,
    tf.keras.layers.GlobalAveragePooling2D(),
    tf.keras.layers.Dense(256, activation='relu'),
    tf.keras.layers.Dense(len(CLASSES), activation='softmax')
])

內容解密:

  1. 載入預訓練模型:使用tf.keras.applications.MobileNetV2載入預訓練的MobileNetV2模型。該模型的權重是在ImageNet資料集上預訓練的。
  2. 凍結模型權重:將trainable屬性設為False,以凍結模型的權重。
  3. 資料前處理:使用tf.keras.layers.Lambda層對輸入資料進行前處理,將畫素值轉換為模型所需的格式。
  4. 新增全連線層:在預訓練模型的基礎上新增幾層全連線層,以實作自定義的分類別頭。

微調

在遷移學習中,我們凍結了預訓練模型的權重,只訓練了最後幾層全連線層。然而,在某些情況下,我們可能需要對預訓練模型的權重進行微調,以適應新的任務。

# 將預訓練模型的權重設為可訓練
pretrained_model.trainable = True

內容解密:

  1. 解凍模型權重:將trainable屬性設為True,以解凍模型的權重。這樣可以在訓練過程中更新模型的權重。
  2. 微調模型:透過解凍模型的權重,可以對模型進行微調,以適應新的任務。

微調預訓練模型的學習率策略最佳化

在進行預訓練模型的微調(fine-tuning)時,學習率(learning rate)的選擇與調整是至關重要的。錯誤的學習率可能會導致模型無法收斂或失去預訓練階段所獲得的知識。本文將探討如何透過學習率排程(learning rate schedule)與差異化學習率(differential learning rate)來最佳化微調過程,並提升模型在特定任務上的表現。

學習率排程的重要性

傳統的學習率排程策略是在訓練初期設定較高的學習率,然後隨著訓練的進行逐漸指數衰減(exponential decay)。然而,在微調預訓練模型時,加入一個初始的「熱身上升」(warm-up ramp)階段可以更有效地保護預訓練權重並提升模型的收斂性。

內容解密:

  • 圖表展示了兩種不同的學習率排程策略:傳統的指數衰減與加入熱身上升階段的最佳化策略。
  • 熱身上升階段能夠讓模型在初期以較小的步伐進行權重更新,避免破壞預訓練權重。

適當的學習率排程範例

透過採用合適的學習率排程策略,可以有效改善模型的收斂性和最終效能。圖3-7展示了採用熱身上升與指數衰減相結合的學習率排程後的損失曲線變化。

差異化學習率的應用

另一個有效的策略是採用差異化學習率,即對預訓練層使用較低的學習率,而對自定義的分類別層使用較高的學習率。這種方法能夠在保護預訓練權重的同時,針對特定任務進行有效的微調。

mult_by_layer = {
    'block1_': 0.1,
    'block2_': 0.15,
    'block3_': 0.2,
    # blocks 4 to 11
    'block12_': 0.8,
    'block13_': 0.9,
    'block14_': 0.95,
    'flower_prob': 1.0,  # 分類別層使用最大學習率
}
optimizer = AdamW(lr=LR_MAX, model=model, lr_multipliers=mult_by_layer)

內容解密:

  • mult_by_layer字典定義了不同網路層的學習率乘數,越深的層次使用越高的學習率。
  • AdamW最佳化器根據指定的lr_multipliers對不同層次應用不同的學習率,從而實作差異化微調。
  • 分類別層(flower_prob)使用最高的學習率,以確保能夠有效適應特定任務。

實驗結果與資料集挑戰

在104種花卉資料集(104 flowers dataset)上的實驗結果表明,適當的學習率排程與差異化學習率能夠顯著提升模型的收斂穩定性和最終準確率。該資料集具有超過23,000張圖片,涵蓋104類別花卉,且類別間樣本數量差異較大,因此需要使用更為精確的評估指標,如精確率(precision)、召回率(recall)和F1分數。

卷積神經網路(Convolutional Networks)

卷積層(Convolutional Layers)是專為處理影像資料而設計的,它們能夠在兩個維度上捕捉形狀資訊。卷積層透過在影像上滑動一個小的視窗(稱為卷積濾波器,Convolutional Filter),來提取影像中的語義資訊。

卷積濾波器(Convolutional Filters)

一個典型的4x4卷積濾波器會對影像的每個通道(channel)都有獨立的濾波器權重(filter weights)。對於具有紅、綠、藍三個色彩通道的彩色影像,濾波器總共會有4 * 4 * 3 = 48個可學習的權重。濾波器透過將鄰近畫素值與濾波器權重相乘並求和(稱為張量點積,tensor dot product),來計算出影像中每個位置的輸出值。這個過程稱為卷積(convolution)。

為什麼卷積濾波器有效?

卷積濾波器在影像處理中已經被使用了很長時間,它們可以實作多種不同的效果。例如,當濾波器的所有權重都相同時,它就變成了一個「平滑」濾波器(smoothing filter),因為視窗內每個畫素對輸出畫素的貢獻相同。調整權重的排列方式,可以建立邊緣檢測器和強度檢測器。

# 使用 tf.keras.layers.Conv2D 實作卷積層
tf.keras.layers.Conv2D(
    filters=5, 
    kernel_size=4, 
    padding='same'
)

內容解密:

  • filters=5:表示使用5個獨立的濾波器,每個濾波器都會產生一個輸出通道。
  • kernel_size=4:表示每個濾波器的大小是4x4。
  • padding='same':表示在輸入影像的邊緣進行零填充(zero-padding),以保持輸出與輸入具有相同的寬度和高度。

卷積層的輸入和輸出都是4D張量,第一維是批次大小(batch size)。例如,一批16張512x512畫素的彩色(RGB)影像,可以表示為一個形狀為[16, 512, 512, 3]的張量。

卷積層的優勢

卷積濾波器的優勢在於,它們能夠有效地限制神經網路的複雜度。一個5x5x3的濾波器只有75個權重,而這些權重會在整個影像上滑動。相比之下,全連線網路層(fully connected network layer)需要為每個節點計算大量的權重。

單一的卷積濾波器可以用非常少的引數處理整個影像,但這通常不足以代表影像的複雜性。因此,通常會使用多個這樣的濾波器。一個卷積層通常包含數十或數百個相似的濾波器,每個濾波器都有自己的獨立可學習權重。

卷積層的結構

理解卷積層的結構有助於計算其可學習權重的數量。如圖3-12所示,卷積層的權重矩陣(weights matrix)可以用來計算總的可學習權重數量。在這個例子中,使用5個濾波器,總的可學習權重數量是4 * 4 * 3 * 5 = 240。

圖示說明

此圖示展示了一個卷積層處理影像的過程,使用多個大小相同的卷積濾波器,但每個濾波器都有獨立的可學習權重。

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title 影像分類別進階技術與遷移學習策略

package "遷移學習架構" {
    package "預訓練模型" {
        component [MobileNet] as mobilenet
        component [ImageNet 權重] as weights
        component [特徵提取層] as feature_layer
    }

    package "微調策略" {
        component [凍結層] as freeze
        component [替換預測頭] as replace
        component [差異化學習率] as diff_lr
    }
}

package "學習率調度" {
    component [熱身上升] as warmup
    component [指數衰減] as decay
    component [學習率排程] as schedule
}

package "卷積神經網路" {
    component [卷積濾波器] as conv
    component [空間特徵] as spatial
    component [多濾波器組合] as multi
}

mobilenet --> weights : 預訓練
weights --> feature_layer : 嵌入提取
freeze --> replace : 遷移學習
replace --> diff_lr : 微調訓練
warmup --> decay : 學習率策略
conv --> spatial : 畫素關聯
spatial --> multi : 特徵組合

note right of mobilenet
  特徵工程包含:
  - 特徵選擇
  - 特徵轉換
  - 降維處理
end note

note right of eval
  評估指標:
  - 準確率/召回率
  - F1 Score
  - AUC-ROC
end note

@enduml

此圖示說明瞭卷積層如何將輸入影像轉換為多通道的2D輸出,並將其傳遞給下一個網路層進行進一步處理。