【CV08】1×1卷積如何控制模型複雜度


channel上的卷積

卷積運算是將較小的濾波器線性應用於較大的輸入,從而生成輸出特徵圖(feature map)

應用於輸入圖像或輸入特徵圖的卷積核(filter)的運算結果爲單個數值。filter對輸入進行從左到右和從上到下的卷積操作,結果爲二維特徵圖,一個filter創建一個對應的特徵圖。

filter必須具有與輸入相同的深度或通道數,但是,無論輸入和filter的深度如何,最終的輸出都是一個數值,並且一個filter會創建一個具有單個通道的特徵圖。例如:

  • 如果輸入具有一個通道,例如3x3x1的灰度圖,則應使用3×3的filter。
  • 如果輸入圖像具有RGB三個通道,例如3x3x3的RGB圖像,則應使用3×3的filter。
  • 如果輸入是來自另一個卷積或池化層的特徵圖,並且深度爲64,則應在3x3x64的特徵圖中,使用3×3的filter,以創建單個值以構成單個輸出的特徵圖。

一個卷積層的輸出深度僅由應用於輸入的filter的數量決定。


特徵圖過多導致的問題

卷積層中輸入的深度或過濾器的數量通常隨網絡的深度而增加,從而導致生成的特徵圖的數量增加。這是一種常見的模型設計模式。此外,某些網絡結構(例如inception)也可以連接來自多個卷積層的輸出特徵圖,這也可能會大大增加後續卷積層的輸入深度。

卷積神經網絡中的大量特徵圖可能會引起問題,因爲必須向下執行整個輸入深度的卷積運算。如果要執行的卷積運算相對較大(例如5×5或7×7像素),這將是一個特別的問題,因爲它可能導致更多的參數(權重),進而導致執行卷積運算的計算(較大時空複雜度)。

池化層旨在縮小特徵圖的比例,並系統地將網絡中特徵圖的寬度和高度減半。但是,池化層不會更改模型中filter的數量、深度、通道的數量。 深度卷積神經網絡需要相應的池化類型的層,該層可以下采樣,減少特徵圖的深度或數量。


使用1×1的filter下采樣特徵圖

解決方法是使用1×1的filter向下採樣特徵圖的深度或數量。

1×1的filter的輸入中,每個通道只有一個參數或權重,與其它filter一樣,其結果也是一個單值。這種結構允許1×1的filter像單個神經元一樣起作用,並且輸入來自每個輸入特徵圖的相同位置。然後,可以單步移動,從左到右,從上到下,系統地應用該單個神經元,而無需進行填充,從而得到寬度和高度與輸入相同的特徵圖。

1×1的filter非常簡單,以至於在輸入中不包含任何相鄰像素。它可能不被認爲是卷積運算,相反,它是輸入的線性加權或投影。此外,與其它卷積層一樣使用非線性,從而允許投影對輸入特徵圖執行有意義的計算。1×1的filter提供了一種有效彙總輸入要素圖的方法。依次使用多個1×1的filter,可以調整要創建的輸入要素圖的摘要數量,從而有效地根據需要增加或減少要素圖的深度。

在卷積神經網絡中,使用1×1的filter的卷積層來控制特徵圖的數量。它通常被稱爲投影操作(projection operation)或投影層,或者甚至稱爲特徵圖或通道池化層(channel pooling layer)

Keras代碼:

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(512, (1,1), activation='relu'))

減少特徵圖

1×1的filter可用於減少特徵圖的數量,這是此類filter最常見的應用,因此該層通常稱爲特徵圖池化層(feature map pooling layer)

下例將深度(或通道)從512減少到64。如果要添加到模型中的後續層是另一個具有7×7濾鏡的卷積層,則這可能很有用。這些filter只會應用在64個channel上,而不是512。

此外,將具有64個7×7的filter應用深度爲512的特徵圖,將產生大約一百萬個參數(權重)。如果使用1×1的filter先將特徵圖的數量減少到64,則再使用7×7的卷積時,所需的參數數量僅爲大約200000。

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(512, (3,3), padding='same', activation='relu', input_shape=(256, 256, 3)))
model.add(Conv2D(64, (1,1), activation='relu'))

model.summary()

增加特徵圖

1×1的filter可用於增加特徵圖的數量,這是在應用另一個卷積層之前在池化層之後的常用操作。

filter的投影效果可以根據需要多次應用於輸入,從而允許按比例放大特徵圖的數量,並且具有捕獲原始要素的顯着特徵的成分。

from keras.models import Sequential
from keras.layers import Conv2D

model = Sequential()
model.add(Conv2D(512, (3,3), padding='same', activation='relu', input_shape=(256, 256, 3)))
model.add(Conv2D(1024, (1,1), activation='relu'))

model.summary()

CNN模型中的應用

2013年的Paper,Network In Network 提出了一種新型的深層網絡結構——1×1卷積,稱爲Network In Network(NIN),這種級聯的跨通道參數池化結構允許跨通道信息進行復雜且可學習的交互。每個池化層在輸入特徵圖上執行加權線性重組,然後使用ReLU激活。[…]跨通道參數池化層也等效於具有1×1卷積核的卷積層。

GoogLeNet

2014年的Paper,Going Deeper with Convolutions提出了Inception,其中特徵圖的輸入塊由不同的卷積層並行處理,每個卷積層均具有不同大小的filter,其中包括尺寸爲1×1的filter。
在這裏插入圖片描述
然後,將並行層的輸出按通道進行堆疊,從而形成非常深的卷積層,以供後續的模塊處理。池化層的輸出與卷積層的輸出的合併將不可避免地導致各個階段的輸出數量的增加。即使此結構可能涵蓋了最佳的稀疏結構,它也會非常低效地進行處理,從而導致在幾個階段內出現計算爆炸。解決方法是將Inception模塊重新設計爲使用1×1的filter,以減少5×5和7×7的filter的並行卷積層之前的特徵圖數量。

在這裏插入圖片描述


ResNet

2015年的Paper,Deep Residual Learning for Image Recognition中將1×1的filter用作投影技巧,以將輸入filter的數量與殘差塊的輸出相匹配。由於輸入已添加到模塊的輸出中,因此尺寸必須在寬度,高度和深度匹配。可以通過填充來保持寬度和高度,儘管可以使用1×1過濾器根據需要更改輸入的深度,以便可以將其與模塊的輸出相加。這種連接稱爲投影快捷連接(projection shortcut connection)。此外,殘差塊使用1×1的filter的bottleneck來減少特徵圖的數量。

在這裏插入圖片描述


參考:
https://machinelearningmastery.com/introduction-to-1x1-convolutions-to-reduce-the-complexity-of-convolutional-neural-networks/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章