iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0
自我挑戰組

30天初探tensorflow之旅系列 第 23

Day 23 認識Inception Model

  • 分享至 

  • xImage
  •  

前言
在查卷積神經網路的資料時,第一次認識到 Inception Model 這個東西,仔細查了一下發現它可以學的東西有很多,這邊簡單整理一下跟它有關的介紹和資訊。

什麼是 Inception Model?
Inception 模型(又稱為GoogLeNet)用於圖像分類任務,它可以輔助影像分析和物件偵測的卷積神經網路,並引入了 Inception 模塊的概念,能夠高效學習多尺度特徵。

主要組件和架構

  1. Inception模塊
    https://ithelp.ithome.com.tw/upload/images/20241007/20169330nLjJPi1B5Z.png
    Inception模塊是模型的核心,每個模塊由多條並行的卷積路徑組成,這些路徑使用不同大小的卷積核,而可以捕捉到多種不同尺度的特徵。每個分支都有不同的功能,以下分別介紹:
    (1)分支1(1x1卷積):
    這個分支的目的是用來進行通道數的降維,降低計算量,並提取特徵。
    (2)分支2(1x1後接3x3卷積):
    這個分支能夠捕捉較小的空間特徵,並增加模型的非線性表達能力。
    (3)分支3(1x1後接5x5卷積):
    這個分支的目的是捕捉更大的空間特徵,通常用來處理較大的物體。
    (4)分支4(3x3最大池化後接1x1卷積):
    通過最大池化來降低特徵圖的維度,然後使用1x1卷積來增加模型的表達能力。
    這些分支的輸出會在通道維度上進行拼接,形成最終的特徵表示。

  2. 全局平均池化(Global Average Pooling)
    https://ithelp.ithome.com.tw/upload/images/20241007/20169330Zb1AOpkteC.png
    與傳統的全連接層不同,Inception模型使用全局平均池化。這一層的作用是將每個特徵圖的所有像素取平均,從而產生一個固定大小的特徵向量,這樣可以減少參數數量,降低過擬合的風險。

  3. 輔助分類器
    在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()

稍微看一下輸出的結果:
https://ithelp.ithome.com.tw/upload/images/20241007/20169330kkYfQSD7BX.png
https://ithelp.ithome.com.tw/upload/images/20241007/20169330mtUOXGwlDD.png


上一篇
Day 22 如何儲存和讀取模型
下一篇
Day 24 AutoEncoder介紹
系列文
30天初探tensorflow之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言