tensorflow基于CNN實戰(zhàn)mnist手寫識別(小白必看)
很榮幸您能看到這篇文章,相信通過標題打開這篇文章的都是對tensorflow感興趣的,特別是對卷積神經(jīng)網(wǎng)絡(luò)在mnist手寫識別這個實例感興趣。不管你是什么基礎(chǔ),我相信,你在看完這篇文章后,都能夠完全理解這個實例。這對于神經(jīng)網(wǎng)絡(luò)入門的小白來說,簡直是再好不過了。

通過這篇文章,你能夠?qū)W習(xí)到
- tensorflow一些方法的用法
- mnist數(shù)據(jù)集的使用方法以及下載
- CNN卷積神經(jīng)網(wǎng)絡(luò)具體python代碼實現(xiàn)
- CNN卷積神經(jīng)網(wǎng)絡(luò)原理
- 模型訓(xùn)練、模型的保存和載入
Tensorflow實戰(zhàn)mnist手寫數(shù)字識別
關(guān)于這個mnist手寫數(shù)字識別實戰(zhàn),我是跟著某課網(wǎng)上的教學(xué)視頻跟著寫的
需要導(dǎo)入的包
import numpy as np import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data #mnist數(shù)據(jù)用到的包
下載mnist數(shù)據(jù)
mnist = input_data.read_data_sets('mnist_data',one_hot=True)
通過這一行代碼,就可以將mnist數(shù)據(jù)集下載到本地文件夾mnist_data目錄下,當然,你也可以使用絕對地址下載你想要下載的地方。這里需要注意一點是,如果第一次運行程序,由于需要下載資源的緣故,故需要一段時間,并且下載過程是沒有提示的,之后下載成功時 才會提示 Success xxxxxx 。另一種方式就是直接去官網(wǎng)下載數(shù)據(jù)集
mnist官網(wǎng) 進去點擊就可以直接下載了。
張量的聲明
input_x = tf.compat.v1.placeholder(tf.float32,[None,28*28],name='input_x')#圖片輸入 output_y = tf.compat.v1.placeholder(tf.int32,[None,10],name='output_y')#結(jié)果的輸出 image = tf.reshape(input_x,[-1,28,28,1])#對input_x進行改變形狀,
稍微解釋一下
[-1,28,28,1] -1表示不考慮輸入圖片的數(shù)量,28*28是圖片的長和寬的像素值,1是通道數(shù)量,由于原圖片是黑白的 ,所以通道是1,若是彩色圖片,應(yīng)為3.
取測試圖片和標簽
test_x = mnist.test.images[:3000] test_y = mnist.test.labels[:3000]
[:3000]表示從列表下標為0到2999 這些數(shù)據(jù)
[1:3] 表示列表下標從1到2 這些數(shù)據(jù)
卷積神經(jīng)網(wǎng)絡(luò)第一層卷積層(用最通俗的言語告訴你什么是卷積神經(jīng)網(wǎng)絡(luò))
#第一層卷積 conv1 = tf.layers.conv2d(inputs=image,#輸入 filters=32,#32個過濾器 kernel_size=[5,5],#過濾器在二維的大小是5*5 strides=1,#步長是1 padding='same',#same表示輸出的大小不變,因此需要補零 activation=tf.nn.relu#激活函數(shù) )#形狀[28,28,32]
第二層池化層
pool1 = tf.layers.max_pooling2d( inputs=conv1,#第一層卷積后的值 pool_size=[2,2],#過濾器二維大小2*2 strides=2 #步長2 )#形狀[14,14,32]
第三層卷積層2
conv2 = tf.layers.conv2d(inputs=pool1, filters=64, kernel_size=[5,5], strides=1, padding='same', activation=tf.nn.relu )#形狀[14,14,64]
第四層池化層2
pool2 = tf.layers.max_pooling2d( inputs=conv2, pool_size=[2,2], strides=2 )#形狀[7,7,64]
平坦化
flat = tf.reshape(pool2,[-1,7*7*64])
使用flat.shape 輸出的形狀為(?, 3136)
1024個神經(jīng)元的全連接層
dense = tf.layers.dense(inputs=flat,units=1024,activation=tf.nn.relu)
tf.nn.relu 是一種激活函數(shù),目前絕大多數(shù)神經(jīng)網(wǎng)絡(luò)使用的激活函數(shù)是relu
Droupout 防止過擬合
dropout = tf.layers.dropout(inputs=dense,rate=0.5)
就是為了避免訓(xùn)練數(shù)據(jù)量過大,造成過于模型過于符合數(shù)據(jù),泛化能力大大減弱。
10個神經(jīng)元的全連接層
logits = tf.layers.dense(inputs=dropout,units=10,name="logit_1")
計算誤差,使用adam優(yōu)化器優(yōu)化誤差
#計算誤差,使用交叉熵(交叉熵用來衡量真實值和預(yù)測值的相似性) loss = tf.losses.softmax_cross_entropy(onehot_labels=output_y,logits=logits) #學(xué)習(xí)率0.001 最小化loss值,adam優(yōu)化器 train_op = tf.train.AdamOptimizer(learning_rate=0.001).minimize(loss)
計算精度值
accurary = tf.metrics.accuracy( labels=tf.argmax(output_y,axis=1), predictions=tf.argmax(logits,axis=1),)[1]
創(chuàng)建會話,初始化變量
sess = tf.compat.v1.Session()#創(chuàng)建一個會話 #初始化全局變量和局部變量 init = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) sess.run(init)
基本上到這里,這個程序就完成了,不過你也可以在此基礎(chǔ)上加上一些數(shù)據(jù)的輸出,使其更容易顯示整個訓(xùn)練的過程。
比如我加上了這一段
for i in range(1000):
#獲取以batch_size為大小的一個元組,包含一組圖片和標簽
batch = mnist.train.next_batch(50)
train_loss,train_op_,logits_output = sess.run([loss,train_op,logits],{input_x:batch[0],output_y:batch[1]})
if i % 100 == 0:
test_accuracy = sess.run(accurary,{input_x:test_x,output_y:test_y})
print(("step=%d,Train loss=%.4f,[Test accuracy=%.2f]") \
% (i, train_loss, test_accuracy))
輸出為:

完整的代碼數(shù)據(jù)文件我整理到了GitHub 下載地址 大家如果覺得可以的話,可以給個⭐
下面就回答一些我在學(xué)習(xí)過程中的遇到的問題:
【問】如何開始學(xué)習(xí)tensorflow,小白如何入門?
【答】 我的建議是先找到自己感興趣的點,從這個點出發(fā),通過實踐將自己不明白的方法原理通過看官網(wǎng),看博客,查百度,一一解決。文章開頭的那個視頻,我認為作為入門還不錯,最好再有一本tensorflow相關(guān)書籍結(jié)合著來。
【問】 CNN卷積神經(jīng)網(wǎng)絡(luò)的流程是什么,其中的轉(zhuǎn)化是什么樣的?
【答】主要涉及的知識就是數(shù)組之間的計算,具體關(guān)于我對卷積神經(jīng)網(wǎng)絡(luò)的理解,可以參考這篇博客 最易懂-CNN卷積神經(jīng)網(wǎng)絡(luò)運行原理和流程
【問】訓(xùn)練好的模型如何保存或者直接拿來使用呢?
【答】具體看我的另一篇博客 模型的保存和使用 也是通過這個例子,教你如何保存模型和使用模型
【問】為什么中間有出現(xiàn)兩次卷積層,兩次池化層?
【答】這個不是必須的,有的比較復(fù)雜的模型需要很多層,每一層都是對上一層特征的提取,只是這個就是比較基本的模型,都是使用兩次。初次咱們學(xué)習(xí)的話,就使用兩次就夠了,后面學(xué)習(xí)的知識多了,就可以自己根據(jù)實際情況加了。
【問】為什么全連接層有兩個,里面的神經(jīng)元數(shù)是固定的嗎?
【答】有幾個全連接層不是固定的,你就可以理解,這個全連接層就是做最后的收尾工作的,就是將前面幾個層所提取到的信息,最后進行匯總 并顯示,所以,最后一個全連接層的神經(jīng)元必須是10,由于本次使用的ont-hot (獨熱碼)的形式來表示圖片的label,所以最后一個輸出的神經(jīng)元個數(shù)必須是10.至于前面的,大家可以嘗試多使用幾個嘗試一下。
【問】one_hot獨熱碼在咱們這個程序中是怎么使用的?
【答】其實我也是頭一次聽說這個編碼(我是小白),舉個例子吧。
0:1000000000
1:0100000000
2:0010000000
就是這種
到此這篇關(guān)于tensorflow基于CNN實戰(zhàn)mnist手寫識別(小白必看)的文章就介紹到這了,更多相關(guān)tensorflow mnist手寫識別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python實現(xiàn)查詢某個目錄下修改時間最新的文件示例
這篇文章主要介紹了Python實現(xiàn)查詢某個目錄下修改時間最新的文件,涉及Python使用os與shutil模塊針對文件的遍歷、屬性獲取、讀寫等相關(guān)操作技巧,需要的朋友可以參考下2018-08-08
使用python畫出邏輯斯蒂映射(logistic map)中的分叉圖案例
這篇文章主要介紹了使用python畫出邏輯斯蒂映射(logistic map)中的分叉圖案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12
Python中函數(shù)的創(chuàng)建及調(diào)用
這篇文章主要介紹了Python中函數(shù)的創(chuàng)建及調(diào)用,創(chuàng)建函數(shù)也稱為定義一個函數(shù),可以理解為創(chuàng)建一個具有某種用途的工具。調(diào)用函數(shù)也就是執(zhí)行函數(shù)。如果把創(chuàng)建的函數(shù)理解為創(chuàng)建一個具體有某種用途的工具,那么調(diào)用函數(shù)就相當于使用該工具2022-06-06
Django實現(xiàn)在線無水印抖音視頻下載(附源碼及地址)
該項目功能簡單,完全復(fù)制SaveTweetVedio的項目。用戶觀看抖音視頻時選擇復(fù)制視頻鏈接,輸入到下載輸入欄,即可下載無水印視頻,還可掃描二維碼手機上預(yù)覽。親測成功。2021-05-05
Python?Pandas?中的數(shù)據(jù)結(jié)構(gòu)詳解
這篇文章主要介紹了Python?Pandas?中的數(shù)據(jù)結(jié)構(gòu)詳解,Pandas有三種數(shù)據(jù)結(jié)構(gòu)Series、DataFrame和Panel,文章圍繞主題展開更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-06-06

