Thursday, October 03, 2019

AI 從頭學(三二):VGGNet

AI 從頭學(三二):VGGNet

2019/09/03

前言:

VGGNet 是一個經典的 CNN 模型。所謂經典,就是舊(不一定),而且很好。當然,即使是新的,也會變舊。VGG 的架構很簡潔,所以之前讀的時候,把重點擺在 Weight 與 Momentum。這次為了 ResNet,仔細地讀了一下 VGG,發現有許多細節還蠻重要的。

-----

Summary:

參考文獻的安排依論文 [1], [2]、英文 [3]-[8]、簡體中文 [9]-[16]、繁體中文 [17], [18] 與代碼 [19]-[21] 為順序。

VGGNet [1], [5], [6], [11]-[13] 與 AlexNet 都引用了 PreVGGNet [2]。PreVGGNet 同時加深與加寬網路,但發現加深有效,加寬效果不大。這給了 VGGNet 專注於加深的靈感 [2], [15], [18]。

文章中我們首先回顧 CNN 發展的歷史 [3], [4], [9], [10]。然後依序討論 VGGNet 的設計、訓練、與測試。

最後分析了 Conv3 [3], [12]、Conv1 [16]、與 LRN [7], [8] 對於 VGGNet 的影響。

-----

Outline

1.1. Top 5 Accuracy
1.2. Evolution of CNN

2.1. Structure of VGG
2.2. Conv3
2.3. Pooling

3.1. Training
3.2. Testing

4.1. Single Scale Evaluation
4.2. Multi-Scale Evaluation
4.3. Multi-crop Evalution
4.4. ConvNet Fusion

5.1. Deep
5.2. Conv1
5.3. LRN

-----

1.1. Top 5 Accuracy

-----


Fig. 1.1. Top 5 Accuracy [6]。

-----

卷積神經網路(Convolutional Neural Network,CNN)主要的功用,是判斷圖片的類別,通常以 Top 5 或 Top 1 為模型準確率的判斷標準。Top 5 是前五名其中之一正確即可列為模型判斷成功,Top 1 則只取第一名。

-----

1.2. Evolution of CNN

-----


Fig. 1.2a. Evolution of CNN [3]。

-----

圖1.2a 可以看到,CNN 的發展路線是,網路越來越深,而錯誤率越來越小。2012 年的 AlexNet 是 8 層,錯誤率是 16.4。2013 AlexNet 微調版的 ZFNet,錯誤率是 11.7。2014 年的 VGGNet 是 19 層,錯誤率是 7.3。同年的 GoogLeNet 是 22 層,錯誤率是 6.7。到了 2015 年的 ResNet 是 152 層,錯誤率是 3.57,一舉超過人類專家。

-----


Fig. 1.2b. Evolution of CNN [9]。

-----


Fig. 1.2c. Evolution of CNN [10]。

-----

圖1.2b 是 CNN 的發展歷史。

1998,LeNet 奠定了成熟的 CNN 架構。
2012,AlexNet 擴大 LeNet 的架構,並使用 GPU,成為第一個在大型圖片資料集表現優異的 CNN。
2013,NIN 發展了 1x1 convolution(conv1)。
2014,GoogLeNet(Inception V1)基於 conv1 成功地加深網路。
2014,VGGNet 使用兩個 conv3 組成 conv5,也成功地加深網路。
2015,ResNet 運用 LSTM 的直通架構,一舉將網路加到極深。

CNN 的成功,也連帶引起 Object Detection 與 Semantic Segmentation 種種應用的風行,參考圖 1.2c。

-----

2.1. Structure of VGG

-----


Fig. 2.1a. LeNet [4]。

-----


Fig. 2.1b. AlexNet [4]。

-----


Fig. 2.1c. VGGNet [4]。

-----


Fig. 2.1d. VGGNet Architecture [1]。

-----

VGGNet 的架構參考之前的 LeNet、PreVGGNet、AlexNet、ZFNet、NIN、OverFeat。

AlexNet 是 LeNet 的大型版。由於 ZFNet 的第一層採取較小的卷積核與 Stride,得到較高的辨識率,所以 VGGNet 也朝這個方向繼續前進。另外,對比於 AlexNet,VGGNet 也採用較小的 Pooling。

另外,PreVGGNet 發現加寬網路用處不大,所以 VGGNet 專注於加深網路 [2], [15], [18]。

-----

架構上首先訓練好 A,然後加上 LRN,稱為 A-LRN。

然後把 A 前兩層的一層 Conv3 換成兩層 Conv3,繼續訓練,稱為 B。

然後把 B 後三層的兩層 Conv3 加一層 Conv1,繼續訓練,稱為 C。

然後把 C 的 Conv1 換成 Conv3,繼續訓練,稱為 D。也就是俗稱的 VGG-16(層)。

最後 VGG-19 只有好一點點,但消耗資源較多,所以 VGG-16 比較常用。繼續加深就變差了。

-----

2.2. Conv3

-----


Fig. 2.2. Conv3 [5]。

-----

VGGNet 利用兩層 Conv3 組成 Conv5,有表現力強跟計算較少,這兩個優點。同理,三層 Conv3 可以組成 Conv7。

-----

2.3. Pooling

-----


Fig. 2.3. Pooling [17]。

-----

LeNet 採用 average pooling。

相對於 AlexNet 採用 3x3 且 stride = 2 的 max pooling,有重疊。VGGNet 採用 2x2 且 stride = 2 的 max pooling,無重疊。

-----

3.1. Training

-----


Fig. 3.1a. Single Scale [5]。

-----


Fig. 3.1b. Multi-Scale [17]。

-----

VGGNet 的 training 有 single 跟 multiple 兩種。

所謂 single,有 256 跟 384 兩種。訓練圖片的短邊縮放到 256,然後取中間 224x224。另外一種是把 256 改成 384。

所謂 multiple,則是將短邊隨機縮放為 256 到 512 其中一個大小,然後取中間 224x224。

-----

3.2. Testing

-----

Testing 分為 dense 跟 crop 兩種。

-----


Fig. 3.2a. Dense [5]。

-----


Fig. 3.2b. Dense [11]。

-----


Fig. 3.2c. OverFeat [15]。

-----

Dense 的方式是將最後三層的全連接層改為卷積層,參考圖3.2a 跟 3.2b。

靈感上是來自 OverFeat [15]。全連接層改為卷積層之後,輸入格式大小就不受限定,比 224x224 大,也沒關係。

-----


Fig. 3.2d. Multi-crop [17]。

-----

Multi-crop 是將 250x250 先放大到 280x280,然後取四角跟中間 224x224 下去測試,並取 softmax 後的輸出值平均。

-----

4.1. Single Scale Evaluation

-----


Fig. 4.1a. ConvNet performance at a single test scale [1]。

-----


Fig. 4.1b. ConvNet performance at a single test scale [5]。

-----

參考圖4.1b,通過 Multi-scale Training,我們可以猜測它對於具有不同尺寸的測試圖像而言更準確。

VGG-13 將錯誤率從 9.4% / 9.3%降低到8.8%。
VGG-16 將錯誤率從 8.8% / 8.7%降低到8.1%。
VGG-19 將錯誤率從 9.0% / 8.7%降低到8.0%。

-----

4.2. Multi-Scale Evaluation

-----


Fig. 4.2a. ConvNet performance at multiple test scales [1]。

-----


Fig. 4.2b. ConvNet performance at multiple test scales [5]。

-----

通過 Multi-scale training 而不是 Single-scale training,可以降低錯誤率。

與 Single-scale Training  Single-scale Testing 相比,

VGG-13將錯誤率從 9.4% / 9.3% 降低到 9.2%,
VGG-16將錯誤率從 8.8% / 8.7% 降低到 8.6%,
VGG-19將錯誤率從 9.0% / 8.7% 降低到 8.7 / 8.6%。

-----

通過同時使用多尺度培訓和測試,可以減少錯誤率。

與僅多尺度測試相比,

VGG-13 將錯誤率從 9.2% / 9.2% 降低到 8.2%。
VGG-16 將錯誤率從 8.6% / 8.6% 降低到 7.5%。
VGG-19 將錯誤率從 8.7% / 8.6% 降低到 7.5%。

-----

4.3. Multi-crop Evaluation

-----


Fig. 4.3a. ConvNet evaluation techniques comparison [1]。

-----


Fig. 4.3b. ConvNet evaluation techniques comparison [5]。

-----

藉由平均 dense 與 multi-crop 的結果,VGG-16 與 VGG-19 的錯誤率降到 7.2% 與 7.1%。

-----

4.4. ConvNet Fusion

-----


Fig. 4.4a. Multiple ConvNet fusion results [1]。

-----


Fig. 4.4b. Multiple ConvNet fusion results [5]。

-----

最好的結果達到 6.8%。

-----

5.1. Deep

-----


Fig. 5.1a. VGGNet [3]。

-----



Fig. 5.1b. Conv3 [12]。

-----

總之,VGGNet 採用 Conv3 反覆加深,得到很好的效果,是個簡潔優美而強大的設計。

-----

5.2. Conv1

-----


Fig. 5.2. Conv1 [16]。

-----

Conv1 [16] 的效果沒有 Conv3 好。但 Conv1 其實最主要是降低模型的資料量,這在 GoogLeNet 中被發揮到淋漓盡致 [9]。

-----

5.3. LRN 

-----


Fig. 5.3. LRN [7]。

-----

LRN [7], [8] 在深度學習,最早被使用在 AlexNet 上。很多文章說,VGGNet 證明了 LRN 無效。但舉一個無效的例子是無法「證明」什麼的,只能「說明」LRN 用在 VGGNet 無效。事實上,與 VGGNet 同時的 GoogLeNet 就有使用。

個人認為 LRN 後來沒有被繼續使用的主要原因是 Conv1 的功能與 LRN 類似,但更一般化與效果更好。由於 Conv1 幾乎已經是標準配備,自然不需要 LRN 多此一舉。

-----

結論:

閱讀論文的要點,除了理解其架構,另外要注意的是論文中提到,訓練模型的方法,即 weight decay 與 momentum。

VGGNet 的最大貢獻是「證明」持續加深網路有明顯效果,但到 16、19 已是極限。隔一年發表的 ResNet 加上一個 shortcut,採取殘差的設計,達到 CNN 的 SOTA,State of the Art [3], [4], [9], [10]!

-----

References

◎ 論文

[1] VGGNet
Simonyan, Karen, and Andrew Zisserman. "Very deep convolutional networks for large-scale image recognition." arXiv preprint arXiv:1409.1556 (2014).
https://arxiv.org/pdf/1409.1556.pdf

[2] PreVGGNet
Ciresan, Dan C., et al. "Flexible, high performance convolutional neural networks for image classification." IJCAI Proceedings-International Joint Conference on Artificial Intelligence. Vol. 22. No. 1. 2011.
http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.481.4406&rep=rep1&type=pdf

-----

◎ 英文參考資料

# 綜述
# 3.9K claps
[3] CNN Architectures  LeNet, AlexNet, VGG, GoogLeNet, ResNet and more …
https://medium.com/@sidereal/cnns-architectures-lenet-alexnet-vgg-googlenet-resnet-and-more-666091488df5

# 綜述
# 1.1K claps
[4] Illustrated  10 CNN Architectures - Towards Data Science
https://towardsdatascience.com/illustrated-10-cnn-architectures-95d78ace614d

# VGGNet
# 246 claps
[5] Review  VGGNet — 1st Runner-Up (Image Classification), Winner (Localization) in ILSVRC 2014
https://medium.com/coinmonks/paper-review-of-vggnet-1st-runner-up-of-ilsvlc-2014-image-classification-d02355543a11

# VGGNet
[6] Convolutional neural networks on the iPhone with VGGNet
http://machinethink.net/blog/convolutional-neural-networks-on-the-iphone-with-vggnet/

# LRN
[7] What is local response normalization  - Quora
https://www.quora.com/What-is-local-response-normalization

# LRN
# 135 claps
[8] Difference between Local Response Normalization and Batch Normalization
https://towardsdatascience.com/difference-between-local-response-normalization-and-batch-normalization-272308c034ac

-----

◎ 簡體中文參考資料

# 綜述
[9] 深度学习之四大经典CNN技术浅析 _ 硬创公开课 _ 雷锋网
https://www.leiphone.com/news/201702/dgpHuriVJHTPqqtT.html

# 綜述
[10] GitHub - weslynn_AlphaTree-graphic-deep-neural-network  将深度神经网络中的一些模型 进行统一的图示,便于大家对模型的理解
https://github.com/weslynn/AlphaTree-graphic-deep-neural-network

# VGGNet 
[11] 大话CNN经典模型:VGGNet - 雪饼的个人空间 - OSCHINA
https://my.oschina.net/u/876354/blog/1634322

# VGGNet
[12] 【论文阅读】—— VERY DEEP CONVOLUTIONAL NETWORKS FOR LARGE-SCALE IMAGE RECOGNITION _ Nameless rookie
http://vincentho.name/2018/11/29/%E3%80%90%E8%AE%BA%E6%96%87%E9%98%85%E8%AF%BB%E3%80%91%E2%80%94%E2%80%94-VERY-DEEP-CONVOLUTIONAL-NETWORKS-FOR-LARGE-SCALE-IMAGE-RECOGNITION/

[13] VGG论文翻译——中英文对照 _ SnailTyan
http://noahsnail.com/2017/08/17/2017-08-17-VGG%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91%E2%80%94%E2%80%94%E4%B8%AD%E8%8B%B1%E6%96%87%E5%AF%B9%E7%85%A7/

# PreVGGNet
[14] 深度学习论文理解3:Flexible, high performance convolutional neural networks for image classification - whiteinblue的专栏 - CSDN博客
https://blog.csdn.net/whiteinblue/article/details/43149363

# OverFeat
[15] OverFeat Integrated Recognition, Localization and Detection using Convolutional Networks - baobei0112的专栏 - CSDN博客
https://blog.csdn.net/baobei0112/article/details/47775647

# Conv1
[16] CNN网络中的 1 x 1 卷积是什么? - AI小作坊 的博客 - CSDN博客
https://blog.csdn.net/zhangjunhit/article/details/55101559

-----
 
◎ 繁體中文參考資料

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

# PreVGGNet
[18] [Pytorch Taipei] Paper  Flexible, high performance convolutional neural networks for image classification
https://medium.com/@ChrisChou0426/pytorch-taipei-paper-flexible-high-performance-convolutional-neural-networks-for-image-4153f9495113 

-----

◎ 代碼實作

# PyTorch
[19] torchvision.models.vgg — PyTorch master documentation
https://pytorch.org/docs/stable/_modules/torchvision/models/vgg.html

# PyTorch
[20] vision_vgg.py at master · pytorch_vision · GitHub
https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py  

# PyTorch
[21] 简单易懂Pytorch实战实例VGG深度网络 - 心之所向 - CSDN博客
https://blog.csdn.net/qq_16234613/article/details/79818370

No comments: