天天看點

論文學習:(VGG)Very Deep Convolutional Networks for Large-scale Image Recognition目錄感想論文連結文章講解網絡結構 PyTorch 架構的代碼實作疑問

目錄

感想

論文連結

文章講解

網絡結構 

PyTorch 架構的代碼實作

疑問

dense evaluation & multi-crop evaluation

1. dense evaluation

2、 multi-crop evaluation

感想

這篇文章在網絡結構上沒有太大的創新點。但提出了 “ small filter 同樣能提取重要特征” 和 “deep network 的重要性”。

論文連結

Simonyan, Karen, and Andrew Zisserman. “Very deep convolutional networks for large-scale image recognition.” arXiv preprint arXiv:1409.1556 (2014).

文章講解

參考:https://www.datalearner.com/blog/1051559048634862

VGGNet(Visual Geometry Group)是 2014 年又一個經典的卷積神經網絡。VGGNet 最主要的目标是試圖回答“如何設計網絡結構”的問題。随着AlexNet 提出,很多人開始利用卷積神經網絡來解決圖像識别的問題。一般的做法都是重複幾層卷積網絡,每個卷積網絡之後接一些池化層,最後再加上幾個全連接配接層。而 VGGNet 的提出,給這些結構設計帶來了一些标準參考。

在 VGGNet 的論文中,作者主要探究了卷積網絡深度的影響。其最主要的貢獻是使用較小的卷積核,但較深的網絡層次來提升深度學習的效果。在此之前,有很多研究者利用如較小的 receptive window size 和步長等技巧來提升網絡效果。而在這邊文章中,作者的主要目标是探索深度學習深度的影響。作者固定了網絡中其他的參數,通過緩慢的增加網絡的深度來探索網絡的效果。

先前的網絡使用的接受野都是較大的。例如 AlexNet 的第一層使用的是 11x11、步長為 4 的卷積核掃描。而 VGGNet 全部使用很小的 3x3、步長為 1 的卷積核來掃描輸入。可以看到,如果将兩個這樣的卷積核堆起來,和 5x5 的卷積核效果一樣,如果是三個堆疊,其效果等同于 7x7。

這裡解釋一下,“堆疊”的意思是先用 3x3 掃描一次,再用 3x3 對結果繼續掃描一次。是以,加入輸入的長為 n,那麼 3x3 掃描一次的結果是 (n-3)/1+1 = n-2,再掃描一次就是 (n-2-3)/1+1=n-4。如果卷積核是 5x5,那麼掃描一次n的輸入就是 (n-5)/1+1 = n-4。其結果是一樣的。VGGNet 思想就是用更小更深的卷積核代替大的卷積核。

關于卷積核次元計算參考:深度學習卷積操作的次元計算

作者是這樣解釋為什麼使用 3 個 3x3 卷積核堆疊代替一個 7x7 的卷積核的:首先,使用更深的層可以使得函數具有更好的分辨能力;其次,通過這樣做也可以減少參數。例如,假設輸入是 C 個通道的 3x3 的矩陣,那麼堆疊 3 次 3x3 的卷積網絡的參數是

論文學習:(VGG)Very Deep Convolutional Networks for Large-scale Image Recognition目錄感想論文連結文章講解網絡結構 PyTorch 架構的代碼實作疑問
,而使用一個 7x7 的卷積核的參數是
論文學習:(VGG)Very Deep Convolutional Networks for Large-scale Image Recognition目錄感想論文連結文章講解網絡結構 PyTorch 架構的代碼實作疑問

在之前的論文中,也有人使用了較小的卷積核,但是他們的網絡都比 VGGNet 的網絡深度淺。

網絡結構 

論文學習:(VGG)Very Deep Convolutional Networks for Large-scale Image Recognition目錄感想論文連結文章講解網絡結構 PyTorch 架構的代碼實作疑問

PyTorch 架構的代碼實作

https://chsasank.github.io/vision/_modules/torchvision/models/vgg.html

def make_layers(cfg, batch_norm=False):
    layers = []
    in_channels = 3
    for v in cfg:
        if v == 'M':
            layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
        else:
            conv2d = nn.Conv2d(in_channels, v, kernel_size=3, padding=1)
            if batch_norm:
                layers += [conv2d, nn.BatchNorm2d(v), nn.ReLU(inplace=True)]
            else:
                layers += [conv2d, nn.ReLU(inplace=True)]
            in_channels = v
    return nn.Sequential(*layers)


cfg = {
    'A': [64, 'M', 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'B': [64, 64, 'M', 128, 128, 'M', 256, 256, 'M', 512, 512, 'M', 512, 512, 'M'],
    'D': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M'],
    'E': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 256, 'M', 512, 512, 512, 512, 'M', 512, 512, 512, 512, 'M'],
}
           

疑問

dense evaluation & multi-crop evaluation

參考:https://www.jianshu.com/p/5412d1dec69d

1. dense evaluation

它的設計非常巧妙,并不需要我們顯式的在縮放後的圖像上 crop 出224*224的圖像。而是直接将縮放後的圖像輸入,再通過将最後的三層全連接配接層表達為卷積層的形式,來實作在縮放後的圖像上密集 crop 的效果。最後将結果平均得到最終的分類結果。

為什麼全連接配接層可以轉變為卷積層的形式?

假設一個神經網路前面都是卷積層,後面跟着三層全連接配接層 f1、f2 和 f3,每個全連接配接層神經元的個數分别為 n1、n2 和 n3,且經過前面所有的卷積層之後,得到的是 m*m 的 C 個通道的 feature map。一般來說,進入全連接配接層之前,我們應該首先将這個 feature map 展成一維向量,再與 f1 全連接配接層相連接配接。但是實際上,我們可以将 f1 層看作是卷積核大小為 m*m,通道數為 n1 的卷積層,這樣卷積後得到的輸出是 1*1*n1 的(不加padding),效果和全連接配接層一樣。然後,再将 f2 層看作是卷積核大小為 1*1,通道數為 n2 的卷積層;将f3層看作是卷積核大小為 1*1,通道數為 n3 的卷積層......道理同f1層一樣。

這麼做為什麼能起到密集 crop 的效果?

如下圖所示 (圖檔來自于論文 Overfeat),假設訓練時網絡接受的圖像大小是 14*14,最後輸出的是它所屬的類别。假設測試時縮放後的圖檔大小為 16*16,在将全連接配接層轉變成卷積層後 ,我們将這個縮放後的圖像直接輸入給網絡,而不是 crop 出 14*14 的大小,可以發現,最後得到的是 4 個結果而不是它上面所示的 1 個。其實這 4 個結果分别相當于在縮放後的圖像上 crop 出左上、右上、左下、右下 4 個 14*14 圖像的分類結果。然後将多個位置的結果取平均作為整個圖像的最終結果。相比于在縮放後的圖像上 crop 出多個圖像後再分别放入網絡進行分類,這種操作省去了許多重複性的運算,所有的卷積操作隻需要做一遍即可。值得注意的是,在這個例子中,相當于每滑動兩個像素 crop 一個圖像,這是因為中間有一個步長為 2 的 2*2 的 pooling 操作。是以有時當pooling 操作較多時,這種方法可能反而沒有直接多次 crop 得到的結果精細。

論文學習:(VGG)Very Deep Convolutional Networks for Large-scale Image Recognition目錄感想論文連結文章講解網絡結構 PyTorch 架構的代碼實作疑問
論文學習:(VGG)Very Deep Convolutional Networks for Large-scale Image Recognition目錄感想論文連結文章講解網絡結構 PyTorch 架構的代碼實作疑問

2、 multi-crop evaluation

在 GoogleLeNet 中描述的詳細過程如下:将圖檔縮放到不同的 4 種尺寸(縱橫比不變,GoogleLeNet 使用的 4 種尺寸為:縮放後的最短邊長度分别為:256, 288, 320 和 352)。對于得到的每個尺寸的圖像,取左、中、右三個位置的正方形圖像(邊長就是最短邊的長度。對于縱向圖像來說,則取上、中、下三個位置),是以每個尺寸的圖像得到 3 個正方形圖像;然後再在每個正方形圖像的 4 個 crop 頂點和中心位置處 crop 出 224*224 的圖像,此外再加上将這個正方形圖像縮放到 224*224 大小的圖像,是以每個正方形圖像得到 6 個224*224 的圖像;最後,再将所有得到的 224*224 的圖像水準翻轉。是以,每個圖像可以得到 4*3*6*2=144 個 224*224 大小的圖像。将這些圖像分别輸入神經網絡進行分類,最後取平均,作為這個圖像最終的分類結果。

繼續閱讀