---
# System prepended metadata

title: Evolution of CNN
tags: [學習紀錄]

---

# Evolution of CNN
###### tags:  `學習紀錄`

[toc]

---
## Before Meeting
:::success
- CNN演化史
- ![](https://i.imgur.com/NjDc0GO.png)


:::

[refer](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-ml-note-cnn%E6%BC%94%E5%8C%96%E5%8F%B2-alexnet-vgg-inception-resnet-keras-coding-668f74879306)
[refer](https://medium.com/%E9%9B%9E%E9%9B%9E%E8%88%87%E5%85%94%E5%85%94%E7%9A%84%E5%B7%A5%E7%A8%8B%E4%B8%96%E7%95%8C/%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92-ml-note-convolution-neural-network-%E5%8D%B7%E7%A9%8D%E7%A5%9E%E7%B6%93%E7%B6%B2%E8%B7%AF-bfa8566744e9x)
[refer](https://medium.com/@rgnuj122/lenet%E6%89%8B%E6%8A%8A%E6%89%8B%E5%AF%A6%E4%BD%9C%E6%95%99%E5%AD%B8-1c2f149c822f)
[refer](https://github.com/feiyuhug/lenet-5?source=post_page---------------------------)
[refer](http://hemingwang.blogspot.com/2017/04/lenet.html?source=post_page---------------------------)
[refer](https://my.oschina.net/u/876354/blog/1632862?source=post_page---------------------------)


---

## Recent Paper

---

### LeNet

:::success
#### Abstracion
- 沒錯，這就是CNN之父，前面也介紹過了卷積跟池化，所以應該可以很容易理解LeNet的運作，就是簡單利用了卷積跟池化，並接上全連結層做分類，這裡我們用Mnist data來實作LeNet training
- ![](https://i.imgur.com/kb4qIUR.png)

:::
:::info
#### Detail


:::
:::warning
#### Conclusion

:::
[refer](http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf?source=post_page---------------------------)

---
### AlexNet
:::success
#### Abstracion
- AlexNet 在2012年的ImageNet LSVRC的比賽上拿了冠軍，而且準確率完勝第二名，那時候造成很大的轟動，也使得CNN開始被重視，變成所謂的CNN大時代，之後的比賽也都是由CNN拿下冠軍，深度學習正式大爆發。
- ![](https://i.imgur.com/FIZMJmu.png)
- AlexNet的特點：
    - 使用了非線性的激活函數(Activation function)：Relu 對於什麼是Activation function，我之後會找時間來介紹，不懂的可以先參考這個網站，在AlexNet以前，大部分的網路都是用tanh當作激活函數
    - 使用了Data augmentation 和 Dropout 來防止Overfitting
    - 多個GPU並行運算
- 之所以為什麼上面架構會分成上下2層去訓練，是因為當初在訓練的時候記憶體不夠所以分成兩塊在GPU上訓練，其實這樣的網路要弄成一層也是可以的，以下這張圖就是一層的網路架構圖，其實是跟LeNet有點類似的，這裡我用開源dataset oxflower17 來實行AlexNet，我也加入了data augumentation，大家可以參考看看。
- ![](https://i.imgur.com/H2FVeWl.png)

:::
:::info
#### Detail


:::
:::warning
#### Conclusion

:::
[refer](https://www.nvidia.cn/content/tesla/pdf/machine-learning/imagenet-classification-with-deep-convolutional-nn.pdf?source=post_page---------------------------)

---
### VGGNet
:::success
#### Abstracion
- VGGNet在2014年 ILSVRC 的分類比賽中拿到了第二名(第一名是等等要介紹的InceptionNet)，其實VGGNet跟AlexNet之間並沒有什麼太大的差異，只是將網路的深度變深，進而得到更好的結果，我一樣用開源dataset oxflower17 來實行VGG16Net，因為VGG16的深度變深，相對的，VGG的參數就會是AlexNet的好幾倍，訓練時間也會相對的較長。
- ![](https://i.imgur.com/AurYYFQ.png)


:::
:::info
#### Detail
- 

:::
:::warning
#### Conclusion

:::
[refer](https://arxiv.org/pdf/1409.1556.pdf?source=post_page---------------------------)

---
### GoogLeNet
:::success
#### Abstracion
- GoogLeNet在2014年ILSVRC的分類比賽中拿到了第一名，GoogLeNet做了一個創新，他並不是像VGG或是AlexNet那種加深網路的概念，而是加入了一個叫做Inception的結構來取代了原本單純的卷積層(但他其實也是利用卷積來達成)，而他的訓練參數也比AlexNet少上好幾倍，而且準確率相對更好，所以當時才拿下了第一名的寶座，一直到現在，Inception已經衍生到InceptionV4。
- ![](https://i.imgur.com/CUkyPXY.png)

:::
:::info
#### Detail

- 而GoogLeNet最重要的就是Inception架構：
- ![](https://i.imgur.com/iQXQieS.png)
- GoogLeNet將3種convolution跟一個pooling疊在一起，增加了網路的寬度，而且這樣堆疊在一起後，更能擷取輸入圖片的更多的細節訊息跟特徵，那為什麼要加一個1x1的卷積呢？其實他的目前就在於減少圖片的維度跟減少訓練參數，假設我們input的大小為100x100x56，如果我們做一個有125個filter的5x5卷積層之後(stride = 1 , pad = 2)，輸出將為100x100x125，那麼這個卷積層的參數就為56*5*5*125 = 175000，如果我們先經過28個filter的1x1的卷積，再經過有125個filter的5x5卷積層之後，輸出一樣為100x100x125，但是參數就減少成56*1*1*28+28*5*5*125=89068，相對少了快一半的參數。
- GoogleNet有以下幾種不同的地方：
    - 將單純的卷積層跟池化層改成Inception架構
    - 最後分類時使用average pooling來替代了全連結層
    - 網路加入了2個輔助分類器，為了避免梯度消失的情況
- ![](https://i.imgur.com/cnoaEi8.png)



:::
:::warning
#### Conclusion

:::
[refer](https://arxiv.org/abs/1409.4842?source=post_page---------------------------)
[refer](https://arxiv.org/abs/1502.03167?source=post_page---------------------------)
[refer](https://arxiv.org/abs/1512.00567?source=post_page---------------------------)
[refer](https://arxiv.org/abs/1602.07261?source=post_page---------------------------)
[refer]()
[refer]()
[refer]()

---
### ResNet
:::success
#### Abstracion
- 我們經過之前VGG的結果，深度學習是不是越深就越好呢？如果一直無限延伸的增加層數，是不是結果就會比較好呢？我們來看一下論文裡面的圖，咦！？怎麼56層的網路結果卻比20層的網路差!!!，不是說越深越好嗎？
- ![](https://i.imgur.com/7HgLJB0.png)

- 在經過實驗後發現：網路層數的增加可以有效的超加準確率沒錯，但如果到達一定的層數後，訓練的準確率就會開始下降了，這代表說如果網路過深的話，會變得更加難以訓練
:::
:::info
#### Detail
- 那為什麼深度越深反而變得更難訓練呢？我們回到神經網路反向傳遞的部份，我們知道要更新參數的方法是利用Loss function對參數的偏”微分”來得出參數調整的梯度，通過不斷的訓練，來找到一個Loss function最小的結果，如果現在是只有1層網路，反向傳遞的梯度也就只需要傳遞1次，相對的，如果現在有100層網路，反向傳遞的梯度就需要傳遞100才能到最前面的參數，所以當網路層數加深時，梯度在傳遞的過程中就會慢慢的消失，這也就是所謂的梯度消失，就會無法對前面網路層的參數進行有效的更新，因此Deep Residual Network就出現了，也就是ResNet

:::
:::warning
#### Conclusion

:::
[refer](https://blog.csdn.net/qq_25737169/article/details/78847691?source=post_page---------------------------)
[refer](https://arxiv.org/pdf/1512.03385.pdf?source=post_page---------------------------)
[refer]()
[refer]()
[refer]()

---
### Deeo Residual Network(DRN)
:::success
#### Abstracion
- ![](https://i.imgur.com/NFM29fx.png)
- 從上面圖來看，左邊是一般的網路(平原網路)，右邊是加入捷徑的殘差網路，我們假設H(x)是我們的期望輸出，原本網路的最後的H(x)就是F(x)，而我們可以看出在殘差網路那邊在F(x)加上了原本的輸入x，所以H(x)=F(x)+x，那為什麼要這樣呢？
- 這裡我們來思考一下，前面我們說到了反向傳遞，是用loss function來決定的，而loss function不外乎就是跟output跟target的值，然而我們說到了梯度消失的問題，假設我們已經學習到比較飽和的準確率的時候，那麼接下來要學習的目標就會變成是”恆等映射”的學習，而什麼是恆等映射呢？其實就是要將輸入 x 近似於輸出 H(x)，這樣就可以保持後面的層數中比較不會造成準確率下降。
- 好吧，或許你看到這裡還是有些不懂，那我們來看一下右邊的殘差網路，殘差網路在輸出的部份加入了一個x，輸出H(x)就會變成H(x)=F(x)+x，那如果我們把F(x)=0時，咦！？就會變成H(x) = x了，這不就是前面所說的恆等映射嗎？所以殘差網路就變成訓練 F(x):H(x)-x ，而目標就是要將F(x)趨近於0，這樣才可以使網路加深，準確率不會下降。
:::
:::info
#### Detail

- 假設輸入x = 5
- 經過第一層出來後的H(x)為5.1，那麼F(x) = 5.1–5 = 0.1
- 經過第二層出來後的H(x)為5.2，那麼F(x) = 5.2–5 = 0.2
- 原本網路的變化率會是(5.2–5.1)/5.1 = 1.96%
- 那殘差網路的變化率是多少(0.2–0.1)/0.1 = 100%
- 對的，殘差網路對於調整參數的效果會更好
- 殘差去掉了相同的主體部份，進而突顯出微小的變化
---
- 我們來看一下論文上面的網路跟卷積核數量，我們會發現一件很奇怪的事，為什麼殘差網路的捷徑有分實線跟虛線的部份，再仔細看一下，虛線的部份的輸入channel跟中間的F(x)channel是不一樣的，所以虛線的部份會再對輸入x進行一次卷積來調整x的維度再進行相加=> H(x)=F(x)+Wx，W就是卷積。我們直接上Code啦(實作ResNet34)

:::
:::warning
#### Conclusion

:::
[refer](https://arxiv.org/pdf/1512.03385.pdf?source=post_page---------------------------)

---
### 
:::success
#### Abstracion
:::
:::info
#### Detail


:::
:::warning
#### Conclusion

:::
[refer]()

---
### 
:::success
#### Abstracion
:::
:::info
#### Detail


:::
:::warning
#### Conclusion

:::
[refer]()

---