當前位置:
首頁 > 知識 > 手把手教你用 TensorFlow 實現卷積神經網路

手把手教你用 TensorFlow 實現卷積神經網路

手把手教你用 TensorFlow 實現卷積神經網路



雷鋒網按:本文作者徐凱文,原文載於作者個人博客,雷鋒網已獲授權。


在知乎上看到一段介紹卷積神經網路的文章,感覺講的特別直觀明了,我整理了一下。首先介紹原理部分。


通過一個圖像分類問題介紹卷積神經網路是如何工作的。下面是卷積神經網路判斷一個圖片是否包含「兒童」的過程,包括四個步驟:

圖像輸入(InputImage)


卷積(Convolution)


最大池化(MaxPooling)


全連接神經網路(Fully-ConnectedNeural Network)計算。

手把手教你用 TensorFlow 實現卷積神經網路



首先將圖片分割成如下圖的重疊的獨立小塊;下圖中,這張照片被分割成了77張大小相同的小圖片。

手把手教你用 TensorFlow 實現卷積神經網路



接下來將每一個獨立小塊輸入小的神經網路;這個小的神經網路已經被訓練用來判斷一個圖片是否屬於「兒童」類別,它輸出的是一個特徵數組。

手把手教你用 TensorFlow 實現卷積神經網路



標準的數碼相機有紅、綠、藍三個通道(Channels),每一種顏色的像素值在0-255之間,構成三個堆疊的二維矩陣;灰度圖像則只有一個通道,可以用一個二維矩陣來表示。


將所有的獨立小塊輸入小的神經網路後,再將每一個輸出的特徵數組按照第一步時77個獨立小塊的相對位置做排布,得到一個新數組。

手把手教你用 TensorFlow 實現卷積神經網路



第二步中,這個小的神經網路對這77張大小相同的小圖片都進行同樣的計算,也稱權重共享(SharedWeights)。這樣做是因為,第一,對圖像等數組數據來說,局部數組的值經常是高度相關的,可以形成容易被探測到的獨特的局部特徵;第二,圖像和其它信號的局部統計特徵與其位置是不太相關的,如果特徵圖能在圖片的一個部分出現,也能出現在任何地方。所以不同位置的單元共享同樣的權重,並在數組的不同部分探測相同的模式。數學上,這種由一個特徵圖執行的過濾操作是一個離散的卷積,卷積神經網路由此得名。

手把手教你用 TensorFlow 實現卷積神經網路



卷積步驟完成後,再使用MaxPooling演算法來縮減像素採樣數組,按照2×2來分割特徵矩陣,分出的每一個網格中只保留最大值數組,丟棄其它數組,得到最大池化數組(Max-PooledArray)。

接下來將最大池化數組作為另一個神經網路的輸入,這個全連接神經網路會最終計算出此圖是否符合預期的判斷。

手把手教你用 TensorFlow 實現卷積神經網路



在實際應用時,卷積、最大池化和全連接神經網路計算,這幾步中的每一步都可以多次重複進行,總思路是將大圖片不斷壓縮,直到輸出單一的值。使用更多卷積步驟,神經網路就可以處理和學習更多的特徵。


下面是代碼,添加了詳細注釋:


import tensorflow as tf


mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)# 讀取圖片數據集


sess = tf.InteractiveSession()# 創建session


# 一,函數聲明部分


def weight_variable(shape):

# 正態分布,標準差為0.1,默認最大為1,最小為-1,均值為0


initial = tf.truncated_normal(shape, stddev=0.1)


return tf.Variable(initial)


def bias_variable(shape):


# 創建一個結構為shape矩陣也可以說是數組shape聲明其行列,初始化所有值為0.1


initial = tf.constant(0.1, shape=shape)


return tf.Variable(initial)


def conv2d(x, W):


# 卷積遍歷各方向步數為1,SAME:邊緣外自動補0,遍歷相乘


def max_pool_2x2(x):

# 池化卷積結果(conv2d)池化層採用kernel大小為2*2,步數也為2,周圍補0,取最大值。數據量縮小了4倍


# 二,定義輸入輸出結構


# 聲明一個佔位符,None表示輸入圖片的數量不定,28*28圖片解析度


xs = tf.placeholder(tf.float32, [None, 28*28])


# 類別是0-9總共10個類別,對應輸出分類結果


ys = tf.placeholder(tf.float32, [None, 10])


keep_prob = tf.placeholder(tf.float32)


# x_image又把xs reshape成了28*28*1的形狀,因為是灰色圖片,所以通道是1.作為訓練時的input,-1代表圖片數量不定


x_image = tf.reshape(xs, [-1, 28, 28, 1])


# 三,搭建網路,定義演算法公式,也就是forward時的計算

## 第一層卷積操作 ##


# 第一二參數值得卷積核尺寸大小,即patch,第三個參數是圖像通道數,第四個參數是卷積核的數目,代表會出現多少個卷積特徵圖像;


# 對於每一個卷積核都有一個對應的偏置量。


b_conv1 = bias_variable([32])


# 圖片乘以卷積核,並加上偏執量,卷積結果28x28x32


# 池化結果14x14x32 卷積結果乘以池化卷積核


h_pool1 = max_pool_2x2(h_conv1)


## 第二層卷積操作 ##


# 32通道卷積,卷積出64個特徵


# 64個偏執數據

b_conv2 = bias_variable([64])


# 注意h_pool1是上一層的池化結果,#卷積結果14x14x64


# 池化結果7x7x64


h_pool2 = max_pool_2x2(h_conv2)


# 原圖像尺寸28*28,第一輪圖像縮小為14*14,共有32張,第二輪後圖像縮小為7*7,共有64張


## 第三層全連接操作 ##


# 二維張量,第一個參數7*7*64的patch,也可以認為是只有一行7*7*64個數據的卷積,第二個參數代表卷積個數共1024個


# 1024個偏執數據


b_fc1 = bias_variable([1024])


# 將第二層卷積池化結果reshape成只有一行7*7*64個數據# [n_samples, 7, 7, 64] ->> [n_samples, 7*7*64]

h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])


# dropout操作,減少過擬合,其實就是降低上一層某些輸入的權重scale,甚至置為0,升高某些輸入的權值,甚至置為2,防止評測曲線出現震蕩,個人覺得樣本較少時很必要


# 使用佔位符,由dropout自動確定scale,也可以自定義,比如0.5,根據tensorflow文檔可知,程序中真實使用的值為1/0.5=2,也就是某些輸入乘以2,同時某些輸入乘以0


keep_prob = tf.placeholder(tf.float32)


## 第四層輸出操作 ##


# 二維張量,1*1024矩陣卷積,共10個卷積,對應我們開始的ys長度為10


b_fc2 = bias_variable([10])


# 最後的分類,結果為1*1*10 softmax和sigmoid都是基於logistic分類演算法,一個是多分類一個是二分類


# 四,定義loss(最小誤差概率),選定優化優化loss,


cross_entropy = -tf.reduce_sum(ys * tf.log(y_conv)) # 定義交叉熵為loss函數

train_step = tf.train.DradientDescentOptimizer(0.5).minimize(cross_entropy) # 調用優化器優化,其實就是通過喂數據爭取cross_entropy最小化


# 五,開始數據訓練以及評測


correct_prediction = tf.equal(tf.argmax(y_conv,1), tf.argmax(ys,1))


accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


tf.global_variables_initializer().run()


for i in range(20000):


if i%100 == 0:


train_accuracy = accuracy.eval(feed_dict=)


print("step %d, training accuracy %g"%(i, train_accuracy))


train_step.run(feed_dict=)


print("test accuracy %g"%accuracy.eval(feed_dict=))


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 唯物 的精彩文章:

Prisma 技術發展的前世今生
怎麼才能堅持自學數據分析?這裡有個好榜樣
提高網路模型的泛化能力!深度學習之父Geoffrey Hinton的神經網路第九課
用RNN實現機器寫詩,機器寫作思路發展歷程你必須了解!

TAG:唯物 |

您可能感興趣

TensorFlow的使用之實現神經網路
雙向循環神經網路及TensorFlow實現
谷歌正式開源 Hinton 膠囊理論代碼,即刻用 TensorFlow 實現吧
CapsNet入門系列番外:基於TensorFlow實現膠囊網路
使用Tensorflow Object Detection API實現對象檢測
用Pytorch 實現的 Capsule Network
基於Tensorflow實現DeepFM
德國女性已經實現了自我?Deutsche Frauen verwirklichen sich selbst……
用TensorFlow Estimator實現文本分類
Virgil Abloh 主導下的 Louis Vuitton x Nike,在他們手中早就實現了…
如何使用Tokenvator和Windows Tokens實現提權
利用Tensoflow實現兩層神經網路的模型集成
Ether Universe項目評測:第四代跨鏈技術實現「異鏈」Tokens直接交換
用 greenlet 實現 Python 中的並發
語義分割網路DeepLab-v3的架構設計思想和TensorFlow實現
Machine Learning(一):基於 TensorFlow 實現寵物血統智能識別
OpenStack-Neutron的網路實現方式-flat網路
分散式框架spring-session實現session一致性使用問題
SpaceTime Enterprises 用VR實現你的太空夢
Python yield與實現