1. 程式人生 > 程式設計 >python用TensorFlow做影象識別的實現

python用TensorFlow做影象識別的實現

一、TensorFlow簡介

TensorFlow是由谷歌開發的一套機器學習的工具,使用方法很簡單,只需要輸入訓練資料位置,設定引數和優化方法等,TensorFlow就可以將優化結果顯示出來,節省了很大量的程式設計時間,TensorFlow的功能很多很強大,這邊挑選了一個比較簡單實現的方法,就是利用TensorFlow的邏輯迴歸演算法對資料庫中的手寫數字做識別,讓機器找出規律,然後再匯入新的數字讓機器識別。

二、流程介紹

python用TensorFlow做影象識別的實現

上圖是TensorFlow的流程,可以看到一開始要先將引數初始化,然後匯入訓練資料,計算偏差,然後修正引數,再匯入新的訓練資料,不斷重複,當資料量越大,理論上引數就會越準確,不過也要注意不可訓練過度。

三、匯入資料

資料可進入MNIST資料庫 (Mixed National Institute of Standards and Technology database),這是一個開放的資料庫,裡面有許多免費的訓練資料可以提供下載,這次我們要下載的是手寫的阿拉伯數字,為什麼要阿拉伯數字呢?1、因為結果少,只有十個,比較好訓練 2、圖片的容量小,不佔空間,下面是部分的訓練資料案例

python用TensorFlow做影象識別的實現

TensorFlow可以直接下載MNIST上的訓練資料,並將它匯入使用,下面為匯入資料的程式碼

from tensorflow.examples.tutorials.mnist import input_data
MNIST = input_data.read_data_sets("/data/mnist",one_hot=True)

四、設定引數

接下來就是在TensorFlow裡設定邏輯迴歸的引數,我們知道迴歸的公式為Y=w*X+b,X為輸入,Y為計算結果,w為權重引數,b為修正引數,其中w和b就是我們要訓練修正的引數,但訓練裡要怎麼判斷計算結果好壞呢?就是要判斷計算出來的Y和實際的Y損失值(loss)是多少,並儘量減少loss,這邊我們使用softmax函式來計算,softmax函式在計算多類別分類上的表現比較好,有興趣可以百度一下,這邊就不展開說明了,下面為引數設定

X = tf.placeholder(tf.float32,[batch_size,784],name="image")
Y = tf.placeholder(tf.float32,10],name="label")

X為輸入的圖片,圖片大小為784K,Y為實際結果,總共有十個結果(數字0-9)

w = tf.Variable(tf.random_normal(shape=[784,stddev=0.01),name="weights")
b = tf.Variable(tf.zeros([1,10]),name="bias")

w初始值為一個隨機的變數,標準差為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裡面已經有softmax的函式,只要把他叫出來就可以使用。

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

接著就是設定優化方式,這邊是使用梯度降下發,然後將引數初始化,接著就運行了,這邊要提一下,我們的訓練方式是每次從訓練資料裡面抓取一個batch的資料,然後進行計算,這樣可以預防過度訓練,也比較可以進行事後的驗證,執行完後再用下面的程式碼進行驗證

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],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跑出來的結果是0.916,雖然看上去還算是不錯的結果,但其實準確率是很低的,因為他驗證的方式是判斷一個圖片是否為某個數字(單輸出),所以假如機器隨便猜也會有0.82左右的命中機率(0.9*0.9+0.1*0.1),想要更準確的話目前想到有兩個方向,一個是提高訓練量和增加神經網路的層數。

到此這篇關於python用TensorFlow做影象識別的實現的文章就介紹到這了,更多相關TensorFlow 影象識別內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!