---
# System prepended metadata

title: '論文閱讀: VGG(VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION)'
tags: [Deep learning]

---

---
tags: Deep learning 
---

# 論文閱讀: VGG(VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION)

[論文](https://arxiv.org/pdf/1409.1556.pdf)
## Introduction
VGGNet 承襲 AlexNet，提出了通過使用更小的kernel size(3x3的filter)，使網路架構更有彈性，得以堆疊出深度更深，表現更好的CNN模型。
##  ConvNet Configurations
### Architecture
* VGG的input為224 × 224的RGB image，在training set上會將原始pixel值減去平均的RGB值做pre-processing。

* 在VGG中，使用了大量的3x3 filter取代在AlexNet中較大(11x11、7x7、5x5)的convolution filter。使network在相同的receptive field下，可以通過多層非線性層，學習到更複雜的pattern。

* 此外也使用了1 × 1 的convolution filters，它可以被視為將input channel做linear transform，提高non-linearity。

* 下採樣的部分使用了Max-pooling(2 × 2 pixel window, stride 2)

* VGG架構的最後三層為Fully-Connected layers: 其中前兩層各有4096個channels，最後一層則因應ILSVRC共1000種類別對應1000個channel，並且是一個soft-max層。

* 激活函數使用AlexNet中提到的ReLu。

* 論文中經過實驗認為: 在AlexNet中使用的LRN只會單純增加計算量，然而對於performance卻沒有幫助。
### Configurations
如下表，論文中嘗試實驗不同深度的CNN。

至於每一層的寬度(width, the number of channels)，從第一層的64 channel開始，每經過一層max-pooling就增加一倍，直到512 channel為止。

![](https://i.imgur.com/F93x93Y.png)


### Discussion

VGG中，最重要的想法就是使用大量的3 X 3 Conv。作者認為這些改變有幾個好處:
1. 我們可以利用小的Conv的組合，達到與大的conv相同的receptive field。如下圖，透過3x3的Conv組合，就足以表現出其他更大的Conv。並且這些組合的可能性超過直接使用大的Conv的數量。

![](https://i.imgur.com/coO5YgX.png)

2. 使用較多的較小的Conv可以提高Non-Linearity。比起使用單個7x7的Conv，使用3個3x3的結合可以使decision function更discriminative(更有區別能力)
3. 比起使用相對大的Conv，使用小的Conv可以減少parameter。
    * 假設input、output都是C個channel的話，使用7x7的單層Conv需要7^2^xC^2^ = 49xC^2^個parameters，
    * 然而若使用3個堆疊的3 × 3的話，parameters的數量為 3x(3^2^xC^2^) = 27xC^2^

另外，論文通過1x1 conv的使用，在不會影響receptive的前提下，增加decision function的nonlinearity(P.S. 雖然論文中並非為此目的，但1x1 conv也可以被用來降維，減少network參數的使用，詳細可以閱讀[卷積神經網路(Convolutional neural network, CNN): 1×1卷積計算在做什麼](https://medium.com/@chih.sheng.huang821/%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-convolutional-neural-network-cnn-1-1%E5%8D%B7%E7%A9%8D%E8%A8%88%E7%AE%97%E5%9C%A8%E5%81%9A%E4%BB%80%E9%BA%BC-7d7ebfe34b8)。)

## Classification Framework
(主要是如何調整參數，怎麼處理traning、testing data等細節，詳請閱讀論文)

稍微提及scale的方法: 

由於network輸入必須為224x224，因此需對原始資料作調整。training方面，論文的做法是先將其scale到size S後，再把多出來的部分crop(類似AlexNet的做法)。並且有使用Multiple scale training: 在每次training 時，從一個固定的亂數範圍中，scale至範圍內的random值，再做crop。

然後輸入的test set則會scale到size Q，並使用多個crop進行預測，利用固定的crop大小預測左上、右上、左下、右下跟中間，並平均成最後預測結果。

training set的S與test set的Q不必相同。

![](https://i.imgur.com/LQ2lEpU.png)

## Classification Experiment
(此部分只大概整理一些重點，詳細請閱讀論文內容)
### Dataset
使用ILSVRC-2012 dataset。包含1000種類別資料，並且被分成training (1.3M images)、validation (50K images)、testing (100K images with held-out class labels)三種。 

論文中絕大部分以validation set作為實驗的test set。
### Single Scale Evaluation
首先，論文先使用了沒有scale的test set做實驗，結果如下表。(A-E對應上面架構的表格)
![](https://i.imgur.com/fQPzlfH.png)
(表中S的[256;512]表示輸入的scale S會在兩數字間隨機選擇)

由於LRN的使用並沒有顯著的提升，因此作者在B-E的架構中就沒有實驗加入LRN的該種Network。

論文發現，雖著網路深度越深(從11層的A至19層的E)，預測的結果也有所提升。

比較B與C的表現(有沒有1x1 Conv)，我們可以看出1x1 Conv的加入對於表現有所提升。然而比較C(使用1x1 Conv)的表現卻比D(使用3x3 Conv)的差。論文由此推測，雖然額外的non-linearity有所幫助(C>B)，但是萃取空間域的複雜特徵依然十分重要(D>C)

### Multi-Scale Evaluation
此部分中，test set中同一筆data會用不同的scale Q輸入，再把所有output(對於各個類別的score)平均起來作為最終結果。

結果如下圖，可以看到準確度有所提升。
![](https://i.imgur.com/swL7jVd.png)

### Multi-Crop Evaluation
論文中也展示了input多種crop區域的Multi-Crop方法，以及結合Multi-Crop與Multi-Scale的結果，如下表。
![](https://i.imgur.com/rGaopA8.png)
### ConvNet Fusion
如下表，論文也展示了使用多個model ensemble的結果。
![](https://i.imgur.com/mmCmX8T.png)
### Comparison With The State Of Art
如下表，論文比較自己與當時的state-of-art的結果。
![](https://i.imgur.com/O4hkhJC.png)

## Conclusion

VGG展示了deeper network可以達到better result的效果。不過如果比較D跟E的結果，會發現performance的提升似乎已經到了緊繃。難道不是越深的網路越好嗎?這些問題在ResNet將得以解決。

另一方面，VGG透過使用大量3x3 filter替代size更大的filter，並證明其可以提升預測的表現，為deep learning模型的設計提出了重要的看法。

## Reference
[VGG_深度學習_原理](https://medium.com/@danjtchen/vgg-%E6%B7%B1%E5%BA%A6%E5%AD%B8%E7%BF%92-%E5%8E%9F%E7%90%86-d31d0aa13d88)