【翻譯】Movidius神經運算棒_認識與操作Neural Compute SDK:mvNCCheck
| 作者/攝影 | 曾吉弘 |
| 文章分類 | 教學(翻譯) |
| 時間 | 3小時 |
| 難度 |
★★★★★ |
| 材料表 |
|
(Original post from Intel Movidius NCS blog: “Using and Understanding the Neural Compute SDK: mvNCCheck”:https://movidius.github.io/blog/mvNCCheck/)
Neural Compute SDK Toolkit: mvNCCheck
Intel® Movidius™ 神經運算軟體開發套件(Neural Compute Software Development Kit,NCSDK)包含三套工具,用於幫助使用者順利上手,操作Intel® Movidius™ 神經運算棒(Intel® Movidius™ NCS)。這些工具包含:mvNCCheck,mvNCCompile及mvNCProfile。本文將幫助您更認識mvNCCheck工具程式的運作方式,以及如何將它整合至Neural Compute SDK的整體工作流程中。 [caption id="attachment_24732" align="aligncenter" width="640"]
圖1[/caption]
使用mvNCCheck的網路會有怎樣的效果呢?
您將學到:
- 如何使用mvNCCheck tool
- 如何解釋mvNCCheck的輸出結果
您會需要:
- Intel Movidius Neural Compute Stick 神經運算棒 – 購買請按我
- 執行Ubuntu 16.04的 x86_64 筆記型電腦
檢查網路
Step 1:開啟terminal,切換至ncsdk/examples/caffe/GoogLeNet目錄下 Step 2:使用mvNCCheck 來使Intel Movidius NCS上的網路生效。 [pastacode lang="bash" manual="mvNCCheck%20deploy.prototxt%20-w%20bvlc_googlenet.caffemodel" message="" highlight="" provider="manual"/] Step 3:完成了!您應該會看到類似下面的畫面訊息: [pastacode lang="bash" manual="USB%3A%20Myriad%20Connection%20Closing.%0AUSB%3A%20Myriad%20Connection%20Closed.%0AResult%3A%20%20(1000%2C)%0A1)%20885%200.3015%0A2)%20911%200.05157%0A3)%20904%200.04227%0A4)%20700%200.03424%0A5)%20794%200.03265%0AExpected%3A%20%20(1000%2C)%0A1)%20885%200.3015%0A2)%20911%200.0518%0A3)%20904%200.0417%0A4)%20700%200.03415%0A5)%20794%200.0325%0A------------------------------------------------------------%0A%20Obtained%20values%20%0A------------------------------------------------------------%0A%20Obtained%20Min%20Pixel%20Accuracy%3A%200.1923076924867928%25%20(max%20allowed%3D2%25)%2C%20Pass%0A%20Obtained%20Average%20Pixel%20Accuracy%3A%200.004342026295489632%25%20(max%20allowed%3D1%25)%2C%20Pass%0A%20Obtained%20Percentage%20of%20wrong%20values%3A%200.0%25%20(max%20allowed%3D0%25)%2C%20Pass%0A%20Obtained%20Pixel-wise%20L2%20error%3A%200.010001560141939479%25%20(max%20allowed%3D1%25)%2C%20Pass%0A%20Obtained%20Global%20Sum%20Difference%3A%200.013091802597045898%0A------------------------------------------------------------" message="" highlight="" provider="manual"/]mvNCCheck的功能為何,為何要用到它?
作為NCSDK的一部分,mvNCCheck提供以下三項主要功能:- 確保資料從fp32轉為fp16時的正確性
- 快速確認指定網路是否相容於Intel NCS
- 對網路各層進行快速除錯
確保結果的準確性
為確保結果的正確性,mvNCCheck會比較Intel Movidius NCS 與網路原生框架(Caffe/TensorFlow™)兩者間的推論結果。由於Intel Movidius NCS與NCSDK採用16-bit 浮點數資料,因此必須將收進來的32-bit浮點數資料轉為16-bit。fp32/fp16的轉換過程可能在推論結果中產生minor rounding的問題,這時候mvNCCheck工具程式就很好用了,它可檢查您所使用的網路是否產生正確的結果。 首先,mvNCCheck工具程式會讀取網路,並將模型轉換為Intel Movidius NCS可用的格式。接著它會在Intel Movidius NCS上使用網路來推論,也會用網路原生框架(Caffe/TensorFlow)來執行推論。 最後,mvNCCheck 會產生一份簡易的報表,比較Intel Movidius NCS與網路原生框架兩者的推論結果。這些結果可用於確認某個神經網路在fp32/fp16轉換後,是否還能產生一定正確性以上的結果。比較結果接下來會詳細討論。判斷網路與Intel Movidius NCS的相容性
mvNCCheck也可用於檢查某個網路是否相容於Intel Movidius NCS。有蠻多原因都會造神經網路與Intel Movidius NCS不相容,其中包括(但不限於)記憶體限制、不支援的層或不支援的神經網路架構。若想了解更多原因,請參考 Intel Movidius NCS documentation website 上關於TensorFlow與Caffe框架的說明。另外,最新的 NCSDK Release Notes也會說明關於SDK的勘誤與最新功能⋯⋯等等。使用mvNCCheck對網路進行偵錯
若您的網路執行不如預期,可運用mvNCCheck來對網路偵錯,只要執行 mvNCCheck 時加上 -in 與 -on 選項即可。- -in 選項可讓您將某個節點指定為輸入節點
- -on 選項可讓您將某個節點指定為輸出節點
偵錯範例:
假設您的網路架構如下:- Input - Data
- conv1 - Convolution Layer(卷積層)
- pooling1 - Pooling Layer(池化層)
- conv2 - Convolution Layer(卷積層)
- pooling2 - Pooling Layer(池化層)
- Softmax - Softmax
理解mvNCCheck的輸出結果
[caption id="attachment_24733" align="aligncenter" width="1000"]
圖2[/caption]
來看看上述 mvNCCheck 輸出所代表的意義:
- 綠色方框為Intel NCS的前五項推論結果
- 紅色方框為原生框架(可能是Caffe或TensorFlow)的前五項推論結果
- 藍色方框是兩者推論結果的各項比較結果
名詞解釋:
- ACTUAL – 神經運算棒的tensor輸出
- EXPECTED– 框架(Caffe或TensorFlow)的 tensor 輸出
- Abs – 計算絕對值
- Max – 計算一個(或多個)tensor的最大值
- Sqrt – 計算某數值的平方根
- Sum – 計算某數值的加總
最小像素正確度(Min Pixel Accuracy):
本數值代表兩個輸出tensor值之間的最大誤差。 [caption id="attachment_24734" align="aligncenter" width="307"]
圖3[/caption]
平均像素正確度(Average Pixel Accuracy):
兩個 tensor 數值的均差。 [caption id="attachment_24735" align="aligncenter" width="303"]
圖4[/caption]
錯誤值百分比:
本數值代表Intel Movidius NCS的tensor值,與框架tensor間的誤差是否超過 2%。 [caption id="attachment_24736" align="aligncenter" width="427"]
圖5[/caption]
為什麼是2%?這個閾值設定扣掉了來自fp32/fp16轉換後的精度降低的影響程度。
Pixel-wise L2 error:
本數值代表整個輸出tensor的約略相對誤差。 [caption id="attachment_24737" align="aligncenter" width="426"]
圖6[/caption]
將差異加總起來:
將Intel Movidius NCS tensor與框架tensor之間的所有差異加總起來。 [caption id="attachment_24738" align="aligncenter" width="296"]沒有輸入的話,mvNCCheck如何進行推論?
在神經網路中進行向前傳遞時,常見的作法是以一個tensor或一個數值陣列作為輸入。如果未指令輸入的話,mvNCCheck使用範圍在 -1 至 1之間的隨機浮點數作為輸入tensor。只要在圖像路徑後加上 “-i” 參數,也可將讓 mvNCCheck 接受圖像輸入。可能發生的錯誤與解決方法
若執行 mvNCCheck 但網路發生錯誤時,可能原因如下:輸入值縮放
某些神經網路要求輸入值得先被縮放(scale)調整過。若輸入未經縮放的話,可能造成Intel Movidius NCS與網路原生框架的推論結論不一致的狀況。 使用 mvNCCheck 時,可用–S選項來指定用於縮放輸入值的除數。圖像通常以每個顏色通道數值範圍介於 0 到 255 間的方式儲存。若有個神經網路需要輸入值介於 0.0 到 1.0 之間,請用–S 255選項將所有輸入數值除以255,就可以把它們縮放到 0.0 到 1.0 之間了。 –M 選項可用於對輸入值減去均值。例如,若某個神經網路需要輸入值介於 -1 到 1 之間的話,請同時用–S 128與–M 128選項將做到此事。未支援的層
Intel Movidius NCS 並未支援前所有的神經網路架構與層。若執行 mvNCCheck 後看見“Stage Details Not Supported”的錯誤訊息,就代表您所選用的網路需額外處理步驟,或是Neural Compute SDK尚未支援這些層。想知道目前支援哪些層,請參考 Neural Compute Caffe Support 與 Neural Compute TensorFlow Support 等說明網頁。其他Bug
其他造成不正確結果的可能原因就是bug啦!請來這邊回報吧:Intel Movidius Neural Compute Developer Forum.更多關於mvNCCheck
關於 mvNCCheck 所以有可用的參數,請參考 mvNCCheck 文件頁面。延伸閱讀
- Intel Movidius NCS 開發工作流程
- 本篇文章談到了如何設定神經網路,包含了均值減法與 scaling 等主題。
留言 💬 (0)
還沒有留言,來當第一個。