1. 程式人生 > >mxnet入門--第4篇

mxnet入門--第4篇

第3篇文章中,我們構建並訓練了第一個神經網路,接下來可以處理一些更復雜的樣本了。

最頂尖的深度學習模型通常都複雜到讓人難以置信。其中可能包含數百層,就算用不了數週,往往也要數天時間來使用海量資料進行訓練。這類模型的構建和優化需要大量經驗。

好在這些模型的使用還是很簡單的,通常只需要編寫幾行程式碼。本文將使用一個名為Inception v3的預訓練模型進行圖片分類。

Inception v3

誕生於2015年12月的Inception v3GoogleNet模型(曾贏得2014年度ImageNet挑戰賽)的改進版。本文不準備深入介紹該模型的研究論文,不過打算強調一下論文的結論:相比當時最棒的模型,Inception v3的準確度高出了15%–25%

,同時計算的經濟性方面低六倍,並且至少將引數的數量減少了五倍(例如使用該模型對記憶體的要求更低)。

簡直就是神器!那麼我們該如何使用?

MXNet model zoo

Model zoo提供了一系列可直接使用的預訓練模型,並且通常還會提供模型定義模型引數(例如神經元權重),(也許還會提供)使用說明。

首先來下載定義和引數(你也許需要更改檔名)。第一個檔案可以直接開啟:其中包含了每一層的定義。第二個檔案是一個二進位制檔案,請不要開啟 ;)

$ wget http://data.dmlc.ml/models/imagenet/inception-bn/Inception-BN-symbol.json
$ wget http://data.dmlc.ml/models/imagenet/inception-bn/Inception-BN-0126.params
$ mv Inception-BN-0126.params Inception-BN-0000.params

該模型已通過ImageNet資料集進行了訓練,因此我們還需要下載對應的圖片分類清單(共有1000個分類)。

$ wget http://data.dmlc.ml/models/imagenet/synset.txt
$ wc -l synset.txt
    1000 synset.txt
$ head -5 synset.txt
n01440764 tench, Tinca tinca
n01443537 goldfish, Carassius auratus
n01484850 great white shark, white shark, man-eater, man-eating shark, Carcharodon carcharias
n01491361 tiger shark, Galeocerdo cuvieri
n01494475 hammerhead, hammerhead shark

搞定,開始實戰。

載入模型

我們需要:

  • 載入處於儲存狀態的模型:MXNet將其稱之為檢查點(Checkpoint)。隨後即可得到輸入的Symbol和模型引數。
    import mxnet as mx
    
    sym, arg_params, aux_params = mx.model.load_checkpoint('Inception-BN', 0)
  • 新建一個Module併為其指派輸入Symbol。我們還可以使用一個Context引數決定要在哪裡執行該模型:預設值為cpu(0),但也可改為gpu(0)以便通過GPU執行。
    mod = mx.mod.Module(symbol=sym)
  • 將輸入Symbol繫結至輸入資料。將其稱之為“資料”是因為在網路的輸入層中就使用了這樣的名稱(可以從JSON檔案的前幾行程式碼中看到)。

  • 將“資料”的形態(Shape)定義為1x3x224x224。別慌 ;),“224x224”是圖片的解析度,模型就是這樣訓練出來的。“3”是通道數量:紅綠藍(嚴格按照這樣的順序),“1”是批大小:我們將一次預測一張圖片。

    mod.bind(for_training=False, data_shapes=[('data', (1,3,224,224))])
  • 設定模型引數。
    mod.set_params(arg_params, aux_params)

這樣就可以了。只需要四行程式碼!隨後可以放入一些資料看看會發生什麼。嗯……先別急。

準備資料

資料準備:從七十年代以來,這一直是個痛苦的過程……從關係型資料庫到機器學習,再到深度學習,這方面沒有任何改進。雖然乏味但很必要。開始吧。

還記得嗎,這個模型需要通過四維NDArray來儲存一張224x224解析度圖片的紅、綠、藍通道資料。我們將使用流行的OpenCV庫從輸入圖片中構建這樣的NDArray。如果還沒安裝OpenCV,考慮到本例的要求,直接執行pip install opencv-python就夠了 :)。

隨後的步驟如下:

  • 讀取圖片:將返回一個Numpy陣列,其形態為(圖片高度, 圖片寬度, 3),按順序代表BGR(藍、綠、紅)三個通道。
    img = cv2.imread(filename)
  • 將圖片轉換為RGB
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  • 將圖片調整大小224x224
    img = cv2.resize(img, (224, 224,))
  • 重塑陣列的形態,從(圖片高度, 圖片寬度, 3)重塑為(3, 圖片高度, 圖片寬度)。
    img = np.swapaxes(img, 0, 2)
    img = np.swapaxes(img, 1, 2)
  • 新增一個第四維度並構建NDArray
    img = img[np.newaxis, :]
    array = mx.nd.array(img)
    >>> print array.shape
    (1L, 3L, 224L, 224L)

暈了?一起用個例子看看吧。輸入下列這張圖片:

輸入448x336的圖片(來源:metaltraveller.com)

處理完畢後,該圖會被縮小尺寸並拆分為RGB通道,儲存在array[0]中(生成下文圖片的程式碼可參閱這裡)。

array[0][0]:224x224,紅色通道

array0:224x224,綠色通道

array0:224x224,藍色通道

如果批大小大於1,那麼可以通過array1指定第二張圖片,使用array2指定第三張圖片,以此類推。

無論這個過程是乏味還是有趣,接下來我們開始預測吧!

開始預測

你可能還記得第3篇文章中提到,Module物件必須以為單位向模型提供資料:最常見的做法是使用資料迭代器(因此我們使用了NDArrayIter物件)。

在這裡我們想要預測一張圖片,因此儘管可以使用資料迭代器,不過也沒啥必要。但我們可以建立一個名為Batch的具名元組(Named tuple),它可以充當假的迭代器,在引用資料屬性時返回輸入的NDArray。

from collections import namedtuple
Batch = namedtuple('Batch', ['data'])

隨後即可將這個“Batch”傳遞給模型開始預測。

mod.forward(Batch([array]))

這個模型會輸出一個包含1000個可能性的NDArray,每個可能性對應一個分類。由於批大小等於1,因此只需要一行程式碼。

prob = mod.get_outputs()[0].asnumpy()
>>> prob.shape
(1, 1000)

使用squeeze()將其轉換為陣列,隨後使用argsort()建立第二個陣列,其中儲存了這些可能性按照降序排列的指數

prob = np.squeeze(prob)
>>> prob.shape
(1000,)
>> prob
[  4.14978594e-08   1.31608676e-05   2.51907986e-05   2.24045834e-05
   2.30327873e-06   3.40798979e-05   7.41563645e-06   3.04062659e-08 etc.
sortedprob = np.argsort(prob)[::-1]
>> sortedprob.shape
(1000,)

根據模型的計算,這張圖片最可能的分類是#546,可能性為58%

>> sortedprob
[546 819 862 818 542 402 650 420 983 632 733 644 513 875 776 917 795
etc.
>> prob[546]
0.58039135

這個分類叫什麼名字呢?我們可以使用synset.txt檔案構建分類清單,並找出546號的名稱。

synsetfile = open('synset.txt', 'r')
categorylist = []
for line in synsetfile:
  categorylist.append(line.rstrip())
>>> categorylist[546]
'n03272010 electric guitar'

可能性第二大的分類是什麼?

>>> prob[819]
0.27168664
>>> categorylist[819]
'n04296562 stage

挺棒的,你說呢?

就是這樣,我們已經瞭解瞭如何使用預訓練的頂尖模型進行圖片分類。而這一切只需要4行程式碼……除此之外只要準備好資料就夠了。

完整程式碼如下,請自行嘗試並繼續保持關注 ??

後續內容:

  • 第5篇:進一步瞭解預訓練模型(VGG16和ResNet-152)
  • 第6篇:通過樹莓派進行實時物體檢測(並讓它講話!)

相關推薦

mxnet入門--4

在第3篇文章中,我們構建並訓練了第一個神經網路,接下來可以處理一些更復雜的樣本了。最頂尖的深度學習模型通常都複雜到讓人難以置信。其中可能包含數百層,就算用不了數週,往往也要數天時間來使用海量資料進行訓練。這類模型的構建和優化需要大量經驗。好在這些模型的使用還是很簡單的,通常只

Mxnet入門--1

MXNet教程這一系列文章將概括介紹深度學習庫MXNet,將介紹該庫的主要功能及其Python API(可能會成為該庫的首選API)。隨後還將提供一些有關MXNet的線上教程和筆記,希望能幫助大家更好地理解這項技術!如果希望進一步瞭解MXNet的原理和架構,推薦閱讀這篇論文:

mxnet入門--6

在第5篇文章中,我們使用三種預訓練模型進行物體檢測,並通過一些圖片對他們的效果進行了對比。在這一過程中發現這些模型有著截然不同的記憶體需求,最“節省”的Inception v3“只”需要43MB記憶體。那這就提出了另一個問題:“能否在某些非常小型的裝置,例如樹莓派上執行這些模

【一文章帶你讀完《C++遊戲程式設計入門 4版》】

《C++遊戲程式設計入門 第4版》下載地址:https://download.csdn.net/download/qq_23996157/10764030 有道雲筆記分享:http://note.youdao.com/noteshare?id=4604366ece0ac2950db30ade53

4-JAVA基礎

關鍵字 continue 表達式 java基礎 布爾 第4篇-JAVA基礎每篇一句 :世界上本沒有完美,但是我們從未放棄追求完美初學心得: 樂於揮霍的時間,都不能算作浪費(筆者:JEEP/711)[JAVA筆記 | 時間:2017-04-01| JAVA基礎 Ⅳ]程序運行流程(1) 順序結

Java開發工程師(Web方向) - 01.Java Web開發入門 - 4章.Maven

編譯器 靜態資源 重復 mvn clean art servle 技術 工具 環境 第4章--Maven Maven實戰 Java Web應用的部署: 手動式: 編譯:javac -cp $CATALINA_HOME/lib/servlet-api.jar web-inf/

Python學習【4】:元組魔法

vaule 根據 取值 保留 列表 tuple 樣書 key值 推薦 tu = (111,"xiaoxing",(11,22),[(33,44)],45,)#1.書寫格式#一般寫元組的時候推薦在最後加入逗號,#元組中的一級元素不可被修改,不能增加或者刪除print(tu)#

開啟運維之路之 4 ——常見軟體安裝:JRE、MySQL、Tomcat安裝

1、JRE安裝:在正式環境裡 我們可以不安裝jdk ,僅僅安裝Java執行環境 jre即可。 ①下載jre:JRE官網下載地址 開啟連結,勾選協議,下載Linux版本64位的 ②上傳jre到/home/data/下:使用FTP工具上傳。 如果上傳過程遇到下面的問題:連線到

4 Java多執行緒

多執行緒:★★★★ 程序:正在進行中的程式。其實程序就是一個應用程式執行時的記憶體分配空間。 執行緒:其實就是程序中一個程式執行控制單元,一條執行路徑。程序負責的是應用程式的空間的標示。執行緒負責的是應用程式的執行順序。   一個程序至少有一個執行緒在執行,當一個程序中出現

redis 4 Redis資料型別----string

  命令 賦值 語法:SET key value 127.0.0.1:6379> set test 123 OK 取值 語法:GET key 127.0.0.1:6379> ge

讀書筆記 ---- 《深入理解Java虛擬機器》---- 4:虛擬機器效能監控與故障處理工具

上一篇:垃圾收集器:https://blog.csdn.net/pcwl1206/article/details/84197088 本文轉自:https://blog.csdn.net/WSYW126/article/details/62422005 第4篇:虛擬機器效能監控與故障處理工具

HTML5學習4——HTML5元素分類及各元素簡介

HTML5元素分類 html5元素分類圖: 1.結構性元素 article與section 元素名稱 元素釋義 特點 article 用來表示文件、頁面中

【搞定Java併發程式設計】4:多執行緒概述~下篇

上一篇:多執行緒上篇:https://blog.csdn.net/pcwl1206/article/details/84837530 目  錄: 1、等待/喚醒機制 2、執行緒中斷 3、執行緒終止 4、執行緒休眠sleep 5、執行緒讓步yield() 6、jo

[Qt Creator 快速入門] 4章 佈局管理

第3章講述了一些視窗部件,當時往介面上拖放部件時都是隨意放置的,這對於學習部件的使用沒有太大的影響,但是,對於一個完善的軟體,佈局管理卻是必不可少的。 無論是想要介面中部件有一個很整齊的排列,還是想要介面能適應視窗的大小變化,都 要進行佈局管理。Qt中主要提供了 QLayout 類及其子類來作為佈局管理器,它

4 stream---規約

/** * 規約 */ public class Demo04 { public static void main(String[] args) { List<Integer> numbers = Arrays.asList(1, 2,

linux 4 使用者和組

新增一個tom使用者,設定它屬於users組,並添加註釋資訊 分步完成:useradd tom           usermod -g users tom           usermod -c "hr tom" tom 一步完成:useradd -g users -c

乞丐版servlet容器4

6. NIOConnector 現在為Server新增NIOConnector,新增之前可以發現我們的程式碼其實是有問題的。比如現在的程式碼是無法讓伺服器支援同時監聽多個埠和IP的,如同時監聽 127.0.0.1:18080和0.0.0.0:18443現在是無法做到的。因為當

Python學習【4】:Python之可變資料型別與不可變資料型別 可變資料型別和不可變資料型別

可變資料型別和不可變資料型別 1.可變資料型別:在id不變的情況下,value可改變(列表和字典是可變型別,但是字典中的key值必須是不可變型別)   2.不可變資料型別:value改變,id也跟著改變。

mysql學習【4】:資料庫之資料型別 資料庫之資料型別

資料庫之資料型別 首先補充點了解的小知識; select * from mysql.user #顯示出來亂了 select * from mysql

4 Scrum 衝刺部落格

第4篇 Scrum 衝刺部落格 各個成員今日完成的任務(如果完成的任務為開發或測試任務,需給出對應的Github程式碼簽入記錄截圖;如果完成的任務為調研任務,需給出對應的調研總結部落格連結;如果完成的任務為學習技術任務,需給出學習總結部落格連結) 陸大嶽、彭霖:伺服器以及Android客戶端簽到系統的編寫