python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn)
一、TensorFlow簡(jiǎn)介
TensorFlow是由谷歌開(kāi)發(fā)的一套機(jī)器學(xué)習(xí)的工具,使用方法很簡(jiǎn)單,只需要輸入訓(xùn)練數(shù)據(jù)位置,設(shè)定參數(shù)和優(yōu)化方法等,TensorFlow就可以將優(yōu)化結(jié)果顯示出來(lái),節(jié)省了很大量的編程時(shí)間,TensorFlow的功能很多很強(qiáng)大,這邊挑選了一個(gè)比較簡(jiǎn)單實(shí)現(xiàn)的方法,就是利用TensorFlow的邏輯回歸算法對(duì)數(shù)據(jù)庫(kù)中的手寫(xiě)數(shù)字做識(shí)別,讓機(jī)器找出規(guī)律,然后再導(dǎo)入新的數(shù)字讓機(jī)器識(shí)別。
二、流程介紹

上圖是TensorFlow的流程,可以看到一開(kāi)始要先將參數(shù)初始化,然后導(dǎo)入訓(xùn)練數(shù)據(jù),計(jì)算偏差,然后修正參數(shù),再導(dǎo)入新的訓(xùn)練數(shù)據(jù),不斷重復(fù),當(dāng)數(shù)據(jù)量越大,理論上參數(shù)就會(huì)越準(zhǔn)確,不過(guò)也要注意不可訓(xùn)練過(guò)度。
三、導(dǎo)入數(shù)據(jù)
數(shù)據(jù)可進(jìn)入MNIST數(shù)據(jù)庫(kù) (Mixed National Institute of Standards and Technology database),這是一個(gè)開(kāi)放的數(shù)據(jù)庫(kù),里面有許多免費(fèi)的訓(xùn)練數(shù)據(jù)可以提供下載,這次我們要下載的是手寫(xiě)的阿拉伯?dāng)?shù)字,為什么要阿拉伯?dāng)?shù)字呢?1、因?yàn)榻Y(jié)果少,只有十個(gè),比較好訓(xùn)練 2、圖片的容量小,不占空間,下面是部分的訓(xùn)練數(shù)據(jù)案例

TensorFlow可以直接下載MNIST上的訓(xùn)練數(shù)據(jù),并將它導(dǎo)入使用,下面為導(dǎo)入數(shù)據(jù)的代碼
from tensorflow.examples.tutorials.mnist import input_data
MNIST = input_data.read_data_sets("/data/mnist", one_hot=True)
四、設(shè)定參數(shù)
接下來(lái)就是在TensorFlow里設(shè)定邏輯回歸的參數(shù),我們知道回歸的公式為Y=w*X+b,X為輸入,Y為計(jì)算結(jié)果,w為權(quán)重參數(shù),b為修正參數(shù),其中w和b就是我們要訓(xùn)練修正的參數(shù),但訓(xùn)練里要怎么判斷計(jì)算結(jié)果好壞呢?就是要判斷計(jì)算出來(lái)的Y和實(shí)際的Y損失值(loss)是多少,并盡量減少loss,這邊我們使用softmax函數(shù)來(lái)計(jì)算,softmax函數(shù)在計(jì)算多類別分類上的表現(xiàn)比較好,有興趣可以百度一下,這邊就不展開(kāi)說(shuō)明了,下面為參數(shù)設(shè)定
X = tf.placeholder(tf.float32, [batch_size, 784], name="image") Y = tf.placeholder(tf.float32, [batch_size, 10], name="label")
X為輸入的圖片,圖片大小為784K,Y為實(shí)際結(jié)果,總共有十個(gè)結(jié)果(數(shù)字0-9)
w = tf.Variable(tf.random_normal(shape=[784, 10], stddev=0.01), name="weights") b = tf.Variable(tf.zeros([1, 10]), name="bias")
w初始值為一個(gè)隨機(jī)的變數(shù),標(biāo)準(zhǔn)差為0.01,b初始值為0。
logits = tf.matmul(X, w) + b entropy = tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y) loss = tf.reduce_sum(entropy)
TensorFlow里面已經(jīng)有softmax的函數(shù),只要把他叫出來(lái)就可以使用。
optimizer =
tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(loss)
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
n_batches = int(MNIST.train.num_examples/batch_size)
for i in range(n_epochs): # train the model n_epochs times
for _ in range(n_batches):
X_batch, Y_batch = MNIST.train.next_batch(batch_size)
sess.run([optimizer, loss], feed_dict={X: X_batch, Y:Y_batch})
接著就是設(shè)定優(yōu)化方式,這邊是使用梯度降下發(fā),然后將參數(shù)初始化,接著就運(yùn)行了,這邊要提一下,我們的訓(xùn)練方式是每次從訓(xùn)練數(shù)據(jù)里面抓取一個(gè)batch的數(shù)據(jù),然后進(jìn)行計(jì)算,這樣可以預(yù)防過(guò)度訓(xùn)練,也比較可以進(jìn)行事后的驗(yàn)證,運(yùn)行完后再用下面的代碼進(jìn)行驗(yàn)證
n_batches = int(MNIST.test.num_examples/batch_size)
total_correct_preds = 0
for i in range(n_batches):
X_batch, Y_batch = MNIST.test.next_batch(batch_size)
_, loss_batch, logits_batch = sess.run([optimizer, loss, logits],
feed_dict={X: X_batch, Y:Y_batch})
preds = tf.nn.softmax(logits_batch)
correct_preds = tf.equal(tf.argmax(preds, 1), tf.argmax(Y_batch, 1))
accuracy = tf.reduce_sum(tf.cast(correct_preds, tf.float32))
total_correct_preds += sess.run(accuracy)
print ("Accuracy {0}".format(total_correct_preds/MNIST.test.num_examples))
最后shell跑出來(lái)的結(jié)果是0.916,雖然看上去還算是不錯(cuò)的結(jié)果,但其實(shí)準(zhǔn)確率是很低的,因?yàn)樗?yàn)證的方式是判斷一個(gè)圖片是否為某個(gè)數(shù)字(單輸出),所以假如機(jī)器隨便猜也會(huì)有0.82左右的命中幾率(0.9*0.9+0.1*0.1),想要更準(zhǔn)確的話目前想到有兩個(gè)方向,一個(gè)是提高訓(xùn)練量和增加神經(jīng)網(wǎng)絡(luò)的層數(shù)。
到此這篇關(guān)于python用TensorFlow做圖像識(shí)別的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)TensorFlow 圖像識(shí)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能
這篇文章主要介紹了使用wxpy實(shí)現(xiàn)自動(dòng)發(fā)送微信消息功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02
python處理multipart/form-data的請(qǐng)求方法
今天小編就為大家分享一篇python處理multipart/form-data的請(qǐng)求方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12
Python高級(jí)排序sort()函數(shù)使用技巧實(shí)例探索
本文詳細(xì)介紹sort()函數(shù)的使用,包括基本排序、自定義排序、逆序排序等多種情況,并提供大量示例代碼,以幫助你充分理解和掌握這一函數(shù)的用法,探索更多sort()排序函數(shù)的作用2024-01-01
python切片中內(nèi)存的注意事項(xiàng)總結(jié)
在本篇文章里小編給大家整理的是一篇關(guān)于python切片中內(nèi)存的注意事項(xiàng)總結(jié)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。2021-08-08
python之隨機(jī)數(shù)函數(shù)的實(shí)現(xiàn)示例
這篇文章主要介紹了python之隨機(jī)數(shù)函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12

