深度學習與神經網絡:mnist數(shù)據集實現(xiàn)手寫數(shù)字識別

大家好,在這一篇文章中,我們將做以下的三件事:

1:介紹mnist數(shù)據集的使用

2:創(chuàng)建模型,并且保存模型

3:在測試集中使用保存的模型進行檢測

一:介紹mnist數(shù)據集的使用

對于mnist數(shù)據集,具體的一些介紹我這里就不搬運過來了,這里我直接說我們如何在TensorFlow上使用mnist數(shù)據集.

在我們將mnist數(shù)據集準備喂入神經網絡時,我們需要提前對數(shù)據集進行處理,因為數(shù)據集的大小是28*28像素,我們就將每張圖片處理成長度784的一維數(shù)組,將這個數(shù)組作為神經網絡的訓練特征喂入神經網絡.

舉個例子:

一張數(shù)字手寫體圖片變成長度為 784 的一維數(shù)組[0.0.0.0.0.231 0.235 0.459 ……0.219 0.0.0.0.]輸入神經網絡。該圖片對應的標簽為[0.0.0.0.0.0.1.0. 0.0],標簽中索引號為 6 的元素為 1,表示是數(shù)字 6 出現(xiàn)的概率為 100%,則該圖片對應的識別結果是6。

而在TensorFlow中,我們加載數(shù)據集的時候,是使用input_data的read_data_sets().

具體指令如下:

from tensorflow.examples.tutorials.mnist import input_data

mnist = input_data.read_data_sets(’./data/’,one_hot=True)

接著說說上邊的指令:

在 read_data_sets()函數(shù)中有兩個參數(shù),第一個參數(shù)表示數(shù)據集存放路徑,第二個參數(shù)表示數(shù)據集的存取形式。當?shù)诙€參數(shù)為 Ture 時,表示以獨熱碼形式 存取數(shù)據集。read_data_sets()函數(shù)運行時,會檢查指定路徑內是否已經有數(shù)據 集,若指定路徑中沒有數(shù)據集,則自動下載,并將 mnist 數(shù)據集分為訓練集 train、 驗證集 validation 和測試集 test 存放。如圖下所示:

二:創(chuàng)建模型,并且保存模型

在這個例子中,我們也是有三個過程,一個是前向傳播,另外一個是反向傳播,在反向傳播中我們要用到正則化,指數(shù)衰減學習,滑動平均方法的設置,最后一個就是測試模塊.

①:前向傳播

關于前向傳播的理論知識,有興趣的小伙伴可以翻翻我之前的文章,那里有詳細的介紹,這里只講述在TensorFlow中,我們是如何使用前向傳播過程完成神經網絡的搭建.

大家在搭建前向傳播時,其實可以遵照一些固定的結構:

在前向傳播過程中,需要定義神經網絡中的參數(shù) w 和偏置 b,定義由輸入到輸出的 網絡結構。通過定義函數(shù) get_weight()實現(xiàn)對參數(shù) w 的設置,包括參數(shù) w 的形 狀和是否正則化的標志。同樣,通過定義函數(shù) get_bias()實現(xiàn)對偏置 b的設置。

現(xiàn)在讓我們創(chuàng)建一個:mnist_forward的py文件:

在這個代碼里,我們完成了基本的網絡搭建,是一個兩層的神經網絡,一層隱藏層,一層輸出層.如果有興趣的同學也可以自己調解下layer_node的個數(shù)或者是多加幾層來看看效果怎么樣.

②:反向傳播

在使用反向傳播時,我們也是有固定的結構:

反向傳播過程中,用 tf.placeholder(dtype, shape)函數(shù)實現(xiàn)訓練樣本 x 和樣 本標簽 y_占位,函數(shù)參數(shù) dtype 表示數(shù)據的類型,shape 表示數(shù)據的形狀;y 表示定義的前向傳播函數(shù) forward;loss 表示定義的損失函數(shù),一般為預測值與樣 本標簽的交叉熵(或均方誤差)與正則化損失之和;train_step 表示利用優(yōu)化算 法對模型參數(shù)進行優(yōu)化

常 用 優(yōu) 化 算 法 GradientDescentOptimizer 、 AdamOptimizer、MomentumOptimizer 算法,在上述代碼中使用的 GradientDescentOptimizer 優(yōu)化算法。

接著實例化 saver 對象,其中利用 tf.initialize _all_variables().run()函數(shù)實例化所有參數(shù)模型,利用 sess.run( )函數(shù)實現(xiàn)模型的訓練優(yōu)化過程,并每間隔一定輪數(shù)保存一次模型。

現(xiàn)在我們創(chuàng)建mnist_backward的py文件:

參照上述的代碼文件,我們來說說如何在TensorFlow中使用正則化,指數(shù)衰減率和滑動平均.

①:正則化

在上文中提到過,我們在forward.py中設置了正則化,這表明在反向傳播中我們\優(yōu)化模型參數(shù)是,需要在損失函數(shù)中加入正則化:

結構如下:

首先在forward.py中提前聲明:

if regularizer != None:

tf.add_to_collection('losses', tf.contrib.layers.l2_regularizer(regularizer)(w))

其次再在backward.py中聲明:

ce = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y, labels=tf.argmax(y_, 1))

cem = tf.reduce_mean(ce)

loss = cem + tf.add_n(tf.get_collection('losses'))

這樣我們就在反向傳播中引入了正則化.

②:指數(shù)衰減學習率

在訓練模型時,使用指數(shù)衰減學習率可以使模型在訓練的前期快速收斂接近較優(yōu) 解,又可以保證模型在訓練后期不會有太大波動.

如果在TensorFlow中使用指數(shù)衰減學習率.我們要在backward.py中加入:

learning_rate = tf.train.exponential_decay(

LEARNING_RATE_BASE,

global_step,

LEARNING_RATE_STEP,

LEARNING_RATE_DECAY,

staircase=True)

③:滑動平均

在模型訓練時引入滑動平均可以使模型在測試數(shù)據上表現(xiàn)的更加健壯。

在TensorFlow引入滑動平均需要加入:

ema = tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY, global_step)

ema_op = ema.apply(tf.trainable_variables())

with tf.control_dependencies([train_step, ema_op]):

train_op = tf.no_op(name='train')

經過上述的完善,我們的反向傳播模型也已經基本搭建完成.

在我們運行backward.py之后,我們的模型會保存在當前目錄里,接下來我們可以在測試集中調用我們所訓練的模型:

三:在測試集中使用保存的模型進行檢測

①:創(chuàng)建mnist_test.py

當神經網絡模型訓練完成后,便可用于測試數(shù)據集,驗證神經網絡的性能。結構如下:

通過對測試數(shù)據的預測得到準確率,從而判斷出訓練出的神經網絡模型的性能好壞。當準確率低時,可能原因有模型需要改進,或者是訓練數(shù)據量太少導致過擬合。

代碼如下:

另外大家在使用pycharm運行這個文件時,會發(fā)生:

這樣其實是沒有運行到該文件的主函數(shù),解決方法是:

將mnist_test添加至運行環(huán)境下:

這樣即可運行.

四:運行結果:

1;運行backward.py:

誤差總體是減小的,這里有些問題是因為我的訓練次數(shù)太少.

2:運行test.py

在使用9000步的模型時,測試集達到的準確率是97.66%.

因此來看,模型具有一定的泛化能力.

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容