卷積神經網路---My way of AI 21
阿新 • • 發佈:2018-12-18
卷積神經網路
上一篇文章實現了用全連線層神經網路手寫數字識別,但是全連線層神經網路有一個缺點就是:假設我是32323的RGB圖片,如果我的第一層全連線層是500個節點,那麼我需要的引數就是32323*500+500一共需要150多萬個引數,這樣會導致計算過慢以及過擬合的問題。
於是就有了卷積神經網路的演算法。
卷積神經網路也有全連線層,但是在全連線層之前它加入了卷積層和池化層達到了減少計算引數的作用
卷積層
卷積層是卷積神經網路的重要組成部分,又被稱為過濾器(Filter)。
過濾器所處理的節點矩陣的長和寬需要由人工指定,這個節點矩陣也被稱為是過濾器的矩陣。RGB的節點矩陣是三維的,但是其過濾器尺寸是二維的。我們可以通過控制過濾器的深度來設定輸出節點矩陣的深度。比如:如果我們希望RGB圖片輸出的深度也是三,我們過濾器的深度就需要是3
程式碼
import tensorflow as tf
# 初始化權重矩陣,尺寸5*5,當前層深度是3,過濾器深度是16就代表有16個filter
filter_weight = tf.get_variable("weight", [5, 5, 3, 16], initializer=tf.truncated_normal_initializer(stddev=0.1))
# 為16個過濾器設定偏置
biases = tf.get_variable("biases", [16], initializer= tf.constant(0.1))
# tf.nn.connv2d提供了非常方便的函式實現了卷積層的向前傳播。,這個函式第一個矩陣代表當前層節點矩陣,這個矩陣是一個四維矩陣
# 後面三個維度對應節點矩陣,第一個維度對用哪一張圖片,(batch批處理)
conv = tf.nn.conv2d(input, filter_weight, strides=[1, 1, 1, 1], padding="SAME") # SAME代表選擇0填充
# 加上偏置
bias = tf.nn.bias_add(conv, biases)
# ReLU啟用函式去線性化
actived_conv = tf.nn. relu(bias)
卷積API
對照著demo看一下就能看懂了
池化層
首先明確一點池化層也是一種過濾器Filter。卷積層是加權求和加偏置,池化層更加簡單就是在當前池化的size下選擇最大值(max pooling)或者平均值(average pooling) 假如這是一張RGB圖片,我們在三個維度的每一個維度都選擇出最大值,其實也就代表著我們選擇了分辨能力最大的畫素點。很好理解。
程式碼
#池化層
pool=tf.nn.max_pool(actived_conv,
ksize=[1,3,3,1],strides=[1,2,2,1],padding="SAME")
引數解釋: actived_conv:卷積層計算好的引數 ksize:池化層視窗大小 strides:步長
ksize=[1,3,3,1],strides=[1,2,2,1],雖然給出的是一個長度為4的意味陣列,但是這個陣列第一個和最後一個元素必須是1,這表示池化層filter不可以跨不同輸入樣例或者節點矩陣深度。
全連線層
全連線層是卷積神經網路的最後一層,可以參考文章手寫數字識別