# Evolution of CNN ###### tags: `學習紀錄` [toc] --- ## Before Meeting :::success - CNN演化史 -  ::: [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 -  ::: :::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拿下冠軍,深度學習正式大爆發。 -  - AlexNet的特點: - 使用了非線性的激活函數(Activation function):Relu 對於什麼是Activation function,我之後會找時間來介紹,不懂的可以先參考這個網站,在AlexNet以前,大部分的網路都是用tanh當作激活函數 - 使用了Data augmentation 和 Dropout 來防止Overfitting - 多個GPU並行運算 - 之所以為什麼上面架構會分成上下2層去訓練,是因為當初在訓練的時候記憶體不夠所以分成兩塊在GPU上訓練,其實這樣的網路要弄成一層也是可以的,以下這張圖就是一層的網路架構圖,其實是跟LeNet有點類似的,這裡我用開源dataset oxflower17 來實行AlexNet,我也加入了data augumentation,大家可以參考看看。 -  ::: :::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的好幾倍,訓練時間也會相對的較長。 -  ::: :::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。 -  ::: :::info #### Detail - 而GoogLeNet最重要的就是Inception架構: -  - 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個輔助分類器,為了避免梯度消失的情況 -  ::: :::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層的網路差!!!,不是說越深越好嗎? -  - 在經過實驗後發現:網路層數的增加可以有效的超加準確率沒錯,但如果到達一定的層數後,訓練的準確率就會開始下降了,這代表說如果網路過深的話,會變得更加難以訓練 ::: :::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 -  - 從上面圖來看,左邊是一般的網路(平原網路),右邊是加入捷徑的殘差網路,我們假設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]() ---
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up