解析Tensorflow之MNIST的使用
要說2017年什么技術(shù)最火爆,無疑是google領(lǐng)銜的深度學(xué)習(xí)開源框架Tensorflow。本文簡述一下深度學(xué)習(xí)的入門例子MNIST。
深度學(xué)習(xí)簡單介紹
首先要簡單區(qū)別幾個概念:人工智能,機器學(xué)習(xí),深度學(xué)習(xí),神經(jīng)網(wǎng)絡(luò)。這幾個詞應(yīng)該是出現(xiàn)的最為頻繁的,但是他們有什么區(qū)別呢?
人工智能:人類通過直覺可以解決的問題,如:自然語言理解,圖像識別,語音識別等,計算機很難解決,而人工智能就是要解決這類問題。
機器學(xué)習(xí):如果一個任務(wù)可以在任務(wù)T上,隨著經(jīng)驗E的增加,效果P也隨之增加,那么就認(rèn)為這個程序可以從經(jīng)驗中學(xué)習(xí)。
深度學(xué)習(xí):其核心就是自動將簡單的特征組合成更加復(fù)雜的特征,并用這些特征解決問題。
神經(jīng)網(wǎng)絡(luò):最初是一個生物學(xué)的概念,一般是指大腦神經(jīng)元,觸點,細(xì)胞等組成的網(wǎng)絡(luò),用于產(chǎn)生意識,幫助生物思考和行動,后來人工智能受神經(jīng)網(wǎng)絡(luò)的啟發(fā),發(fā)展出了人工神經(jīng)網(wǎng)絡(luò)。
來一張圖就比較清楚了,如下圖:
MNIST解析
MNIST是深度學(xué)習(xí)的經(jīng)典入門demo,他是由6萬張訓(xùn)練圖片和1萬張測試圖片構(gòu)成的,每張圖片都是28*28大小(如下圖),而且都是黑白色構(gòu)成(這里的黑色是一個0-1的浮點數(shù),黑色越深表示數(shù)值越靠近1),這些圖片是采集的不同的人手寫從0到9的數(shù)字。TensorFlow將這個數(shù)據(jù)集和相關(guān)操作封裝到了庫中,下面我們來一步步解讀深度學(xué)習(xí)MNIST的過程。
上圖就是4張MNIST圖片。這些圖片并不是傳統(tǒng)意義上.jpg或者jpg格式的圖片,因.jpg或者jpg的圖片格式,會帶有很多干擾信息(如:數(shù)據(jù)塊,圖片頭,圖片尾,長度等等),這些圖片會被處理成很簡易的二維數(shù)組,如圖:
可以看到,矩陣中有值的地方構(gòu)成的圖形,跟左邊的圖形很相似。之所以這樣做,是為了讓模型更簡單清晰。特征更明顯。
我們先看模型的代碼以及如何訓(xùn)練模型:
mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) # x是特征值 x = tf.placeholder(tf.float32, [None, 784]) # w表示每一個特征值(像素點)會影響結(jié)果的權(quán)重 W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.matmul(x, W) + b # 是圖片實際對應(yīng)的值 y_ = tf.placeholder(tf.float32, [None, 10])<br> cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) sess = tf.InteractiveSession() tf.global_variables_initializer().run() # mnist.train 訓(xùn)練數(shù)據(jù) for _ in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) #取得y得最大概率對應(yīng)的數(shù)組索引來和y_的數(shù)組索引對比,如果索引相同,則表示預(yù)測正確 correct_prediction = tf.equal(tf.arg_max(y, 1), tf.arg_max(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
首先第一行是獲取MNIST的數(shù)據(jù)集,我們逐一解釋一下:
x(圖片的特征值):這里使用了一個28*28=784列的數(shù)據(jù)來表示一個圖片的構(gòu)成,也就是說,每一個點都是這個圖片的一個特征,這個其實比較好理解,因為每一個點都會對圖片的樣子和表達的含義有影響,只是影響的大小不同而已。至于為什么要將28*28的矩陣攤平成為一個1行784列的一維數(shù)組,我猜測可能是因為這樣做會更加簡單直觀。
W(特征值對應(yīng)的權(quán)重):這個值很重要,因為我們深度學(xué)習(xí)的過程,就是發(fā)現(xiàn)特征,經(jīng)過一系列訓(xùn)練,從而得出每一個特征對結(jié)果影響的權(quán)重,我們訓(xùn)練,就是為了得到這個最佳權(quán)重值。
b(偏置量):是為了去線性話(我不是太清楚為什么需要這個值)
y(預(yù)測的結(jié)果):單個樣本被預(yù)測出來是哪個數(shù)字的概率,比如:有可能結(jié)果是[ 1.07476616 -4.54194021 2.98073649 -7.42985344 3.29253793 1.967506178.59438515 -6.65950203 1.68721473 -0.9658531 ],則分別表示是0,1,2,3,4,5,6,7,8,9的概率,然后會取一個最大值來作為本次預(yù)測的結(jié)果,對于這個數(shù)組來說,結(jié)果是6(8.59438515)
y_(真實結(jié)果):來自MNIST的訓(xùn)練集,每一個圖片所對應(yīng)的真實值,如果是6,則表示為:[0 0 0 0 0 1 0 0 0]
再下面兩行代碼是損失函數(shù)(交叉熵)和梯度下降算法,通過不斷的調(diào)整權(quán)重和偏置量的值,來逐步減小根據(jù)計算的預(yù)測結(jié)果和提供的真實結(jié)果之間的差異,以達到訓(xùn)練模型的目的。
算法確定以后便可以開始訓(xùn)練模型了,如下:
for _ in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys})
mnist.train.next_batch(100)是從訓(xùn)練集里一次提取100張圖片數(shù)據(jù)來訓(xùn)練,然后循環(huán)1000次,以達到訓(xùn)練的目的。
之后的兩行代碼都有注釋,不再累述。我們看最后一行代碼:
print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
mnist.test.images和mnist.test.labels是測試集,用來測試。accuracy是預(yù)測準(zhǔn)確率。
當(dāng)代碼運行起來以后,我們發(fā)現(xiàn),準(zhǔn)確率大概在92%左右浮動。這個時候我們可能想看看到底是什么樣的圖片讓預(yù)測不準(zhǔn)。則添加如下代碼:
for i in range(0, len(mnist.test.images)): result = sess.run(correct_prediction, feed_dict={x: np.array([mnist.test.images[i]]), y_: np.array([mnist.test.labels[i]])}) if not result: print('預(yù)測的值是:',sess.run(y, feed_dict={x: np.array([mnist.test.images[i]]), y_: np.array([mnist.test.labels[i]])})) print('實際的值是:',sess.run(y_,feed_dict={x: np.array([mnist.test.images[i]]), y_: np.array([mnist.test.labels[i]])})) one_pic_arr = np.reshape(mnist.test.images[i], (28, 28)) pic_matrix = np.matrix(one_pic_arr, dtype="float") plt.imshow(pic_matrix) pylab.show() break print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels}))
for循環(huán)內(nèi)指明一旦result為false,就表示出現(xiàn)了預(yù)測值和實際值不符合的圖片,然后我們把值和圖片分別打印出來看看:
預(yù)測的值是: [[ 1.82234347 -4.87242508 2.63052988 -6.56350136 2.73666072 2.30682945 8.59051228 -7.20512581 1.45552373 -0.90134078]]
對應(yīng)的是數(shù)字6。
實際的值是: [[ 0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]]
對應(yīng)的是數(shù)字5。
我們再來看看圖片是什么樣子的:
的確像5又像6。
總體來說,只有92%的準(zhǔn)確率,還是比較低的,后續(xù)會解析一下比較適合識別圖片的卷積神經(jīng)網(wǎng)絡(luò),準(zhǔn)確率可以達到99%以上。
一些體會與感想
我本人是一名iOS開發(fā),也是迎著人工智能的浪潮開始一路學(xué)習(xí),我覺得人工智能終將改變我們的生活,也會成為未來的一個熱門學(xué)科。這一個多月的自學(xué)下來,我覺得最為困難的是克服自己的畏難情緒,因為我完全沒有AI方面的任何經(jīng)驗,而且工作年限太久,線性代數(shù),概率論等知識早已還給老師,所以在開始的時候,總是反反復(fù)復(fù)不停猶豫,糾結(jié)到底要不要把時間花費在研究深度學(xué)習(xí)上面。但是后來一想,假如我不學(xué)AI的東西,若干年后,AI發(fā)展越發(fā)成熟,到時候想學(xué)也會難以跟上步伐,而且,讓電腦學(xué)會思考這本身就是一件很讓人興奮的事情,既然想學(xué),有什么理由不去學(xué)呢?與大家共勉。
參考文章:
https://zhuanlan.zhihu.com/p/25482889
https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap1/c1s0.html
到此這篇關(guān)于解析Tensorflow之MNIST的使用的文章就介紹到這了,更多相關(guān)Tensorflow MNIST內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python多進程及通信實現(xiàn)異步任務(wù)的方法
這篇文章主要介紹了python多進程及通信實現(xiàn)異步任務(wù)需求,本人也是很少接觸多進程的場景,對于python多進程的使用也是比較陌生的。在接觸了一些多進程的業(yè)務(wù)場景下,對python多進程的使用進行了學(xué)習(xí),覺得很有必要進行一個梳理總結(jié),感興趣的朋友一起看看吧2022-05-05Python使用pypinyin實現(xiàn)中文拼音轉(zhuǎn)換
pypinyin是一個Python庫,用于將中文漢字轉(zhuǎn)換為拼音,這篇文章主要為大家詳細(xì)介紹了pypinyin的基本用法并探討其應(yīng)用場景,需要的可以參考下2024-02-02使用Pycharm為項目創(chuàng)建一個虛擬環(huán)境完整圖文教程
這篇文章主要給大家介紹了關(guān)于使用Pycharm為項目創(chuàng)建一個虛擬環(huán)境的相關(guān)資料,我們在使用pycharm做項目時,最好給每一個工程都創(chuàng)建一個虛擬環(huán)境,將對應(yīng)的安裝包放在該虛擬環(huán)境中,避免項目與項目之間產(chǎn)生關(guān)系或沖突,便于管理,需要的朋友可以參考下2023-09-09Django之富文本(獲取內(nèi)容,設(shè)置內(nèi)容方式)
這篇文章主要介紹了Django之富文本(獲取內(nèi)容,設(shè)置內(nèi)容方式),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05詳解如何在ChatGPT內(nèi)構(gòu)建一個Python解釋器
這篇文章主要為大家詳細(xì)介紹了如何在ChatGPT內(nèi)構(gòu)建一個Python解釋器,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,需要的可以參考一下2023-02-02