顯示具有 TensorFlow 標籤的文章。 顯示所有文章
顯示具有 TensorFlow 標籤的文章。 顯示所有文章

2019年7月26日 星期五

學習經典卷積神經網路一 (LeNet、AlexNet、VGGNet)

說明

簡單紀錄以下幾個經典卷積神經網路 ( AlexNet 、 VGGNet 、 Google Inception Net 、 ResNet ) 的概念及創新技術點。下圖為他們出現的順序及時間,其中AlexNet的出現為整個CNN的發展,帶來相當重大的一個突破。



並且它們分別在 ILSVRC ( ImageNet Large Scale Visual Recognition Challenge ) 比賽項目中取得如下的成就:
  1. AlexNet - 2012年冠軍 ( top-5 錯誤率 16.4%,使用額外資料可達15.3%,8層神經網路)
  2. VGGNet - 2014 年亞軍 ( top-5 錯誤率7.3%,19層神經網路 ) 
  3. Google Inception Net - 2014 年冠軍 ( top-5 錯誤率 6.7%,22層神經網路 ) 
  4. ResNet - 2015 年的冠軍 ( top-5 錯誤率 3.57% ,152 層神經網路 )

ILSVRC 的 top-5 錯誤率在最近幾年取得重大突破,而主要的突破點都是在深度學習和卷積神經網路,成績的大幅提升幾乎都伴隨著卷積神經網路的層數加深。目前在 ImageNet50 資料集上人眼能夠達到的錯誤率大約在 5.1%,而 ILSVRC 2015年冠軍 ResNet  (152層 ) 的成績已能夠達到錯誤率 3.57%。代表神經網路已基本解決了 ImageNet 資料集上的圖片分類問題。

「ILSVRC 層數」的圖片搜尋結果


LeNet (論文連結)

1998年,由電腦科學家Yann LeCun等提出的LeNet5採用了基於梯度的反向傳播演算法對網路進行有監督的訓練,Yann LeCun在機器學習、計算機視覺等都有傑出貢獻,被譽為卷積神經網路之父。 
LeNet5網路通過交替連接的卷積層 (Convolutions) 和池化層 (Subsampling),將原始影像逐漸轉換為一系列的特徵,之後再將這些特徵傳遞給全連接層 (Full Connection) 進行分類,並成功應用於手寫體識別。學術界對於卷積神經網路的關注,也正是開始於LeNet5網路的提出。LeNet網路架構如下。




卷積神經網路的特點在於 區域性連線 (Local Receptive Field)、權值共享 (Shared Weights)。
(1) 區域性連線 (Local Receptive Field)卷積網路的節點僅和其前一層的部分節點相連線,只用來學習區域性特徵。區域性感知結構的構思理念來源於動物視覺的皮層結構,其指的是動物視覺的神經元在感知外界物體的過程中起作用的只有一部分神經元。在計算機視覺中,影象中的某一塊區域中,畫素之間的相關性與畫素之間的距離同樣相關,距離較近的畫素間相關性強,距離較遠則相關性就比較弱,由此可見區域性相關性理論也適用於計算機視覺的影象處理領域。這種區域性連線的方式大幅減少了引數數量,加快了學習速率,同時也在一定程度上減少了過擬合的可能。


(2) 權值共享 (Shared Weights) 在卷積神經網路中,神經元對應的權值是相同的。由於權值相同,因此可以減少訓練的引數量。共享的權值和偏置也被稱作卷積核。

(3) 池化 (Pooling) - 池化層是卷積神經網路中另一個重要的概念,它實際上是一種形式的降採樣。透過將鄰近的區域內的特徵點整合得到新的特徵,用更高層的抽象表示圖像特徵達到降低維度的結果。並且因為區域降維的關係,具有對鄰近小區域抗干擾的能力。同時也減少了過度擬合 (over-fitting) 的情況。目前常見的作法有 mean-pooling、max-pooling和stochastic-pooling等三種,其中又以最大池化層 (Max-pooling) 最為常見。

AlexNet 

由深度學習大神 Hinton 的學生 Alex 於 2012年提出的深度卷積神經網路模型 AlexNet,將 LeNet 模型的思想發揚光大,把 CNN 的基本原理應用到了很深很寬的網路中。AlexNet 使用到的新技術點如下:

(1) ReLU - AlexNet成功使用 ReLU 作為 CNN 的啟動函數,並驗證其效果在較深的網路超過了 Sigmoid,成功解決了 Sigmoid 在網路較深時的梯度消失問題。

(2) Dropout - 訓練時使用 Dropout 隨機忽略一部分神經元,以避免模型過度擬合。

(3) 使用重疊的最大池化 ( max pooling ) - 此前 CNN 中普遍使用平均池化,而 AlexNet 中則全部使用最大池化,避免平均池化的模糊化效果。並且 AlexNet 提出讓步長比池化核的尺寸小,這樣池化層的輸出之間會有重疊和覆蓋,提升了特徵的豐富性。

(4) 提出 LRN 層 - 對局部神經元的活動建立競爭機制,使得其中響應較大的值變得更大,並抑制其他回饋較小的神經元,增強了模型的泛化性。

(5) 使用 CUDA 加速深度卷積網路的訓練

(6) 資料增強 ( data argumentation ) - 透過擷取影像中不同部位的子影像,以及水平翻轉的鏡像影像等作法,增加資料的豐富性,可以大大減輕過度擬合,提升泛化能力。


AlexNet 網路結構如下:
「Alexnet 網路結構」的圖片搜尋結果



VGGNet 

VGGNet 是牛津大學電腦視覺組 ( Visual Geometry Group ) 和 Google DeepMind 公司的研究員一起研發的深度卷積神經網路。

VGGNet 探索了卷積神經網路的深度與其效能之間的關係。透過反覆堆疊 3 x 3 的小型卷積核和 2 x 2 的最大池化層,VGGNet 成功構築了 16 ~ 19 層深的卷積神經網路。VGGNet 相比之前的網路結構,錯誤率大幅下降許多。同時 VGGNet 的拓展性很強,遷移到其他影像資料的泛化性非常好。VGGNet 的特點如下:


(1) 探索卷積神經網路的深度與其效能之間的關係 - 下圖為 VGGNet 各級別的網路結構圖,以及每一級別的參數量,從 11 層的網路一直到 19 層的網路都有詳盡的效能測試。其中 D、E 網路結構,也就是我們常說的 VGGNet-16 和 VGGNet-19。

「VGGNET 各級別參數量」的圖片搜尋結果

VGGNet 擁有 5 段卷積,每一段內有 2 ~ 3 個卷積層,同時每段尾部會連接一個最大池化層用來縮小圖片尺寸。每段內的卷積核數量一樣,越靠後段的卷積核數量越多。

(2) 使用同樣大小的卷積核 - VGGNet 中全部使用了 3 x 3 的卷積核和 2 x 2 的最大池化核。如下圖所示,兩個 3 x 3 的卷積層串聯相當於一個 5 x 5 的卷積層,即一個像素會跟周圍 5 x 5的像素產生關聯,可視為感受區大小為 5 x 5。
 ã€ŒVGGNET 卷積層 等效」的圖片搜尋結果

而 3 個 3 x 3 的卷積層串聯的效果則相當於 1 個 7 x 7 的卷積層。但 3 個串聯的 3 x 3 卷積層,擁有比 1 個 7 x 7 的卷積層更少的參數量,只有後者的 ( 3 * 3 * 3 ) / ( 7 * 7 ) = 55%。最重要的是, 3 個 3 x 3的卷積層擁有比 1 個 7 x 7 的卷積層更多的非線性變換 ( 前者可以使用三次 ReLU啟動函數,而後者只有一次 )。

(3) 採用 Multi-Scale 的方法 - 預測時將原始影像 Scale至不同的尺寸 ,並對不同尺寸進行分類預測,再將不同尺寸的預測結果平均得到最後結果。另外還使用 Multi-Scale的方法做資料增強,將原始影像縮放到不同尺寸,然後再隨機裁 224 x 224 的圖片。



另外Google Inception Net、ResNet則下次有機會再說明了...

參考資料






2018年4月29日 星期日

TensorFlow 學習筆記(一) - Windows 上安裝 TensorFlow

本文將說明如何在 Windows 上安裝 TensorFlow ,以及在安裝之前需要注意的事項。

確定 TensorFlow 版本

請按照個人配備及需求,在以下版本中選擇一種來安裝:
  • 只支援 CPU 的 TensorFlow。如果你的系統不支援 NVIDIA® GPU ,你必須安裝這個版本。这个版本的 TensorFlow 通常安裝起來比較簡單,所以對於初入門的使用者,即使你擁有 NVIDIA GPU,我們也推薦首先使用這個版本。
  • 支援 GPU 的 TensorFlow。 TensorFlow 在 GPU 上通常比在 CPU 上的執行得更快。所以如果你有符合以下要求的 NVIDIA® GPU 並且注重效能,可以隨後安裝這個版本。
GPU support TensorFlow 的 NVIDIA 需求
需要事先安裝以下套件:
  • CUDA® Toolkit 8.0。詳見 NVIDIA's documentation。確保按照文檔中描述的將 Cuda 相關路徑加入到 %PATH% 環境變數中。
  • CUDA Toolkit 8.0 相關的 NVIDIA 驅動程式。
  • cuDNN v5.1。詳見 NVIDIA's documentation。注意:cuDNN 通常與其他 CUDA DLLs 安裝的位置不同。確保將 cuDNN 庫的安裝目錄加入到 %PATH% 中。
  • CUDA Compute Capability 3.0 或更高的 GPU 晶片。支援的 GPU 晶片詳見 NVIDIA documentation 。
如上述軟體版本較舊,請將其升級到指定版本。

確定如何安裝 TensorFlow

Windows下安裝TensorFlow有如下選擇:
  • "native" pip
  • Anaconda
使用原生 pip 直接在系統中安裝 TensorFlow,而不使用虛擬環境。 因為原生 pip 將直接安裝於Windows系統中,所以可能會干擾其他基於Python的安裝。不過,如果你理解 pip 和 Python 環境,原生 pip 安裝通常只需要一個指令! 如果使用原生 pip 安裝,則可在任何目錄中執行 TensorFlow 程式。
在 Anaconda 中,你可以通過 conda 建立一個虛擬環境,在開發測試上較為安全。因此即使官網推薦使用 pip install 安裝 TensorFlow,而非conda install但小編之後仍將以 Anaconda 的方式進行測試。原生 pip 安裝方式僅提供參考。
注意:使用 conda install 指令安裝而非官方支持。也就是说 TensorFlow 團隊沒有測試也沒有管理過 conda 安裝。 使用 conda 需要自行承擔風險。

原生 pip 安裝

如果還沒安裝以下版本的 Python ,請先安裝:
TensorFlow 在 Windows 上支援 Python 3.5.x 和  3.6.x 。 注意 Python 3 使用 pip3,我们用 pip3 來安裝 TensorFlow。
在 terminal 中輸入如下指令安裝 CPU版本 的 TensorFlow:
C:\> pip3 install --upgrade tensorflow
安裝支援 GPU 版本的 TensorFlow,使用以下指令:
C:\> pip3 install --upgrade tensorflow-gpu

Anaconda 安裝

Anaconda 安裝是社區支持,而非官方支持
按照以下步驟在 Anaconda 環境中安裝 TensorFlow:
  1. 按說明下載並安裝 Anaconda: Anaconda download site
  2. 建立一個 conda 環境,命名為 tensorflow,以便運行某個 Python 版本:
    C:\> conda create -n tensorflow 
  3. 啟用 anaconda 環境:
    C:\> activate tensorflow
    (tensorflow)C:\>  # 你的提示符號應該發生變化 
  4. 在你的 conda 環境中安裝 CPU 版本的 TensorFlow:
    (tensorflow)C:\> pip install --ignore-installed --upgrade tensorflow 
    安裝支援 GPU 版本的 TensorFlow:
    (tensorflow)C:\> pip install --ignore-installed --upgrade tensorflow-gpu 

驗證安裝結果

啟動 terminal。
如果通過 Anaconda 安裝,啟用 Anaconda 環境。
啟動 Python:
$ python
在 Python 互動式環境中輸入以下程式
>>> import tensorflow as tf
>>> hello = tf.constant('Hello, TensorFlow!')
>>> sess = tf.Session()
>>> print(sess.run(hello))
如果系统輸出如下,則安裝成功:
Hello, TensorFlow!
如果你是新接觸 TensorFlow,可以前往 Getting Started with TensorFlow 進行下一步的學習。
如果你是新接觸機器學習,則可以參考以下連結
如果系统輸出錯誤訊息而非歡迎訊息,查看Common installation problems


參考資料



<備註>

順便在這邊記錄下 Anaconda 及 Spyder 的一些操作指令。

1. Anaconda Update

開啟 Anaconda Prompt

C:> conda update --all
Or
C:> conda update conda
C:> conda update anaconda
C:> conda update spyder

2. Spyder 安裝 TensorFlow

安裝完成 Anaconda 之後,可再安裝運行 spyder 編譯器。 Spyder 下安裝 package 的方式如下。

1. 開啟 Anaconda Navigator,並選擇安裝 Spyder 編譯器。
2. 在 Spyder 編譯器環境中的 terminal 中,只需在指令開頭加入' ! ',即可使用 pip install 安裝套件。
In [1]: !pip install --ignore-installed --upgrade https://storage.googleapis.com/tensorflow/windows/cpu/tensorflow-1.7.0-cp36-cp36m-win_amd64.whl


 


apt-get update異常處理

1. 問題描述 系統環境:Ubuntu 18.04.3 LTS 執行apt-get update更新時遇到如下狀況 錯誤訊息: Err:1 http://security.ubuntu.com/ubuntu bionic-security InRe...