溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

python怎么用TensorFlow做圖像識別

發(fā)布時間:2020-08-01 11:57:40 來源:億速云 閱讀:180 作者:小豬 欄目:開發(fā)技術(shù)

小編這次要給大家分享的是python怎么用TensorFlow做圖像識別,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

一、TensorFlow簡介

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

二、流程介紹

python怎么用TensorFlow做圖像識別

上圖是TensorFlow的流程,可以看到一開始要先將參數(shù)初始化,然后導(dǎo)入訓(xùn)練數(shù)據(jù),計算偏差,然后修正參數(shù),再導(dǎo)入新的訓(xùn)練數(shù)據(jù),不斷重復(fù),當(dāng)數(shù)據(jù)量越大,理論上參數(shù)就會越準(zhǔn)確,不過也要注意不可訓(xùn)練過度。

三、導(dǎo)入數(shù)據(jù)

數(shù)據(jù)可進入MNIST數(shù)據(jù)庫 (Mixed National Institute of Standards and Technology database),這是一個開放的數(shù)據(jù)庫,里面有許多免費的訓(xùn)練數(shù)據(jù)可以提供下載,這次我們要下載的是手寫的阿拉伯?dāng)?shù)字,為什么要阿拉伯?dāng)?shù)字呢?1、因為結(jié)果少,只有十個,比較好訓(xùn)練 2、圖片的容量小,不占空間,下面是部分的訓(xùn)練數(shù)據(jù)案例

python怎么用TensorFlow做圖像識別

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ù)

接下來就是在TensorFlow里設(shè)定邏輯回歸的參數(shù),我們知道回歸的公式為Y=w*X+b,X為輸入,Y為計算結(jié)果,w為權(quán)重參數(shù),b為修正參數(shù),其中w和b就是我們要訓(xùn)練修正的參數(shù),但訓(xùn)練里要怎么判斷計算結(jié)果好壞呢?就是要判斷計算出來的Y和實際的Y損失值(loss)是多少,并盡量減少loss,這邊我們使用softmax函數(shù)來計算,softmax函數(shù)在計算多類別分類上的表現(xiàn)比較好,有興趣可以百度一下,這邊就不展開說明了,下面為參數(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為實際結(jié)果,總共有十個結(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初始值為一個隨機的變數(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ù),只要把他叫出來就可以使用。

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ù)初始化,接著就運行了,這邊要提一下,我們的訓(xùn)練方式是每次從訓(xùn)練數(shù)據(jù)里面抓取一個batch的數(shù)據(jù),然后進行計算,這樣可以預(yù)防過度訓(xù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跑出來的結(jié)果是0.916,雖然看上去還算是不錯的結(jié)果,但其實準(zhǔn)確率是很低的,因為他驗證的方式是判斷一個圖片是否為某個數(shù)字(單輸出),所以假如機器隨便猜也會有0.82左右的命中幾率(0.9*0.9+0.1*0.1),想要更準(zhǔn)確的話目前想到有兩個方向,一個是提高訓(xùn)練量和增加神經(jīng)網(wǎng)絡(luò)的層數(shù)。

看完這篇關(guān)于python怎么用TensorFlow做圖像識別的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI