碼迷,www.tparu.icu
吉利平特名人堂 > Web開發 > 詳細

香港六彩平特肖论坛:CNN卷積神經網絡_深度殘差網絡 ResNet——解決神經網絡過深反而引起誤差增加的根本問題

時間:2018-05-01 23:48:13      閱讀:3791      評論:0      收藏:0      [點我收藏+]

吉利平特名人堂 www.tparu.icu 標簽:UI   傳統   cal   組成   目標   anaconda   ppi   反饋   data   

from:https://blog.csdn.net/diamonjoy_zone/article/details/70904212

環境:Win8.1 TensorFlow1.0.1

軟件:Anaconda3 (集成Python3及開發環境)

TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版)

TFLearn安裝:pip install tflearn

 

參考:

Deep Residual Learning for Image Recognition Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun

 

1. 前言


ResNet(Residual Neural Network)由前微軟研究院的 Kaiming He 等4名華人提出,通過使用 Residual Blocks 成功訓練152層深的神經網絡,在 ILSVRC 2015 比賽中獲得了冠軍,取得 3.57% 的 top-5 錯誤率,同時參數量卻比 VGGNet 低,效果非常突出。ResNet 的結構可以極快地加速超深神經網絡的訓練,模型的準確率也有非常大的提升。上一篇博文講解了 Inception,而 Inception V4 則是將 Inception Module 和 ResNet 相結合??梢鑰吹?ResNet 是一個推廣性非常好的網絡結構,甚至可以直接應用到 Inception Net 中。

 

CVPR16 上何凱明、張祥雨、任少卿和孫劍四人的 Deep Residual Learning for Image Recognition 毫無爭議地獲得了 Best Paper。

關于這篇文章細節可參考:

 

  1. 獲獎無數的深度殘差學習,清華學霸的又一次No.1 | CVPR2016 最佳論文
  2. 秒懂!何凱明的深度殘差網絡PPT是這樣的|ICML2016 tutorial

2. 問題

 

作者首先提出的問題是,深度神經網絡是不是越深越好? 

  • 理想情況下,只要網絡不過擬合,應該是越深越好。
  • 實際情況是網絡加深,accuracy 卻下降了,稱這種情況為 Degradation。(cnn中文漢字手寫識別構建網絡遇到過!)

技術分享圖片

 

LSTM 的提出者 Schmidhuber 早在 Highway Network 里指出神經網絡的深度對其性能非常重要,但是網絡越深其訓練難度越大,Highway Network 的目標就是解決極深的神經網絡難以訓練的問題。Highway Network 相當于修改了每一層的激活函數,此前的激活函數只是對輸入做一個非線性變換,Highway NetWork 則允許保留一定比例的原始輸入 x。(這種思想在inception模型也有,例如卷積是concat并行,而不是串行)這樣前面一層的信息,有一定比例可以不經過矩陣乘法和非線性變換,直接傳輸到下一層,仿佛一條信息高速公路,因此得名Highway Network

 

 

技術分享圖片

ResNet 最初的靈感出自這個問題:在不斷加神經網絡的深度時,會出現一個 Degradation 的問題,即準確率會先上升然后達到飽和,再持續增加深度則會導致準確率下降。這并不是過擬合的問題,因為不光在測試集上誤差增大,訓練集本身誤差也會增大。

 

假設有一個比較淺的網絡(Shallow Net)達到了飽和的準確率,那么后面再加上幾個的全等映射層(Identity mapping),起碼誤差不會增加,即更深的網絡不應該帶來訓練集上誤差上升。而這里提到的使用全等映射直接將前一層輸出傳到后面的思想,就是 ResNet 的靈感來源。

 

3. 組成

 

作者提出一個 Deep residual learning 框架來解決這種因為深度增加而導致性能下降問題。

 

假定某段神經網絡的輸入是 x,期望輸出是 H(x),即 H(x) 是期望的復雜潛在映射,但學習難度大;如果我們直接把輸入 x 傳到輸出作為初始結果,通過下圖“shortcut connections”,那么此時我們需要學習的目標就是 F(x)=H(x)-x,于是 ResNet 相當于將學習目標改變了,不再是學習一個完整的輸出,而是最優解 H(X) 和全等映射 的差值,即殘差技術分享圖片

技術分享圖片

 

Shortcut 原意指捷徑,在這里就表示越層連接,在 Highway Network 設置了一條從 x 直接到 y 的通路,以 T(x, Wt) 作為 gate 來把握兩者之間的權重;而 ResNet shortcut 沒有權值,傳遞 x 后每個??櫓謊安脅頕(x),且網絡穩定易于學習,作者同時證明了隨著網絡深度的增加,性能將逐漸變好。可以推測,當網絡層數夠深時,優化 Residual Function:F(x)=H(x)?x,易于優化一個復雜的非線性映射 H(x)。


4. 網絡結構


下圖所示為 VGGNet-19,以及一個34層深的普通卷積網絡,和34層深的 ResNet 網絡的對比圖??梢鑰吹狡脹ㄖ繃木砘窬綰?ResNet 的最大區別在于,ResNet 有很多旁路的支線將輸入直接連到后面的層,使得后面的層可以直接學習殘差,這種結構也被稱為 shortcut connections。傳統的卷積層或全連接層在信息傳遞時,或多或少會存在信息丟失、損耗等問題。ResNet 在某種程度上解決了這個問題,通過直接將輸入信息繞道傳到輸出,?;ば畔⒌耐暾?,整個網絡則只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。


技術分享圖片

 

同時34層 residual network 取消了最后幾層 FC,通過 avg pool 直接接輸出通道為1000的 Softmax,使得 ResNet 比16-19層 VGG 的計算量還低。

 

在 ResNet 的論文中,除了提出殘差學習單元的兩層殘差學習單元,還有三層的殘差學習單元。兩層的殘差學習單元中包含兩個相同輸出通道數(因為殘差等于目標輸出減去輸入,即,因此輸入、輸出維度需保持一致)的3′3卷積;而3層的殘差網絡則使用了 Network In Network 和 Inception Net 中的1′1卷積,并且是在中間3′3的卷積前后都使用了1′1卷積,先降維再升維的操作,降低計算復雜度。另外,如果有輸入、輸出維度不同的情況,我們可以對 x 做一個線性映射變換,再連接到后面的層。

 

技術分享圖片

 

5. 實驗

 

在使用了 ResNet 的結構后,可以發現層數不斷加深導致的訓練集上誤差增大的現象被消除了,ResNet 網絡的訓練誤差會隨著層數增大而逐漸減小,并且在測試集上的表現也會變好。最終在 ILSVRC 2015 比賽中獲得了冠軍,取得 3.57% 的 top-5 錯誤率。

 

技術分享圖片

 

tflearn 給出了 ResNet 在 CIFAR-10 上的實例 residual_network_cifar10.py,tflearn 通過 tflearn.residual_block 可以方便定義殘差學習單元: 

 

[python] view plain copy
  1. # -*- coding: utf-8 -*-  
  2.   
  3. """ Deep Residual Network. 
  4.  
  5. Applying a Deep Residual Network to CIFAR-10 Dataset classification task. 
  6.  
  7. References: 
  8.     - K. He, X. Zhang, S. Ren, and J. Sun. Deep Residual Learning for Image 
  9.       Recognition, 2015. 
  10.     - Learning Multiple Layers of Features from Tiny Images, A. Krizhevsky, 2009. 
  11.  
  12. Links: 
  13.     - [Deep Residual Network](//arxiv.org/pdf/1512.03385.pdf) 
  14.     - [CIFAR-10 Dataset](https://www.cs.toronto.edu/~kriz/cifar.html) 
  15.  
  16. """  
  17.   
  18. from __future__ import division, print_function, absolute_import  
  19.   
  20. import tflearn  
  21.   
  22. # Residual blocks  
  23. # 32 layers: n=5, 56 layers: n=9, 110 layers: n=18  
  24. n = 5  
  25.   
  26. # Data loading  
  27. from tflearn.datasets import cifar10  
  28. (X, Y), (testX, testY) = cifar10.load_data()  
  29. Y = tflearn.data_utils.to_categorical(Y, 10)  
  30. testY = tflearn.data_utils.to_categorical(testY, 10)  
  31.   
  32. # Real-time data preprocessing  
  33. img_prep = tflearn.ImagePreprocessing()  
  34. img_prep.add_featurewise_zero_center(per_channel=True)  
  35.   
  36. # Real-time data augmentation  
  37. img_aug = tflearn.ImageAugmentation()  
  38. img_aug.add_random_flip_leftright()  
  39. img_aug.add_random_crop([32, 32], padding=4)  
  40.   
  41. # Building Residual Network  
  42. net = tflearn.input_data(shape=[None, 32, 32, 3],  
  43.                          data_preprocessing=img_prep,  
  44.                          data_augmentation=img_aug)  
  45. net = tflearn.conv_2d(net, 16, 3, regularizer=‘L2‘, weight_decay=0.0001)  
  46. net = tflearn.residual_block(net, n, 16)  
  47. net = tflearn.residual_block(net, 1, 32, downsample=True)  
  48. net = tflearn.residual_block(net, n-1, 32)  
  49. net = tflearn.residual_block(net, 1, 64, downsample=True)  
  50. net = tflearn.residual_block(net, n-1, 64)  
  51. net = tflearn.batch_normalization(net)  
  52. net = tflearn.activation(net, ‘relu‘)  
  53. net = tflearn.global_avg_pool(net)  
  54. # Regression  
  55. net = tflearn.fully_connected(net, 10, activation=‘softmax‘)  
  56. mom = tflearn.Momentum(0.1, lr_decay=0.1, decay_step=32000, staircase=True)  
  57. net = tflearn.regression(net, optimizer=mom,  
  58.                          loss=‘categorical_crossentropy‘)  
  59. # Training  
  60. model = tflearn.DNN(net, checkpoint_path=‘model_resnet_cifar10‘,  
  61.                     max_checkpoints=10, tensorboard_verbose=0,  
  62.                     clip_gradients=0.)  
  63.   
  64. model.fit(X, Y, n_epoch=200, validation_set=(testX, testY),  
  65.           snapshot_epoch=False, snapshot_step=500,  
  66.           show_metric=True, batch_size=128, shuffle=True,  
  67.           run_id=‘resnet_cifar10‘)  

 

6. 后續

 

在 ResNet 推出后不久,Google 就借鑒了 ResNet 的精髓,提出了 Inception V4 Inception-ResNet-V2,并通過融合這兩個模型,ILSVRC 數據集上取得了驚人的 3.08%的錯誤率??杉?,ResNet 及其思想對卷積神經網絡研究的貢獻確實非常顯著,具有很強的推廣性。

 

在 ResNet 的作者的第二篇相關論文 Identity Mappings in Deep Residual Networks中,ResNet V2被提出。ResNet V2 和 ResNet V1 的主要區別在于,作者通過研究 ResNet 殘差學習單元的傳播公式,發現前饋和反饋信號可以直接傳輸,因此shortcut connection 的非線性激活函數(如ReLU)替換為 Identity Mappings。同時,ResNet V2 在每一層中都使用了 Batch Normalization。這樣處理之后,新的殘差學習單元將比以前更容易訓練且泛化性更強。

 

CNN卷積神經網絡_深度殘差網絡 ResNet——解決神經網絡過深反而引起誤差增加的根本問題

標簽:UI   傳統   cal   組成   目標   anaconda   ppi   反饋   data   

原文地址:https://www.cnblogs.com/bonelee/p/8977095.html

(1)
(1)
   
舉報
評論 一句話評論(0
登錄后才能評論!
? 2014 吉利平特名人堂 版權所有 京ICP備13008772號-2
迷上了代碼!
前三直选复式 快三有哪些规律 重庆时时彩官方开奖 pk10五码计划免费软件 500网 北京pk赛车开结果 必中pk10手机计划软件安卓版 玩三公扑克牌作弊赌具 快速时时计算方法如下 600万彩票网精准计划 老重庆时时开奖结果查询 欢乐生肖平台哪个好 上海时时开奖时间 彩票双面盘1.995即可享受1.5返水 澳门赌大小攻略 功夫时时彩计划软件免费版