LeNet(代碼),AlexNet簡單介紹,適合新手

寫在前面:老兵一個,轉行弄深度學習了。我的學習習慣不太好,先上船,後補票。哈哈,用Unet做了一個語義分割的工作試驗,感覺效果還不錯。就返回頭來開始給自己補充深度學習的相關知識吧。看到FCN(應該是語義分割開山之作吧),然後發現需要補充下一些其他知識。就對傳統的網絡做一個總結吧。小白總結,如有錯誤,大神幫忙指出,謝謝!!。

1.LeNet

直接在書本上盜圖,加了點自己的註釋。實現語句用pytorch

說明:

a.第一次卷積過程:nn.Conv2d(1, 6,5,0)#就是輸入通道1,輸出通道6,卷積核大小5*5,不做邊界填充。其他類似對應看。具體Conv2d查查就好,網上一堆介紹。

b.第一次池化:Maxpool2d(2,2)   #就是選2*2中最大的值唄

c.後面的卷積池化與上面縮寫類似。

d.全連接層。就是將16*5*5 = 400個數乘權重再加上偏置項再累加然後投放到1*120這個數組裏去,後面的全連接類似。

注意1:第二次池化過程中14*14*6這麼大的圖去做卷積 卷積核大小是5*5*6,最終結果是10*10*16 。 這個16 是說用了16個大小爲5*5*6的卷積覈對原圖(14*14*6)做了16次卷積。 每次卷積結果是10*10*6 然後將各通道對應位置值相加,得到個10*10*1的圖。這樣的圖有16個,所以最終輸出是16*10*10。希望別被我繞模糊了.....

注意2:卷積核的大小以及深度是我們人爲設定的,是輸入參數,卷積核中的具體內容 例如5*5*1這個卷積核 這25個具體值是多少,這個是需要網絡去學習的。

簡單總結就是:原圖->卷積->池化->卷積->池化->全連接>全連接->全連接

Lenet代碼:運行 pytorch lenet.py 即可。可以清晰看到數據的維度變化情況

import torch
from torch import nn, optim
from torch.autograd import Variable
from torch.utils.data import DataLoader


class Lenet(nn.Module):
    def __init__(self):                            
        super(Lenet, self).__init__()
        self.conv = nn.Sequential(
            nn.Conv2d(1, 6, 5, stride=1, padding=0),
            nn.MaxPool2d(2, 2),
            nn.Conv2d(6, 16, 5, stride=1, padding=0),
            nn.MaxPool2d(2, 2)
        )
        self.fc = nn.Sequential(                 
            nn.Linear(400, 120),
            nn.Linear(120, 84),
            nn.Linear(84, 10)
        )
        
    def forward(self, x):
        out = self.conv(x)
        print("conv shape = ", out.shape)			
        out = out.view(out.size(0), -1)
        print("view shape = ", out.shape)
        out = self.fc(out)
        print("out shape = ", out.shape)					
        return out


if __name__ == "__main__":
    x = torch.randn(1, 1, 32, 32)

    net = Lenet()
    print("x shape = ", x.shape)
    
    out = net(x)
    

掛個連接 主要說參數量計算問題的https://blog.csdn.net/silent56_th/article/details/53456522

2.AlexNet

網絡包含8個帶權重的層;前5層是卷積層,剩下的3層是全連接層。最後一層全連接層的輸出是1000維softmax的輸入,softmax會產生1000類標籤的分佈網絡包含8個帶權重的層;前5層是卷積層,剩下的3層是全連接層。最後一層全連接層的輸出是1000維softmax的輸入,softmax會產生1000類標籤的分佈.

  • 卷積層C1

  • 該層的處理流程是: 卷積-->ReLU-->池化-->歸一化。

    • 卷積,輸入是227×227,使用96個11×11×3的卷積核,得到的FeatureMap爲55×55×96。
    • ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中。
    • 池化,使用3×33×3步長爲2的池化單元(重疊池化,步長小於池化單元的寬度),輸出爲27×27×96((55−3)/2+1=27)
    • 局部響應歸一化,使用k=2,n=5,α=10−4,β=0.75進行局部歸一化,輸出的仍然爲27×27×96,輸出分爲兩組,每組的大小爲27×27×48
  • 卷積層C2
    該層的處理流程是:卷積-->ReLU-->池化-->歸一化

    • 卷積,輸入是2組27×27×48。使用2組,每組128個尺寸爲5×5×48的卷積核,並作了邊緣填充padding=2,卷積的步長爲1. 則輸出的FeatureMap爲2組,每組的大小爲27×27 times128
    • . ((27+2∗2−5)/1+1=27)
    • ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
    • 池化運算的尺寸爲3×3,步長爲2,池化後圖像的尺寸爲(27−3)/2+1=13,輸出爲13×13×256
    • 局部響應歸一化,使用k=2,n=5,α=10−4,β=0.75進行局部歸一化,輸出的仍然爲13×13×256,輸出分爲2組,每組的大小爲13×13×128
  • 卷積層C3
    該層的處理流程是: 卷積-->ReLU

    • 卷積,輸入是13×13×256,使用2組共384尺寸爲3×3×256的卷積核,做了邊緣填充padding=1,卷積的步長爲1.則輸出的FeatureMap爲13×13 times384
    • ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
  • 卷積層C4
    該層的處理流程是: 卷積-->ReLU
    該層和C3類似。

    • 卷積,輸入是13×13×384,分爲兩組,每組爲13×13×192.使用2組,每組192個尺寸爲3×3×192的卷積核,做了邊緣填充padding=1,卷積的步長爲1.則輸出的FeatureMap爲13×13 times384,分爲兩組,每組爲13×13×192
    • ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
  • 卷積層C5
    該層處理流程爲:卷積-->ReLU-->池化

    • 卷積,輸入爲13×13×384,分爲兩組,每組爲13×13×192。使用2組,每組爲128尺寸爲3×3×192的卷積核,做了邊緣填充padding=1,卷積的步長爲1.則輸出的FeatureMap爲13×13×256
    • ReLU,將卷積層輸出的FeatureMap輸入到ReLU函數中
    • 池化,池化運算的尺寸爲3×3,步長爲2,池化後圖像的尺寸爲 (13−3)/2+1=6,即池化後的輸出爲6×6×256
  • 全連接層FC6
    該層的流程爲:(卷積)全連接 -->ReLU -->Dropout

    • 卷積->全連接: 輸入爲6×6×256,該層有4096個卷積核,每個卷積核的大小爲6×6×256。由於卷積核的尺寸剛好與待處理特徵圖(輸入)的尺寸相同,即卷積核中的每個係數只與特徵圖(輸入)尺寸的一個像素值相乘,一一對應,因此,該層被稱爲全連接層。由於卷積核與特徵圖的尺寸相同,卷積運算後只有一個值,因此,卷積後的像素層尺寸爲4096×1×1,即有4096個神經元。
    • ReLU,這4096個運算結果通過ReLU激活函數生成4096個值
    • Dropout,抑制過擬合,隨機的斷開某些神經元的連接或者是不激活某些神經元
  • 全連接層FC7
    流程爲:全連接-->ReLU-->Dropout

    • 全連接,輸入爲4096的向量
    • ReLU,這4096個運算結果通過ReLU激活函數生成4096個值
    • Dropout,抑制過擬合,隨機的斷開某些神經元的連接或者是不激活某些神經元
  • 輸出層
    第七層輸出的4096個數據與第八層的1000個神經元進行全連接,經過訓練後輸出1000個float型的值,這就是預測結果。

  • 3.VGGNet

  • 缺個圖 晚上去盜圖然後貼上來

  • 可見 就是卷積 卷積 池化  卷積  卷積 池化 這種方式吧

  • VGG16包含16層,VGG19包含19層。一系列的VGG在最後三層的全連接層上完全一樣,整體結構上都包含5組卷積層,卷積層之後跟一個MaxPool。所不同的是5組卷積層中包含的級聯的卷積層越來越多。

    AlexNet中每層卷積層中只包含一個卷積,卷積核的大小是7*7,。在VGGNet中每層卷積層中包含2~4個卷積操作,卷積核的大小是3*3,卷積步長是1,池化核是2*2,步長爲2,。VGGNet最明顯的改進就是降低了卷積核的尺寸,增加了卷積的層數。


    使用多個較小卷積核的卷積層代替一個卷積核較大的卷積層,一方面可以減少參數,另一方面作者認爲相當於進行了更多的非線性映射,增加了網絡的擬合表達能力。 
     

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