手把手教你用 TensorFlow 實現卷積神經網路
雷鋒網按:本文作者徐凱文,原文載於作者個人博客,雷鋒網已獲授權。
在知乎上看到一段介紹卷積神經網路的文章,感覺講的特別直觀明了,我整理了一下。首先介紹原理部分。
通過一個圖像分類問題介紹卷積神經網路是如何工作的。下面是卷積神經網路判斷一個圖片是否包含「兒童」的過程,包括四個步驟:
圖像輸入(InputImage)
卷積(Convolution)
最大池化(MaxPooling)
全連接神經網路(Fully-ConnectedNeural Network)計算。
首先將圖片分割成如下圖的重疊的獨立小塊;下圖中,這張照片被分割成了77張大小相同的小圖片。
接下來將每一個獨立小塊輸入小的神經網路;這個小的神經網路已經被訓練用來判斷一個圖片是否屬於「兒童」類別,它輸出的是一個特徵數組。
標準的數碼相機有紅、綠、藍三個通道(Channels),每一種顏色的像素值在0-255之間,構成三個堆疊的二維矩陣;灰度圖像則只有一個通道,可以用一個二維矩陣來表示。
將所有的獨立小塊輸入小的神經網路後,再將每一個輸出的特徵數組按照第一步時77個獨立小塊的相對位置做排布,得到一個新數組。
第二步中,這個小的神經網路對這77張大小相同的小圖片都進行同樣的計算,也稱權重共享(SharedWeights)。這樣做是因為,第一,對圖像等數組數據來說,局部數組的值經常是高度相關的,可以形成容易被探測到的獨特的局部特徵;第二,圖像和其它信號的局部統計特徵與其位置是不太相關的,如果特徵圖能在圖片的一個部分出現,也能出現在任何地方。所以不同位置的單元共享同樣的權重,並在數組的不同部分探測相同的模式。數學上,這種由一個特徵圖執行的過濾操作是一個離散的卷積,卷積神經網路由此得名。
卷積步驟完成後,再使用MaxPooling演算法來縮減像素採樣數組,按照2×2來分割特徵矩陣,分出的每一個網格中只保留最大值數組,丟棄其它數組,得到最大池化數組(Max-PooledArray)。
接下來將最大池化數組作為另一個神經網路的輸入,這個全連接神經網路會最終計算出此圖是否符合預期的判斷。
在實際應用時,卷積、最大池化和全連接神經網路計算,這幾步中的每一步都可以多次重複進行,總思路是將大圖片不斷壓縮,直到輸出單一的值。使用更多卷積步驟,神經網路就可以處理和學習更多的特徵。
下面是代碼,添加了詳細注釋:
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與實現