最近在看yolo3,發現對於1×1的卷積核的理解有些遺忘,藉此強化一下記憶。
最早我對此有些疑惑,1×1卷積核不會改變高(height)和寬(width)(在stride和padding等其他引數為預設狀態時), 但**通道數(channel)**可以隨意變化,例如在pytorch中:
nn. conv2d(
256,
256, kernel_size=
1)
nn. conv2d(
256,
512, kernel_size=
1)
nn. conv2d(
256,
128, kernel_size=
1)
可以理解為加入了非線性的一些因素,對通道進行非線性重組,使得不同通道內的資訊能夠互動(例如從64層縮小到32層),因為卷積運算不同於普通運算。
一般1×1都是用來做bottleneck的,先做1×1縮小,再做3×3放大。經過bottleneck可以有效縮小引數的規模,從而減少計算量,且在降維之後對資料的訓練和特徵提取將更加有效。
在yolo3中是這樣出現的:
def
conv2d
(filter_in, filter_out, kernel_size)
:#該函式與本文主要內容無關
pad =
(kernel_size -1)
//2if kernel_size else
0return nn.sequential(ordereddict([(
"conv"
, nn.conv2d(filter_in, filter_out, kernel_size=kernel_size, stride=
1, padding=pad, bias=
false))
,("bn"
, nn.batchnorm2d(filter_out)),
("relu"
, nn.leakyrelu(
0.1)),
]))# 例如:in_filters = 1024, filters_list = [512, 1024], out_filters = 75
defmake_last_layers
(filters_list, in_filters, out_filter)
: m = nn.modulelist(
[# 通過來來回回的自定義conv2d函式縮小引數規模
conv2d(in_filters, filters_list[0]
,1),
#先縮小,1*1的卷積核
conv2d(filters_list[0]
, filters_list[1]
,3),
#再放大,3*3的卷積核
conv2d(filters_list[1]
, filters_list[0]
,1),
#先縮小,1*1的卷積核
conv2d(filters_list[0]
, filters_list[1]
,3),
#再放大,3*3的卷積核
conv2d(filters_list[1]
, filters_list[0]
,1),
#最後縮小,1*1的卷積核(達到通道數為512的目標)
conv2d(filters_list[0]
, filters_list[1]
,3),
nn.conv2d(filters_list[1]
, out_filter, kernel_size=1,
stride=
1, padding=
0, bias=
true)]
)return m
(yolo3**引用自 卷積核引數的計算及1 1卷積核
首先,明確乙個概念 卷積並不只是乙個二維的過程,實際上對於輸入的一般而言是三個通道的 r g b 那為什麼輸出的結果可以是128個通道呢?實際上經過卷積過後的通道數是由卷積核的個數來決定的,整個的卷積過程二維情況下也就是在每個通道下發生的卷積過程為 在多通道情況下的卷積情況如下 其實濾波器的維度應該...
1 1卷積核的作用
如何理解跨通道的資訊互動和整合呢?首先還得從三維卷積的計算開始。如圖所示,藍色部分是乙個7 7 n 維數 的feature map,黃色塊為3 3 3的卷積核,將卷積核對應到藍色特徵中可以得到乙個紅色陰影區域,舉個具體的例子 假設卷積核所有的引數都為1。那麼紅色部分的數值 1 1 4 1 3 1 2...
卷積神經網路 1 1 卷積核
卷積神經網路中卷積核的作用是提取影象更高維的特徵,乙個卷積核代表一種特徵提取方式,對應產生乙個特徵圖,卷積核的尺寸對應感受野的大小。經典的卷積示意圖如下 5 5的影象使用3 3的卷積核進行卷積,結果產生3 3 5 3 1 的特徵影象。卷積核的大小一般是 2n 1 2n 1 的奇數乘奇數大小 n 1 ...