在前幾次筆記中,筆者基本上將卷積神經(jīng)網(wǎng)絡(luò)的基本原理給講完了。從本次筆記開始,筆者在深度學(xué)習(xí)筆記中會(huì)不定期的對(duì) CNN 發(fā)展過程中的經(jīng)典論文進(jìn)行研讀并推送研讀筆記。今天筆者就和大家一起學(xué)習(xí)卷積神經(jīng)網(wǎng)絡(luò)和深度學(xué)習(xí)發(fā)展歷史上具有奠基性的經(jīng)典論文之一的關(guān)于 LeNet-5 網(wǎng)絡(luò)一文。LeNet-5 是由具有卷積神經(jīng)網(wǎng)絡(luò)之父之美譽(yù)的 Yann LeCun 在1998年發(fā)表在 IEEE 上面的一篇 Gradient-based learning applied to document recognition 上提出來的,所以直接由 LeCun 大佬名字命名了。論文原文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
LeNet-5 網(wǎng)絡(luò)結(jié)構(gòu)
該篇論文有 42 頁(yè),但關(guān)于 LeNet-5 網(wǎng)絡(luò)的核心部分并沒有那么多,我們直接定位第二章的B 小節(jié)進(jìn)行閱讀。LeNet-5 的網(wǎng)絡(luò)結(jié)構(gòu)如下:
LeNet-5 共有 7 層,輸入層不計(jì)入層數(shù),每層都有一定的訓(xùn)練參數(shù),其中三個(gè)卷積層的訓(xùn)練參數(shù)較多,每層都有多個(gè)濾波器,也叫特征圖,每個(gè)濾波器都對(duì)上一層的輸出提取不同的像素特征。所以 LeNet-5 的簡(jiǎn)略結(jié)構(gòu)如下:
輸入-卷積-池化-卷積-池化-卷積(全連接)-全連接-全連接(輸出)
各層的結(jié)構(gòu)和參數(shù)如下:C1層是個(gè)卷積層,其輸入輸出結(jié)構(gòu)如下:輸入: 32 x 32 x 1 濾波器大小: 5 x 5 x 1 濾波器個(gè)數(shù):6輸出: 28 x 28 x 6參數(shù)個(gè)數(shù): 5 x 5 x 1 x 6 + 6 = 156
P2層是個(gè)池化層,其輸入輸出結(jié)構(gòu)如下:輸入: 28 x 28 x 6 濾波器大?。?2 x 2 濾波器個(gè)數(shù):6輸出: 14 x 14 x 6參數(shù)個(gè)數(shù):2 x 6 = 12在原文中,P1池化層采用的是平均池化,鑒于現(xiàn)在普遍都使用最大池化,所以在后面的代碼實(shí)現(xiàn)中我們統(tǒng)一采用最大池化。
C3層是個(gè)卷積層,其輸入輸出結(jié)構(gòu)如下:輸入: 14 x 14 x 6 濾波器大?。?5 x 5 x 6 濾波器個(gè)數(shù):16輸出: 10 x 10 x 16參數(shù)個(gè)數(shù): 5 x 5 x 6 x 16 + 16 = 2416
P2 池化之后的特征圖組合計(jì)算得到C3的濾波器個(gè)數(shù)。
P4層是個(gè)池化層,其輸入輸出結(jié)構(gòu)如下:輸入: 10 x 10 x 16 濾波器大?。?2 x 2 濾波器個(gè)數(shù):16輸出: 5 x 5 x 16參數(shù)個(gè)數(shù): 2 x 16 = 32
C5層在論文中是個(gè)卷積層,但濾波器大小為 5 x 5,所以其本質(zhì)上也是個(gè)全連接層。如果將5 x 5 x 16 拉成一個(gè)向量,它就是一個(gè)全連接層。其輸入輸出結(jié)構(gòu)如下:輸入: 5 x 5 x 16 濾波器大?。?5 x 5 x 16 濾波器個(gè)數(shù):120輸出: 1 x 1 x 120參數(shù)個(gè)數(shù): 5 x 5 x 16 x 120 + 120 = 48120
F6層是個(gè)全連接層,全連接的激活函數(shù)采用的是tanh函數(shù),其輸入輸出結(jié)構(gòu)如下:輸入:120輸出:84參數(shù)個(gè)數(shù):120 x 84 + 84 = 10164
F7層即輸出層,也是個(gè)全連接層,其輸入輸出結(jié)構(gòu)如下:輸入:84輸出:10參數(shù)個(gè)數(shù): 84 x 10 + 10 = 850
LeNet-5 的Tensorflow實(shí)現(xiàn)
我們前面關(guān)于如何使用Tensorflow搭建卷積神經(jīng)網(wǎng)絡(luò)的過程可以定下實(shí)現(xiàn) LeNet-5 的基本思路。如果在python中寫的時(shí)候我們需要定義創(chuàng)建輸入輸出的占位符變量模塊、初始化各層參數(shù)模塊、創(chuàng)建前向傳播模塊、定義模型優(yōu)化迭代模型,以及在最后設(shè)置輸入數(shù)據(jù)。
下面筆者用以上思路編寫一個(gè) LeNet-5 的簡(jiǎn)單實(shí)現(xiàn)代碼。 導(dǎo)入相關(guān)庫(kù)和創(chuàng)建輸入輸出的占位符變量:
import tensorflow as tfimport numpy as npfrom tensorflow.examples.tutorials.mnist import input_datadef create_placeholder(): X = tf.placeholder(tf.float32, shape=(None, 28 * 28)) Y = tf.placeholder(tf.float32, shape=(None, 10)) keep_prob = tf.placeholder(tf.float32) return X, Y, keep_prob
初始化各層參數(shù):
def initialize_parameters(): W1 = tf.get_variable('W1', [5,5,1,6], initializer=tf.contrib.layers.xavier_initializer()) b1 = tf.get_variable('b1', [6], initializer=tf.zeros_initializer()) W2 = tf.get_variable('W2', [5,5,6,16], initializer=tf.contrib.layers.xavier_initializer()) b2 = tf.get_variable('b2', [16], initializer=tf.zeros_initializer()) W3 = tf.get_variable('W3', [5, 5, 16, 120], initializer=tf.contrib.layers.xavier_initializer()) b3 = tf.get_variable('b3', [120], initializer=tf.zeros_initializer()) W4 = tf.get_variable('W4', [120, 84], initializer=tf.contrib.layers.xavier_initializer()) b4 = tf.get_variable('b4', [84], initializer=tf.zeros_initializer()) W5 = tf.get_variable('W5', [84, 10], initializer=tf.contrib.layers.xavier_initializer()) b5 = tf.get_variable('b5', [10], initializer=tf.zeros_initializer()) para = {'W1': W1, 'b1': b1, 'W2': W2, 'b2': b2, 'W3': W3, 'b3': b3, 'W4': W4, 'b4': b4, 'W5': W5, 'b5': b5} return para
創(chuàng)建 LeNet-5 的前向計(jì)算:
def forward_propagation(X, para, dropout): X = tf.reshape(X, [-1, 28, 28, 1]) X = tf.pad(X, [[0,0],[2,2],[2,2], [0,0]]) c1 = tf.nn.conv2d(X, para['W1'], strides=[1, 1, 1, 1], padding='VALID') + para['b1'] p2 = tf.nn.max_pool(c1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID') c3 = tf.nn.conv2d(p2, para['W2'], strides=[1, 1, 1, 1], padding='VALID') + para['b2'] p4 = tf.nn.max_pool(c3, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='VALID') c5 = tf.nn.conv2d(p4, para['W3'], strides=[1, 1, 1, 1], padding='VALID') + para['b3'] c5 = tf.contrib.layers.flatten(c5) f6 = tf.nn.tanh(tf.add(tf.matmul(c5, para['W4']), para['b4'])) f7 = tf.nn.tanh(tf.add(tf.matmul(f6, para['W5']), para['b5'])) f7 = tf.nn.dropout(f7, dropout) return f7
創(chuàng)建模型優(yōu)化計(jì)算函數(shù):
最后傳入 mnist 數(shù)據(jù)和相關(guān)超參數(shù):
注:本深度學(xué)習(xí)筆記系作者學(xué)習(xí) Andrew NG 的 deeplearningai 五門課程所記筆記,其中代碼為每門課的課后assignments作業(yè)整理而成。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4733瀏覽量
100420 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5463瀏覽量
120891 -
cnn
+關(guān)注
關(guān)注
3文章
350瀏覽量
22132
原文標(biāo)題:深度學(xué)習(xí)筆記14:CNN經(jīng)典論文研讀之Le-Net5及其Tensorflow實(shí)現(xiàn)
文章出處:【微信號(hào):AI_shequ,微信公眾號(hào):人工智能愛好者社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論