前言
在查卷積神經網路的資料時,第一次認識到 Inception Model 這個東西,仔細查了一下發現它可以學的東西有很多,這邊簡單整理一下跟它有關的介紹和資訊。
什麼是 Inception Model?
Inception 模型(又稱為GoogLeNet)用於圖像分類任務,它可以輔助影像分析和物件偵測的卷積神經網路,並引入了 Inception 模塊的概念,能夠高效學習多尺度特徵。
主要組件和架構
Inception模塊
Inception模塊是模型的核心,每個模塊由多條並行的卷積路徑組成,這些路徑使用不同大小的卷積核,而可以捕捉到多種不同尺度的特徵。每個分支都有不同的功能,以下分別介紹:
(1)分支1(1x1卷積):
這個分支的目的是用來進行通道數的降維,降低計算量,並提取特徵。
(2)分支2(1x1後接3x3卷積):
這個分支能夠捕捉較小的空間特徵,並增加模型的非線性表達能力。
(3)分支3(1x1後接5x5卷積):
這個分支的目的是捕捉更大的空間特徵,通常用來處理較大的物體。
(4)分支4(3x3最大池化後接1x1卷積):
通過最大池化來降低特徵圖的維度,然後使用1x1卷積來增加模型的表達能力。
這些分支的輸出會在通道維度上進行拼接,形成最終的特徵表示。
全局平均池化(Global Average Pooling)
與傳統的全連接層不同,Inception模型使用全局平均池化。這一層的作用是將每個特徵圖的所有像素取平均,從而產生一個固定大小的特徵向量,這樣可以減少參數數量,降低過擬合的風險。
輔助分類器
在Inception模型中為了提高訓練的穩定性,會在中間層插入輔助分類器,它的目的是提供額外的梯度信號,幫助深層網路更快收斂,它的設計通常包括1x1卷積來減少通道數,最後連接到softmax層進行分類。
優勢
1.多尺度特徵學習:
透過並行的卷積路徑,Inception模型能有效捕捉到多種不同尺度的特徵,這對於複雜的圖像識別任務非常重要。
2.計算效率:
透過1x1卷積來降低維度,Inception模型就會減少計算量,從而提高模型訓練和推斷的效率。
3.防止過擬合:
使用全局平均池化層和輔助分類器等技術,可以減少過擬合的風險,而提高模型的泛化能力。
4.靈活性:
Inception架構可以根據需要進行擴展和調整,讓它能夠適應不同的任務和資料集。
用Keras實現Inception模塊
以下示範用 Keras 實現簡化版 Inception 模塊:
先從各個分支開始
import tensorflow as tf
from tensorflow.keras import layers, models
def inception_module(x, filters):
branch1x1 = layers.Conv2D(filters[0], (1, 1), padding='same', activation='relu')(x)
branch3x3 = layers.Conv2D(filters[1], (1, 1), padding='same', activation='relu')(x)
branch3x3 = layers.Conv2D(filters[2], (3, 3), padding='same', activation='relu')(branch3x3)
branch5x5 = layers.Conv2D(filters[3], (1, 1), padding='same', activation='relu')(x)
branch5x5 = layers.Conv2D(filters[4], (5, 5), padding='same', activation='relu')(branch5x5)
branch_pool = layers.MaxPooling2D((3, 3), strides=(1, 1), padding='same')(x)
branch_pool = layers.Conv2D(filters[5], (1, 1), padding='same', activation='relu')(branch_pool)
最後拼接所有分支
outputs = layers.concatenate([branch1x1, branch3x3, branch5x5, branch_pool], axis=-1)
return outputs
就可以建立出簡化版的 Inception 模型
input_shape = (128, 128, 3)
inputs = layers.Input(shape=input_shape)
x = layers.Conv2D(32, (3, 3), padding='same', activation='relu')(inputs)
x = inception_module(x, [32, 64, 128, 16, 32, 32])
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dense(10, activation='softmax')(x)
model = models.Model(inputs, x)
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
model.summary()
稍微看一下輸出的結果: