人工智能

10分鐘,用TensorFlow.js庫,訓練一個沒有感情的“剪刀石頭布”識別器

大數據文摘出品編譯:Luciana、小七、寧靜“剪刀石頭布”是我們小時候經常玩的游戲,日常生活中做一些糾結的決策,有時候也常常使用這種規則得出最后的選擇,我們人眼能很輕松地認知這些手勢,“石頭”呈握拳狀,“布”掌心攤開,“剪刀”食指和中指分叉,如何讓機器識別這些手勢呢?在沒有使用TensorFlow.js庫之前,如果讓我寫一個算法,要求可以根據手勢的圖像來確定它代表剪刀、石頭、布中的哪一個,這是計算機視覺領域(CV)典型的圖像分類任務,我可能需要經過謹慎思考,并花費很長的時間來完成算法編寫,其中包括數據圖像的采集、模型的訓練、參數的調整,最終結果可能得經過分類模型(如:VGG、ResNet、ShuffleNet等)的卷積層、全連接層,最終以概率的方式呈現,預期效果是達到了,在時間的花銷上有點大?,F在,給我10分鐘,還你一個訓練好的識別模型!在瀏覽器上基于TensorFlow.js可以很快完成這項需求。

攝像頭將通過快照功能將拍攝圖像轉換為64×64圖像并顯示辨別結果。

在線演示鏈接:
https://rps-tfjs.netlify.com/完整代碼地址:https://github.com/GantMan/rps_tfjs_demo基于TensorFlow.js實現的算法與正常的機器學習算法有什么不同?又在哪些方面節省了時間?下面教學時間正式開始。

利用好這個網站

首先安利一個網站,可以節省很多時間,減輕一部分工作量。這個網站可以在自己電腦上使用瀏覽器訪問,它的運行速度取決于你所使用的計算機性能,與此同時,由于它使用了TensorFlow.js庫,這使得所有繁重的工作都可以在瀏覽器中用JavaScript來實現。網站鏈接:https://rps-tfjs.netlify.com/

針對數據的操作

機器學習需要數據及用于訓練數據的模型架構, 經過一段時間的訓練后,模型可以智能識別出新的代表剪刀、石頭、布手勢的圖像,基于TensorFlow.js庫的方法也需要數據做訓練,有了網站這個“利器”,數據從哪來呢?

數據從哪兒來?

這里我們也需要一些代表剪刀、石頭、布手勢的圖像作為訓練數據,Laurence Moroney提供了大量的優秀數據,我們只需要選擇其中一部分數據,不需要所有數據,使用它我們可以訓練一個基本模型。

數據集鏈接地址:http://www.laurencemoroney.com/rock-paper-scissors-dataset/

破解瀏覽器加載圖像的難題

在正常的機器學習工作流程中,我們只需要訪問文件可以實現提供數據的流程,也可以使用簡單的glob模塊抓取文件夾,相比之下,如果在瀏覽器中加載一個10MB大小的手勢圖像就會很困難。幸好我們可以使用經典技巧將一組圖像傳輸到瀏覽器,那就是使用精靈表單(spritesheet):將一組圖像粘合成一個圖像,此時,圖像中每個像素都變成1像素高清圖像,我們將它們堆疊創建一個保存所有圖像的10MB大小的大圖像。

將2D圖像放大為1D高清圖像的視覺化效果Python源代碼保存在對應項目的spritemaker(精靈編輯器)文件夾中,因此,如果數據集不同而操作類似,則可以創建各自的精靈表單。此時所有內容都合并為一個圖像,我們可以將圖像切片進行訓練和驗證。在編寫完自己的精靈表單生成器并在“剪刀石頭布”數據集上運行,實現過程展示如下:   

可以看到生成結果十分符合預期,經過轉換后的采集結果如下:

圖像收縮為64*64大小每個,共有2520個圖象,即成像為4096*2520像素

點擊按鈕-獲取瀏覽器訓練樣本

圖像數據集的處理到此已經完成,按下網站上的按鈕,信息將填充到TFVIS即TensorFlow ,它基本上是一個小的幻燈片菜單,可以幫助我們顯示訓練信息。

歷時一秒鐘加載生成的大圖像并解析通過使用TensorFlow Visor,我們可以隨機展示來自數據集的42個手勢圖像,并將其作為測試數據。數據雖然是RGB格式,但是通過使用constants.js模塊,可以將通道數減少到1并且選擇黑白顯示。

TensorFlow Visor中隨機顯示的42個手勢圖像

選擇模型開始訓練

此外,側菜單還顯示了模型層、未經訓練樣本的結果、訓練樣本的統計數據和訓練樣本的結果。接下來的兩個按鈕,你可以選擇建立模型的類型了,建立簡單模型還是復雜模型?  

簡單還是復雜?正如“To be or not to be?”這個哲學問題一樣,模型的選擇也是一大難題,你可能會想:“應該優先選擇最先進的模型”,這是一個常見陷阱。如果選擇高級模型,首先,它需要花更長的時間訓練樣本甚至結果也沒有預想的那么好用。此外,如果訓練時間過長,高級模型會出現過擬合數據的問題。(注:過擬合是模型在對訓練數據進行預測時變得非常完美,由于模型對于訓練數據過于符合,因此對于新數據而言反而并不適用)一個好的機器學習模型可以概括為下圖:

使用一個復雜方程進行過擬合我選擇建立了一個非常適合簡單數據的簡單模型,以及另一個對于來自多角度和復雜背景的手勢真實照片更有用的高級模型。

訓練過程在訓練模型時,我們會獲得每批次更新的圖表,包括512個圖像,以及每個時期更新的另一張圖表,包括所有的2100個訓練圖像,一個健康的訓練迭代應具有損失減少,準確性提高等特征。

 精度圖中的橙色線表示驗證數據的準確度,即用訓練模型去預測剩余的420個未訓練圖像時的準確度。我發現代表驗證數據的橙色線與訓練數據精度幾乎重合,這說明建立的模型可以廣泛推廣(只要新圖像的復雜性和風格與已知圖像相似)。

訓練結果點擊“檢查訓練模型”,可以得到與預期相符結果如下:

上表顯示,代表剪刀手勢圖像的辨別十分準確,辨別準確性最低的是代表布的手勢圖像,其準確度只有95%,你的結果可能和本文結果略有不同,這是由初始訓練數據的隨機性導致的。為進一步挖掘具體原因,我做出如下混淆矩陣:

與預期相符的混淆矩陣從圖中我們可以發現代表布的手勢被錯誤地辨別為代表剪刀的手勢6次,這種錯誤很容易理解,因為代表布的手勢有時候看起來與代表剪刀的手勢很像,我們可以選擇接受這種錯誤或訓練更多樣本來改進錯誤,上述混淆矩陣可以幫助我們找出需要改進的錯誤所在。

模型測試

現在終于可以在現實世界中測試我們的模型了,我們使用網絡攝像頭檢查自己做出的代表石頭剪刀布的手勢圖像。需要注意的是我們的手勢圖像應與訓練圖像類似,沒有旋轉角度且背景為白色,便于模型進行識別。到這兒你已經可以在瀏覽器中訓練模型并進行了驗證,并進一步實現了現場測試,現在請把手舉到頂,并緩緩張開五指,你可以給自己放一個煙花了,恭喜你完成了所有的步驟。       

 相關報道:https://heartbeat.fritz.ai/using-tensorflow-js-to-train-a-rock-paper-scissors-model-b5f393b548eb

我還沒有學會寫個人說明!

2019年數據泄露事件激增,怎樣防止數據泄露?

上一篇

mysql5.7 General tablespace使用說明

下一篇

你也可能喜歡

10分鐘,用TensorFlow.js庫,訓練一個沒有感情的“剪刀石頭布”識別器

長按儲存圖像,分享給朋友

ITPUB 每周精要將以郵件的形式發放至您的郵箱


微信掃一掃

微信掃一掃
海天娱乐群 通富微电股票分析 专业期货配资公司 今天山西11选五走势图 江苏体彩七位数 江西11选五5任一怎么玩 青海快3电子走势图表 北京pk10高手单期计划 河内五分彩开奖结果不一样 山东11选5走势一定牛 人力资源配置怎么写