深度學習經典模型RESNET解析
1. 理論基礎
1. 殘差學習概念
深度神經網絡相當於函數的擬合過程(復合函數)。如果層數足夠深,CNN可以擬合任何一個函數。
如果當網絡的層數越來越深的時候,由於網絡的退化現象(不妨假設擬合的是H(x)),難以訓練出來。
那么可以改為訓練\(F(x) = H(x) - x\),此在數學上成為殘差(Residual)。則\(H(x) = F(x) + x\),相當於可以變相訓練H(x),這就是殘差學習。
用網絡實現:將x直接倒入到輸出,與經過權重層訓練出來的F(x)相加。x的這個通路沒有經過網絡直接跨接過來,稱為恆等映射短接(Identity Mapping Shortcut)。
2. RESNET構建形式
VGG19:19層,如果要擴展到34層,按設計原則堆積\(3\times3\)的小卷積核,那么這個34層的網絡稱為平凡的網絡,訓練的話會出現退化。
變成殘差網絡:在層與層之間增加恆等映射跨接層即可。注意跨接層的表示,虛線意味着特征的大小發生了變化,跨接層就不再是恆等映射了
RESNET可以有不同的層數,雖然層數不同,但其具有類似的網絡結構,例如它們都是分了五個部分:
\(7\times7\)的卷積,后面緊跟一個池化層。第二部分為conv2.x(論文中稱為stage),每一個stage里有多個block,不同的RESNET里每個stage中block的數目不一樣,重復的次數也不一樣,每個block是由若干個卷積層組成。
因此可以實現具有可擴展性的網絡。
特殊的結構:最大平均池化(Global average pooling),在最后把整個通道變成一個數字(求平均值,全局平均池化)。作用:替代全連接層,更少的參數(更少的出現過擬合)。
pytorch中:torch.nn.AdaptivAvgPool2d.(output_size)
50層以上/以下的RESNET不同之處:50-沒有bottle neck(瓶頸)。50層以上的block:三層組成,50層以下的block:兩層組成。(面試:問對哪個模型熟悉,實現過resnet嗎,50層+-區別...)。
bottle neck: \(1\times1 -> 3\times3 \ ->1\times1\)
使用的原因:如果不降維,增加深度的時候參數量將會變得非常大。
3. 新發展
ResNeXt:分組卷積...注意力機制...WSL弱監督訓練...
分組卷積最早出現在AlexNet(當時GPU顯存比較小),后來發現還能提高准確度。
2. 代碼實現
import torch
import torch.nn as nn
from torch.hub import load_state_dict_from url#預訓練權重值引入
model_urls = { }
#padding:擴充圖片, 在圖片外圍補充一些像素點,把這些像素點初始化為0.
#bias:偏置單元
def conv3x3(in_planes, out_planes, stride = 1, padding = 1):
return nn.Conv2d(in_planes, out_planes, kernel_size = 3, stride = stride, padding = padding, bias = False)#提前封裝一下3x3卷積,in_planes, out_planes為輸入輸出通道數的大小
#bias為False的原因?
def conv1x1(in_planes, out_planes, stride = 1):
return nn.Conv2d(in_planes, out_planes, kernel_size = 1, stride = stride, bias = False)
class BasicBlock(nn.module):#block類
super(BasicBlock, self).__init__()#調用父類的初始化函數
//未完待續