mxnet入門--第4篇
在第3篇文章中,我們構建並訓練了第一個神經網路,接下來可以處理一些更復雜的樣本了。
最頂尖的深度學習模型通常都複雜到讓人難以置信。其中可能包含數百層,就算用不了數週,往往也要數天時間來使用海量資料進行訓練。這類模型的構建和優化需要大量經驗。
好在這些模型的使用還是很簡單的,通常只需要編寫幾行程式碼。本文將使用一個名為Inception v3的預訓練模型進行圖片分類。
Inception v3
誕生於2015年12月的Inception v3是GoogleNet模型(曾贏得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客戶端簽到系統的編寫