您好,登錄后才能下訂單哦!
小編這次要給大家分享的是python怎么用TensorFlow做圖像識別,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
一、TensorFlow簡介
TensorFlow是由谷歌開發的一套機器學習的工具,使用方法很簡單,只需要輸入訓練數據位置,設定參數和優化方法等,TensorFlow就可以將優化結果顯示出來,節省了很大量的編程時間,TensorFlow的功能很多很強大,這邊挑選了一個比較簡單實現的方法,就是利用TensorFlow的邏輯回歸算法對數據庫中的手寫數字做識別,讓機器找出規律,然后再導入新的數字讓機器識別。
二、流程介紹
上圖是TensorFlow的流程,可以看到一開始要先將參數初始化,然后導入訓練數據,計算偏差,然后修正參數,再導入新的訓練數據,不斷重復,當數據量越大,理論上參數就會越準確,不過也要注意不可訓練過度。
三、導入數據
數據可進入MNIST數據庫 (Mixed National Institute of Standards and Technology database),這是一個開放的數據庫,里面有許多免費的訓練數據可以提供下載,這次我們要下載的是手寫的阿拉伯數字,為什么要阿拉伯數字呢?1、因為結果少,只有十個,比較好訓練 2、圖片的容量小,不占空間,下面是部分的訓練數據案例
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, [batch_size, 10], name="label")
X為輸入的圖片,圖片大小為784K,Y為實際結果,總共有十個結果(數字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初始值為一個隨機的變數,標準差為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], 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跑出來的結果是0.916,雖然看上去還算是不錯的結果,但其實準確率是很低的,因為他驗證的方式是判斷一個圖片是否為某個數字(單輸出),所以假如機器隨便猜也會有0.82左右的命中幾率(0.9*0.9+0.1*0.1),想要更準確的話目前想到有兩個方向,一個是提高訓練量和增加神經網絡的層數。
看完這篇關于python怎么用TensorFlow做圖像識別的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。