一. bags of specials
1. swish激活函數
f(x) = x • sigmoid(x)
2. Mish 激活函數
3. spatial pyramid pooling(SPP)
citehttps://arxiv.org/abs/1406.4729
傳統的卷積神經網絡,對輸入圖像的大小有嚴格要求,例如LeNet5只能爲224x224,這要求我們在使用網絡前需要對圖像進行一些預處理操作.爲了解決這個麻煩,何愷明發明瞭SPP這個局部結構,把SPP放在卷積層和全連接層之間,從而很好地解決了這個問題.
下面是一個例子:
圖像經過卷積層,來到全連接層前面, 在input image size不確定的情況下(可能224x224,可能256x448),它經過層層卷積處理後的輸出,即一組feature map的數量是固定的,只是feature map size 不確定.然而接下來的全連接層的輸入量是固定的(4096), 我們對這些feature maps進行以下處理再輸入到全連接層裏:
假設有256張feature map
對256張feature map分別進行如圖所示的三種max-pooling,控制三種max-pooling的輸出嚴格爲4x4 size, 2x2 size, 1x1 size, 將這些輸出cancatenate到一起作爲全連接層的輸入.如上操作即爲SPP處理.
4. 特徵融合Feature Pyramid Network (FPN)
citehttps://arxiv.org/abs/1612.03144
5. Squeeze-and-Excitation(SE)
citehttps://arxiv.org/abs/1709.01507
一種channel-wise的注意力機制
下圖從U的輸出到X的輸出這段即爲SE
直接說,
Squeeze: 先對U做一個global average pooling
Excitation: 輸出的1x1xC數據做兩級全連接,最後sigmoid限制到[0,1]的範圍.
Scale: 然後把這個值對應着乘到U的C個通道上,作爲下一級的輸入.
兩個例子:
6.Spatial Attention Module
一種point-wise的注意力機制
對feature maps, 分別從通道維度進行求平均值和求最大, 合併得到一個通道數爲2的卷積層,然後通過一個卷積,得到一個通道數爲1的spatial attention.
直觀圖示:
準確代碼實現:
#cite https://zhuanlan.zhihu.com/p/102035273 class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super(SpatialAttention, self).__init__() assert kernel_size in (3,7), "kernel size must be 3 or 7" padding = 3 if kernel_size == 7 else 1 self.conv = nn.Conv2d(2,1,kernel_size, padding=padding, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avgout = torch.mean(x, dim=1, keepdim=True) maxout, _ = torch.max(x, dim=1, keepdim=True) x = torch.cat([avgout, maxout], dim=1) x = self.conv(x) return self.sigmoid(x)
yolov4中作了微調,改爲了
9. PAN
yolov4中用到的微調的PAN