卷積神經網絡在tenserflow的實現


卷積神經網絡的理論基礎看這篇:http://blog.csdn.net/stdcoutzyx/article/details/41596663/

卷積神經網絡的tenserflow教程看這里:http://www.tensorfly.cn/tfdoc/tutorials/deep_cnn.html

卷積神經網絡(convolutional neural networks,簡稱cnn)

CNN的基本結構包括兩層,其一為特征提取層,每個神經元的輸入與前一層的局部接受域相連,並提取該局部的特征。一旦該局部特征被提取后,它與其它特征間的位置關系也隨之確定下來;其二是特征映射層,網絡的每個計算層由多個特征映射組成,每個特征映射是一個平面,平面上所有神經元的權值相等。特征映射結構采用影響函數核小的sigmoid函數作為卷積網絡的激活函數(我們的實例中使用的死ralu函數),使得特征映射具有位移不變性。此外,由於一個映射面上的神經元共享權值,因而減少了網絡自由參數的個數。卷積神經網絡中的每一個卷積層都緊跟着一個用來求局部平均與二次提取的計算層,這種特有的兩次特征提取結構減小了特征分辨率。

在神經網絡中,神經元都和前一層所有神經有連接,這樣就使得神經網絡各層之間連接的參數非常多。在卷積神經網絡主要是通過下列兩個方法減少參數:

1.局部感知視野

原理:人對外界的認知是從局部到全局的,而圖像的空間聯系也是局部的像素聯系較為緊密,而距離較遠的像素相關性則較弱。

實現:如下圖,我們將每個神經元只和10*10的像素相連,那么現在對應參數應該為10*10。我們將這個過程稱做為卷積。

2.共享參數

共享參數也就是權值共享。

原理:圖像的一部分的統計特性與其他部分是一樣的。這也意味着我們在這一部分學習的特征也能用在另一部分上,所以對於這個圖像上的所有位置,我們都能使用同樣的學習特征。

我們可以將上面的100個參數看成是特征的提取方式,也可以看成是過濾器。也就是說我們用這個過濾器對一張大圖片進行掃描工作。並獲取特征,我們將這100個參數又叫做卷積核。、

如下圖所示,展示了一個33的卷積核在55的圖像上做卷積的過程。每個卷積都是一種特征提取方式,就像一個篩子,將圖像中符合條件(激活值越大越符合條件)的部分篩選出來。

3.多核卷積

 如上面所述,只有100個參數的時候,表名只有1個10*10的卷積核,顯然特征提取是不從分的,我可以添加多個卷積核,比如可以添加32個卷積核,在多個卷積核時,如下圖所示

 

上圖右,不同顏色表明不同的卷積核。每個卷積核都會將圖像生成為另一幅圖像。比如兩個卷積核就可以將生成兩幅圖像,這兩幅圖像可以看做是一張圖像的不同的通道。

下圖展示了在四個通道上的卷積操作,有兩個卷積核,生成兩個通道。其中需要注意的是,四個通道上每個通道對應一個卷積核,先將w2忽略,只看w1,那么在w1的某位置(i,j)處的值,是由四個通道上(i,j)處的卷積結果相加然后再取激活函數值得到的。

這里還有一個公式!!!!!!!!!!!

 

4.池化(Down-pooling)

原理:對不同位置的特征進行聚合統計

做法:計算圖像的一個區域上的某個特定特征的平均值(或者最大值)。

在通過卷積獲得了特征 (features) 之后,下一步我們希望利用這些特征去做分類。理論上講,人們可以用所有提取得到的特征去訓練分類器,例如 softmax 分類器,但這樣做面臨計算量的挑戰。對於一個 96X96 像素的圖像,假設我們已經學習得到了400個定義在8X8輸入上的特征,每一個特征和圖像卷積都會得到一個 (96 − 8 + 1) × (96 − 8 + 1) = 7921 維的卷積特征,由於有 400 個特征,所以每個樣例 (example) 都會得到一個 7921 × 400 = 3,168,400 維的卷積特征向量。學習一個擁有超過 3 百萬特征輸入的分類器十分不便,並且容易出現過擬合 (over-fitting)。

 

為了解決這個問題,首先回憶一下,我們之所以決定使用卷積后的特征是因為圖像具有一種“靜態性”的屬性,這也就意味着在一個圖像區域有用的特征極有可能在另一個區域同樣適用。因此,為了描述大的圖像,一個很自然的想法就是對不同位置的特征進行聚合統計,例如,人們可以計算圖像一個區域上的某個特定特征的平均值 (或最大值)。這些概要統計特征不僅具有低得多的維度 (相比使用所有提取得到的特征),同時還會改善結果(不容易過擬合)。這種聚合的操作就叫做池化 (pooling),有時也稱為平均池化或者最大池化 (取決於計算池化的方法)。

原理到這就結束了,現在分析tenserflow里面卷積神經部分的代碼:

運行方式:

源文件所在文件夾:tensorflow/models/image/cifar10/

文件 作用
cifar10_input.py 讀取本地CIFAR-10的二進制文件格式的內容。
cifar10.py 建立CIFAR-10的模型。
cifar10_train.py 在CPU或GPU上訓練CIFAR-10的模型。
cifar10_multi_gpu_train.py 在多GPU上訓練CIFAR-10的模型。
cifar10_eval.py 評估CIFAR-10模型的預測性能。

 

 輸入命令:python cifar10.train.py 對模型進行訓練,訓練大概需要四五個小時,訓練結果會保存。

 輸入命令:python cifar10_eval.py 對訓練結果進行評估

 

cifar-10模型

cifar-10神經網絡的模型部分代碼位於cifar10.py,主要包含以下模塊:

1.數據輸入:包含inputs() distorted_input()等函數,主要是下載數據,並讀取數據,對數據進行預處理,方便后續評估和訓練的輸入;

2.模型預測:主要包含了inference函數,通過調用tenserflow已有的函數,構建cnn完整的模型;

3.模型訓練:包括了loss() 和 train()函數,對模型進行訓練,使其能夠進行分類。

模型輸入 

輸入模型是通過 inputs() 和distorted_inputs()函數建立起來的,這2個函數會從CIFAR-10二進制文件中讀取圖片文件,由於每個圖片的存儲字節數是固定的,因此可以使用tf.FixedLengthRecordReader函數。更多的關於Reader類的功能可以查看Reading Data

圖片文件的處理流程如下:

  • 圖片會被統一裁剪到24x24像素大小,裁剪中央區域用於評估或隨機裁剪用於訓練;
  • 圖片會進行近似的白化處理,使得模型對圖片的動態范圍變化不敏感。

對於訓練,我們另外采取了一系列隨機變換的方法來人為的增加數據集的大小:

函數可以查看下面的鏈接。

模型預測 

模型的預測流程由inference()構造,該函數會添加必要的操作步驟用於計算預測值的 logits,其對應的模型組織方式如下所示:

 

上圖模型的基本參數為:
  • 輸入:24*24大小的圖片
  • 第一層卷積:5*5大小的卷積核64個,
  • 第一層max-pooling:2×2的核。
  • 第二層卷積:5×5卷積核64個,。
  • 第二層max-pooling:3*3的核。
  • 第三層卷積:與上一層是全連接,3*3的卷積核384個。
  • 第四層卷積:3×3的卷積核384個,兩個GPU各192個。該層與上一層連接沒有經過pooling層。
  • 第五層softmax:歸一化 

 

 

tensorflow中圖像處理的相關函數:http://www.tensorfly.cn/tfdoc/api_docs/python/image.html

tenserflow中神經網絡相關的函數: http://www.tensorfly.cn/tfdoc/api_docs/python/nn.html

參考:

http://ibillxia.github.io/blog/2013/04/06/Convolutional-Neural-Networks/

http://stackoverflow.com/questions/34619177/what-does-tf-nn-conv2d-do-in-tensorflow

http://www.cnblogs.com/hellocwh/p/5564568.html  實驗實現

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM