使用TensorFlow創建自己的手寫識別引擎

這篇文章介紹了使用TensorFlow創建自己的手寫識別引擎的簡單方法。在這裡作為示例示出的項目。

完整的源代碼可以登錄GitHub https://github.com/niektemme/tensorflow-mnist-predict/

介紹

我正在進行一篇機器學習的文章的寫作。現在寫這個話題就難以忽視TensorFlow,一個由谷歌開源的深度學習引擎。深度學習是機器學習的一個分支,它使用人腦的概念中的神經網絡的形式去解決各種問題,例如圖象和語音識別(圖像1)。這是一個很難用“傳統”計算機解決的問題:用一台計算機作為一個大的計算器。

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

–Image 1: Deep Neural Network (source: Google)

TensorFlow是由谷歌創建的這個事實給了它很大的牽引力,尤其在我使用的網站技術中。為了了解更多關於TensorFlow的內容,我參加了阿姆斯特丹當地的“咖啡與編碼”聚會,他們主持了“親身參與TensorFlow”的活動。

在聚會中我們嘗試從TensorFlow網站的教程來開展體驗。該教程本身是明確的,寫得很好。在我看來,似乎這些例子主要集中在構建和驗證模型,但使用創建的模型並不是一個優先事項。一個例外是“圖像識別”的例子。但是,更複雜的例子之一是,如果你不是一個機器學習專家那就會更難去使用。

通過搜索互聯網,可能甚至要從創建TensorFlow的同一公司中使用某種AI,我發現更多的人試圖尋找如何將所創建的模型應用到解決實際問題中去。

所以,我把目標設定在如何通過使用培訓模型,在手寫識別上使用TensorFlow MNIST教程更加便捷。

目標

該項目的目標是讓我的電腦通過使用MNIST數據集的訓練模型,來識別我自己手寫的數字之一。該MNIST數據集包含了大量的手寫數字和相應的標籤(正確的數字)。

這就給出以下任務:

l用MNIST數據集訓練一個模型。

l保存步驟1中的模型到文件。

l裝載通過不同的python腳本保存的模型。

l準備和裝載本人親筆手寫體的圖像。

l正確地預測我所寫的數字。

1.MNIST數據集訓練一個模型

在前兩個教程的生成一個tensorflow.org網站中,已經對如何訓練一個模型做了清楚的解釋。我沒有修改這些例子中的任何東西。

正如預期的那樣,第二個(專家)教程中創建的模型在正確預測我的手寫數字上取得了較好的效果。

2.保存模型

保存模型實際上是很容易的。在TensorFlow保存和恢復變量的文檔中已經做了詳細的描述。

它歸結為為在TensorFlow教程中解釋的python腳本加入兩行代碼。

初始化TensorFlow(TF)變量之前添加:

並在腳本的底部列出以下行:

該文檔對如何做到這一點給出了很好的解釋。我創建了兩個Python腳本,已經包含了這些行去創建一個model.ckpt文件。

– create_model_1.py使用初學者MNIST 教程

– create_model_2.py使用專家MNIST教程

3.用不同的python腳本加載保存的模型

加載模型回到一個不同的Python腳本也在TensorFlow文檔中的同一頁上做了明確的描述。

首先,你必須初始化你常用於創建模型文件的TensorFlow變量。然後你再使用TensorFlow的修復功能進行恢復。

4.準備並加載本人親筆書寫的圖像

我手寫數字的圖像必須採用與一般圖像進入MNIST數據庫相同的方式進行格式化。如果圖像不匹配,它會試圖預測別的東西。

該MNIST網站提供以下信息:

– 圖像標準化,可安裝在20×20像素的框內,同時保留其長寬比。

– 圖片都集中在一個28×28的圖像中。

– 像素以列為主進行排序。像素值0到255,0表示背景(白色),255表示前景(黑色)。

對於圖像處理我用Python圖像庫(PIL)。簡易的安裝方式:

或者看看PILLOW文檔的其他安裝選項。

獲取圖像的像素值我執行以下步驟。imageprepare()函數的代碼片段顯示了所有步驟的代碼。

(1)載入我的手寫數字的圖像。

(2)將圖像轉換為黑白(模式“L”)

(3)確定原始圖像的尺寸是最大的

(4)調整圖像的大小,使得最大尺寸(醚的高度及寬度)為20像素,並且以相同的比例最小化尺寸刻度。

(5)銳化圖像。這會極大地強化結果。

(6)把圖像粘貼在28×28像素的白色畫布上。在最大的尺寸上從頂部或側面居中圖像4個像素。最大尺寸始終是20個像素和4 + 20 + 4 = 28,最小尺寸被定位在28和縮放的圖像的新的大小之間差的一半。

(7)獲取新的圖像(畫布+居中的圖像)的像素值。

(8)歸一化像素值到0和1之間的一個值(這也在TensorFlow MNIST教程中完成)。其中0是白色的,1是純黑色。從步驟7得到的像素值是與之相反的,其中255是白色的,0黑色,所以數值必須反轉。下述公式包括反轉和規格化(255-X)* 1.0 / 255.0

我作了一下弊,因為我手動裁剪圖像。我還沒有適應自動裁剪功能。您也可以只使用一個基於矢量的工具來創建手寫圖像。

argv變量通過文件路徑傳遞給imageprepare()函數。

5.預測手寫數字

使用預測功能預測數字現在是比較簡單的。就像Pannus在TensorFlow Github討論會上就97號問題的預測。

繼恢復變量的文件,加載模型並利用該模型準備圖像的像素值來預測整數代碼執行下列操作之一:

新手教程MNIST(教程1):

專家MNIST教程(教程2):

教程1和2之間的差別在於,在專家教程的模型預測中(模型2)採用變量y_conv作為預測標籤,而不是模型1中的y來標記,使用模型2的prediction.eval函數需要另一種說法keep_prob:1.0

下方代碼段顯示了完整的predictint()函數來預測正確的整數,和將其結合在一起的主要功能(專家模式)。所述predictint()函數是從imageprepare()函數所得的像素值作為輸入。

這些完整的腳本也可以被使用。

– predict_1.py使用模型形成第一MNIST教程

– predict_2.py使用模型形成第二MNIST專家教程

結果

這裡有一些我使用來自專家教程神經網絡(模型2)測試的數字。其結果是相當不錯的。有趣的是,它會犯人類會有的錯誤(可能除了誤以為7是3)。我想它還需要一些微調。

正確的

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

正確預測為1

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

正確預測為3

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

正確預測為4

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

正確預測為6

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

正確預測為7

不正確的

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

預測為0

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

預測為2

使用TensorFlow創建自己的手寫識別引擎 |emailtry.com

預測為3

 

原文鏈接:

Using TensorFlow to create your own handwriting recognition engine

发表评论