1. 程式人生 > >Deep Learning-TensorFlow (9) CNN卷積神經網路_《TensorFlow實戰》及經典網路模型(下)

Deep Learning-TensorFlow (9) CNN卷積神經網路_《TensorFlow實戰》及經典網路模型(下)

環境:Win8.1 TensorFlow1.0.1

軟體:Anaconda3 (整合Python3及開發環境)

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

轉載:

1. 《TensorFlow實戰》,黃文堅

上篇博文中介紹了 ILSVRC 及往年的經典模型 AlexNetVGGGoogle Inception V1, 本文繼續介紹 Inception 的後續版本,和15年微軟著名的 ResNet

6. Google Inception Net 

Google Inception Net 的大家族包括:

  • 2014年9月 Going Deeper with Convolutions 提出的 Inception V1(top-5錯誤率6.67%);
  • 2015年2月 Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate 提出的Inception V2(top-5錯誤率4.8%);
  • 2015年12月 Rethinking the Inception Architecture for Computer Vision 提出的 Inception V3(top-5錯誤率3.5%);
  • 2016年2月 Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning 提出的Inception V4
    (top-5錯誤率3.08%)。

Inception V2 學習了 VGGNet,用兩個3´3的卷積代替5´5的大卷積(用以降低引數量並減輕過擬合),還提出了著名的Batch Normalization(以下簡稱BN)方法。BN 是一個非常有效的正則化方法,可以讓大型卷積網路的訓練速度加快很多倍,同時收斂後的分類準確率也可以得到大幅提高。BN 在用於神經網路某層時,會對每一個 mini-batch 資料的內部進行標準化(normalization)處理,使輸出規範化到 N(0,1) 的正態分佈,減少了Internal Covariate Shift(內部神經元分佈的改變)。

補充:在 TensorFlow 1.0.0 中採用 

tf.image.per_image_standardization() 對影象進行標準化,舊版為 tf.image.per_image_whitening。

BN 的論文指出,傳統的深度神經網路在訓練時,每一層的輸入的分佈都在變化,導致訓練變得困難,我們只能使用一個很小的學習速率解決這個問題。而對每一層使用 BN 之後,我們就可以有效地解決這個問題,學習速率可以增大很多倍,達到之前的準確率所需要的迭代次數只有1/14,訓練時間大大縮短。而達到之前的準確率後,可以繼續訓練,並最終取得遠超於 Inception V1 模型的效能—— top-5 錯誤率4.8%,已經優於人眼水平。因為 BN 某種意義上還起到了正則化的作用,所以可以減少或者取消 Dropout,簡化網路結構。當然,只是單純地使用 BN 獲得的增益還不明顯,還需要一些相應的調整:

  1. 增大學習速率並加快學習衰減速度以適用 BN 規範化後的資料;
  2. 去除 Dropout 並減輕 L2正則(因BN已起到正則化的作用);
  3. 去除 LRN;
  4. 更徹底地對訓練樣本進行 shuffle;
  5. 減少資料增強過程中對資料的光學畸變(因為BN訓練更快,每個樣本被訓練的次數更少,因此更真實的樣本對訓練更有幫助)。
  6. 在使用了這些措施後,Inception V2 在訓練達到 Inception V1 的準確率時快了14倍,並且模型在收斂時的準確率上限更高。

Inception V3 網路則主要有兩方面的改造:

一是引入了 Factorization into small convolutions 的思想,將一個較大的二維卷積拆成兩個較小的一維卷積,比如將7´7卷積拆成1´7卷積和7´1卷積,或者將3´3卷積拆成1´3卷積和3´1卷積,如下圖所示。一方面節約了大量引數,加速運算並減輕了過擬合(比將7´7卷積拆成1´7卷積和7´1卷積,比拆成3個3´3卷積更節約引數),同時增加了一層非線性擴充套件模型表達能力。論文中指出,這種非對稱的卷積結構拆分,其結果比對稱地拆為幾個相同的小卷積核效果更明顯,可以處理更多、更豐富的空間特徵,增加特徵多樣性。


將一個3´3卷積拆成1´3卷積和3´1卷積

另一方面,Inception V3 優化了 Inception Module 的結構,現在 Inception Module 有35´35、17´17和8´8三種不同結構,如下圖所示。這些 Inception Module 只在網路的後部出現,前部還是普通的卷積層。並且 Inception V3 除了在 Inception Module 中使用分支,還在分支中使用了分支(8´8的結構中),可以說是Network In Network In Network。


Inception V3 中三種結構的 Inception Module

Inception V4 相比 V3 主要是結合了微軟的 ResNet,而 ResNet 將在下一節單獨講解,這裡不多做贅述。因此本節將實現的是 Inception V3,其整個網路結構如下表所示。由於 Google Inception Net V3 相對比較複雜,所以這裡使用 tf.contrib.slim 輔助設計這個網路。contrib.slim 中的一些功能和元件可以大大減少設計 Inception Net 的程式碼量,我們只需要少量程式碼即可構建好有42層深的 Inception V3。

Inception V3 網路結構


7. ResNet

ResNet(Residual Neural Network)由微軟研究院的 Kaiming He 等4名華人提出,通過使用 Residual Unit 成功訓練152層深的神經網路,在 ILSVRC 2015 比賽中獲得了冠軍,取得3.57%的 top-5 錯誤率,同時引數量卻比 VGGNet 低,效果非常突出。ResNet 的結構可以極快地加速超深神經網路的訓練,模型的準確率也有非常大的提升。上一節我們講解並實現了 Inception V3,而 Inception V4 則是將 Inception Module 和 ResNet 相結合。可以看到 ResNet 是一個推廣性非常好的網路結構,甚至可以直接應用到 Inception Net 中。本節就講解 ResNet 的基本原理,以及如何用 TensorFlow 來實現它。

在 ResNet 之前,瑞士教授 Schmidhuber 提出了 Highway Network,原理與 ResNet 很相似。這位 Schmidhuber 教授同時也是 LSTM 網路的發明者,而且是早在1997年發明的,可謂是神經網路領域元老級的學者。通常認為神經網路的深度對其效能非常重要,但是網路越深其訓練難度越大,Highway Network 的目標就是解決極深的神經網路難以訓練的問題。Highway Network 相當於修改了每一層的啟用函式,此前的啟用函式只是對輸入做一個非線性變換,Highway NetWork 則允許保留一定比例的原始輸入x。這樣前面一層的資訊,有一定比例可以不經過矩陣乘法和非線性變換,直接傳輸到下一層,彷彿一條資訊高速公路,因此得名Highway Network

Highway Network 主要通過 gating units 學習如何控制網路中的資訊流,即學習原始資訊應保留的比例。這個可學習的 gating 機制,正是借鑑自 Schmidhuber 教授早年的 LSTM 迴圈神經網路中的 gating。幾百乃至上千層深的 Highway Network 可以直接使用梯度下降演算法訓練,並可以配合多種非線性啟用函式,學習極深的神經網路現在變得可行了。事實上,Highway Network 的設計在理論上允許其訓練任意深的網路,其優化方法基本上與網路的深度獨立,而傳統的神經網路結構則對深度非常敏感,訓練複雜度隨深度增加而急劇增加。

ResNet 和 HighWay Network 非常類似,也是允許原始輸入資訊直接傳輸到後面的層中。ResNet 最初的靈感出自這個問題:在不斷加神經網路的深度時,會出現一個 Degradation 的問題,即準確率會先上升然後達到飽和,再持續增加深度則會導致準確率下降。這並不是過擬合的問題,因為不光在測試集上誤差增大,訓練集本身誤差也會增大。假設有一個比較淺的網路達到了飽和的準確率,那麼後面再加上幾個的全等對映層,起碼誤差不會增加,即更深的網路不應該帶來訓練集上誤差上升。而這裡提到的使用全等對映直接將前一層輸出傳到後面的思想,就是 ResNet 的靈感來源。

假定某段神經網路的輸入是 x,期望輸出是 H(x),如果我們直接把輸入 x 傳到輸出作為初始結果,那麼此時我們需要學習的目標就是F(x)=H(x)-x。如下圖所示,這就是一個 ResNet 的殘差學習單元(Residual Unit)ResNet 相當於將學習目標改變了,不再是學習一個完整的輸出,只是輸出和輸入的差別,即殘差F(x)


ResNet的殘差學習模組

下圖所示為 VGGNet-19,以及一個34層深的普通卷積網路,和34層深的 ResNet 網路的對比圖。可以看到普通直連的卷積神經網路和 ResNet 的最大區別在於,ResNet 有很多旁路的支線將輸入直接連到後面的層,使得後面的層可以直接學習殘差,這種結構也被稱為shortcut 或 skip connections


VGG-19,直連的34層網路,ResNet的34層網路的結構對比

傳統的卷積層或全連線層在資訊傳遞時,或多或少會存在資訊丟失、損耗等問題。ResNet 在某種程度上解決了這個問題,通過直接將輸入資訊繞道傳到輸出,保護資訊的完整性,整個網路則只需要學習輸入、輸出差別的那一部分,簡化學習目標和難度。

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


兩層及三層的 ResNet 殘差學習模組

下表所示為 ResNet 在不同層數時的網路配置,其中基礎結構很類似,都是前面提到的兩層和三層的殘差學習單元的堆疊。

ResNet不同層數時的網路配置


在使用了 ResNet 的結構後,可以發現層數不斷加深導致的訓練集上誤差增大的現象被消除了,ResNet 網路的訓練誤差會隨著層數增大而逐漸減小,並且在測試集上的表現也會變好。在 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 殘差學習單元的傳播公式,發現前饋和反饋訊號可以直接傳輸,因此 skip connection 的非線性啟用函式(如ReLU)替換為 Identity Mappings()。同時,ResNet V2 在每一層中都使用了 Batch Normalization。這樣處理之後,新的殘差學習單元將比以前更容易訓練且泛化性更強。

根據 Schmidhuber 教授的觀點,ResNet 類似於一個沒有 gates 的 LSTM 網路,即將輸入 x 傳遞到後面層的過程是一直髮生的,而不是學習出來的。同時,最近也有兩篇論文表示,ResNet 基本等價於 RNN 且 ResNet 的效果類似於在多層網路間的整合方法(ensemble)。ResNet 在加深網路層數上做出了重大貢獻,而另一篇論文 The Power of Depth for Feedforward Neural Networks 則從理論上證明了加深網路比加寬網路更有效,算是給 ResNet 提供了聲援,也是給深度學習為什麼要深才有效提供了合理解釋。

8. 總結

以上,我們簡單回顧了卷積神經網路的歷史,下圖所示大致勾勒出最近幾十年卷積神經網路的發展方向。

Perceptron(感知機)於1957年由 Frank Resenblatt 提出,而 Perceptron 不僅是卷積網路,也是神經網路的始祖。Neocognitron(神經認知機)是一種多層級的神經網路,由日本科學家 Kunihiko Fukushima 於20世紀80年代提出,具有一定程度的視覺認知的功能,並直接啟發了後來的卷積神經網路。LeNet-5 由 CNN 之父 Yann LeCun 於1997年提出,首次提出了多層級聯的卷積結構,可對手寫數字進行有效識別。


卷積神經網路發展圖

可以看到前面這三次關於卷積神經網路的技術突破,間隔時間非常長,需要十餘年甚至更久才出現一次理論創新。而後於2012年,Hinton 的學生 Alex 依靠8層深的卷積神經網路一舉獲得了 ILSVRC 2012 比賽的冠軍,瞬間點燃了卷積神經網路研究的熱潮。AlexNet 成功應用了 ReLU 啟用函式、Dropout、最大覆蓋池化、LRN 層、GPU加速等新技術,並啟發了後續更多的技術創新,卷積神經網路的研究從此進入快車道。

在AlexNet之後,我們可以將卷積神經網路的發展分為兩類,一類是網路結構上的改進調整(上圖中的左側分支),另一類是網路深度的增加(上圖的右側分支)。

2013年,顏水成教授的 Network in Network 工作首次發表,優化了卷積神經網路的結構,並推廣了1´1的卷積結構。在改進卷積網路結構的工作中,後繼者還有2014年的 Google Inception Net V1,提出了 Inception Module 這個可以反覆堆疊的高效的卷積網路結構,並獲得了當年 ILSVRC 比賽的冠軍。2015年初的 Inception V2 提出了 Batch Normalization,大大加速了訓練過程,並提升了網路效能。2015年年末的 Inception V3 則繼續優化了網路結構,提出了 Factorization in Small Convolutions 的思想,分解大尺寸卷積為多個小卷積乃至一維卷積。

而另一條分支上,許多研究工作則致力於加深網路層數,2014年,ILSVRC比賽的亞軍 VGGNet 全程使用3´3的卷積,成功訓練了深達19層的網路,當年的季軍 MSRA-Net 也使用了非常深的網路。2015年,微軟的 ResNet 成功訓練了152層深的網路,一舉拿下了當年 ILSVRC 比賽的冠軍,top-5 錯誤率降低至3.46%。其後又更新了ResNet V2,增加了 Batch Normalization,並去除了啟用層而使用 Identity Mapping 或 Preactivation,進一步提升了網路效能。此後,Inception ResNet V2 融合了 Inception Net 優良的網路結構,和 ResNet 訓練極深網路的殘差學習模組,集兩個方向之長,取得了更好的分類效果。

我們可以看到,自 AlexNet 於2012年提出後,深度學習領域的研究發展極其迅速,基本上每年甚至每幾個月都會出現新一代的技術。新的技術往往伴隨著新的網路結構,更深的網路的訓練方法等,並在影象識別等領域不斷創造新的準確率記錄。至今,ILSVRC 比賽和卷積神經網路的研究依然處於高速發展期,CNN 的技術日新月異。當然其中不可忽視的推動力是,我們擁有了更快的GPU計算資源用以實驗,以及非常方便的開源工具(比如TensorFlow)可以讓研究人員快速地進行探索和嘗試。在以前,研究人員如果沒有像 Alex 那樣高超的程式設計實力能自己實現 cuda-convnet,可能都沒辦法設計 CNN 或者快速地進行實驗。現在有了 TensorFlow,研究人員和開發人員都可以簡單而快速地設計神經網路結構並進行研究、測試、部署乃至實用。

相關推薦

Deep Learning-TensorFlow (9) CNN神經網路_《TensorFlow實戰經典網路模型

環境:Win8.1 TensorFlow1.0.1 軟體:Anaconda3 (整合Python3及開發環境) TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版)

Deep Learning-TensorFlow (8) CNN神經網路_《TensorFlow實戰經典網路模型

環境:Win8.1 TensorFlow1.0.1 軟體:Anaconda3 (整合Python3及開發環境) TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版) 轉載:

Deep Learning-TensorFlow (10) CNN神經網路_ TFLearn 快速搭建深度學習模型

環境:Win8.1 TensorFlow1.0.1 軟體:Anaconda3 (整合Python3及開發環境) TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版) TFLe

Deep Learning-TensorFlow (13) CNN神經網路_ GoogLeNet 之 Inception(V1-V4)

環境:Win8.1 TensorFlow1.0.1 軟體:Anaconda3 (整合Python3及開發環境) TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版)

Deep Learning-TensorFlow (12) CNN神經網路_ Network in Network 學習筆記

環境:Win8.1 TensorFlow1.0.1 軟體:Anaconda3 (整合Python3及開發環境) TensorFlow安裝:pip install tensorflow (CPU版) pip install tensorflow-gpu (GPU版)

Deep Learning-TensorFlow (1) CNN神經網路_MNIST手寫數字識別程式碼實現詳解

import tensorflow as tf import tensorflow.examples.tutorials.mnist.input_data as input_data import time # 計算開始時間   start = time.clock()

TensorFlowCNN神經網路的實現

下載MNIST資料集(28*28,輸入維度為784) import tensorflow as tf #下載MNIST資料集(28*28,輸入維度為784) from tensorflow.examples.tutorials.mnist import input_data mnist =

TensorFlow實現CNN神經網路對手寫數字集mnist的模型訓練

mnist手寫數字集相當於是TensorFlow應用中的Helloworld。 在學習了TensorFlow的卷積神經網路應用之後,今天就分步解析一下其應用過程  一、mnist手寫數字資料集         MN

Coursera Deep Learning 第四課 神經網路 程式設計作業: Convolutional Model: Application

Convolutional Neural Networks: Application Welcome to Course 4’s second assignment! In this notebook, you will: Implement helper

Coursera Deep Learning 第四課 神經網路 第二週 程式設計作業 殘差神經網路 Residual Networks

Coursera Deep Learning 第四課 卷積神經網路 第二週 程式設計作業 殘差神經網路 Residual Networks Welcome to the second assignment of this week! You will l

BP神經網路原理分析c++程式碼實現

為了方便廣大使用者的使用,本人將BP神經網路寫成了一個BPNNS類,這樣使用者們可以很方便的將此類潛入到自己的工程當中,此類的具體的使用規則,下面會介紹。 /*********************************************************

Deep Learning模型之:CNN神經網路深度解析CNN

http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了網上幾位大牛的部落格,詳細地講解了CNN的基礎結構與核心思想,歡迎交流。 1. 概述    卷積神經網路是一種特殊的深層的神經網路模型,它的特殊性體現在兩個方面,一方面它的神經元

【深度學習】Tensorflow——CNN 神經網路 2

轉自https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-05-CNN3/ 目錄 圖片處理  建立卷積層  建立全連線層  選優化方法  完整程式碼

【深度學習】Tensorflow——CNN 神經網路 1

轉自https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-04-CNN2/ 這一次我們會說道 CNN 程式碼中怎麼定義 Convolutional 的層和怎樣進行 pooling. 基於上一次卷積神經網路的介

TensorFlow——CNN神經網路處理Mnist資料集

import tensorflow as tf #Tensorflow提供了一個類來處理MNIST資料 from tensorflow.examples.tutorials.mnist import input_data import time #載入資料集 mnist=input_data.read_

吳恩達作業9神經網路實現手勢數字的識別基於tensorflow

提供資料集程式碼放在cnn_utils.py裡。 import math import numpy as np import h5py import matplotlib.pyplot as plt import tensorflow as tf from tensorfl

Deep Learning 第九章 神經網絡

分享 http learn 卷積 網絡 info com alt image Deep Learning 第九章 卷積神經網絡

Keras學習——CNN神經網路

本文主要介紹使用keras實現CNN對手寫資料集進行分類。 示例程式碼: import numpy as np from keras.datasets import mnist from keras.utils import np_utils from keras.models impo

CNN神經網路簡單實現模型

這是基於Mnist手寫識別的資料訓練的一個簡單的CNN卷積神經網路,可以直接在網上下載訓練資料集,但是經常會出現連線不到伺服器的提示,所以我下到本地進行資料的載入,下面程式碼的資料載入有問題,所以自己找了一些程式碼整出來了這個資料載入的辦法,連結為:https://blog.csdn.net/lxi

DeepLearning tutorial4CNN神經網路原理簡介+程式碼詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!