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

Mxnet入門--第1篇

MXNet教程

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

如果希望進一步瞭解MXNet的原理和架構,推薦閱讀這篇論文:“MXNet:適用於異構分散式系統,靈活高效的機器學習庫”。本文將介紹這篇論文涉及的大部分概念,不過會盡量以更淺顯易懂的方式進行介紹。


在本地執行MXNet

首先最重要的事:MXNet的安裝。本文不會詳細介紹安裝方法,只會介紹一些技巧。

MXNet最酷的功能之一在於,可以在CPU和GPU上實現完全相同的執行效果(下文將介紹如何針對具體運算選擇執行位置)。這意味著就算你的計算機不具備Nvidia GPU(例如我的MacBook),依然可以編寫並執行MXNet程式碼,並放在具備GPU的系統中使用。

如果你的計算機帶有符合要求的GPU也更好,但還需要安裝CUDAcuDNN工具包,大部分情況下這一過程猶如一場噩夢。就算MXNet二進位制檔案和Nvidia工具之間存在哪怕最輕微的不相容問題,也會導致安裝失敗無法使用。

因此我個人強烈建議你使用MXNet網站提供的Docker映象:一個針對CPU環境,另一個針對GPU環境(要求具備nvidia-docker)。這些映象包含預安裝的所有必要元件,可以幫助使用者更快速投入使用。

sudo -H pip install mxnet  --upgrade
python
>>> import mxnet as mx
>>> mx.__version__
'0.9.3a3'

另外值得一提的是,這個Docker映象提供的Python程式包似乎比通過“pip”方式獲得的版本更新一些

docker run -it  mxnet/python
[email protected]:/# python
>>> import mxnet as mx
>>> mx.__version__
'0.9.5'

通過AWS執行MXNet

AWS提供了適用於LinuxUbuntu深度學習AMI (Amazon Machine Image)。這些AMI包含預安裝的各種深度學習框架(MXNet是其中之一),此外還包含Nvidia工具以及其他工具。無需配置立即可用

====================================================================
       __|  __|_  )
       _|  (     /   Deep Learning AMI for Amazon Linux
      ___|\___|___|
====================================================================
[[email protected] ~]$ nvidia-smi -L
GPU 0: GRID K520 (UUID: GPU-d470337d-b59b-ca2a-fe6d-718f0faf2153)
[[email protected] ~]$ python
>>> import mxnet as mx
>>> mx.__version__
'0.9.3'

我們可以在常規例項或GPU例項上執行這種AMI。如果你的計算機未配備Nvidia GPU,那麼在稍後啟動訓練網路後這一特性就會顯得很實用:成本最低的選項是使用每小時價格僅為0.65美元的g2.2xlarge例項。

因此目前,繼續按照老派的做法使用CPU就夠了!一起開始吧。

為何說NDArrays很重要

我們要介紹的第一類MXNet API是NDArray API。NDArray是一種n維陣列,其中可包含型別與大小完全一致的項(32位浮點、32位整數等)。

這種陣列為何重要?之前的一篇文章中進行過解釋:神經網路的訓練和執行會涉及大量數學運算,此時將使用多維陣列來儲存資料。

輸入資料,神經元進行權值,隨後輸出的資料儲存至向量和矩陣(Matrice)中,因此自然而然就產生了這種型別的構造。

用一個簡單的例子來類比一下:圖片分類。下圖代表一個手寫的數字“8”,圖片規格為18x18畫素。

數字“8”,18x18畫素

這個圖片可以看作是一個18x18的矩陣,其中每個單元代表了對應畫素的灰度值:“0”代表白色,“255”代表黑色,介於兩者之間的值代表254級灰度。我們正是通過這種矩陣化的呈現訓練神經網路對從0到9的數字進行分類的。

一個18x18的矩陣,代表了上述圖片的灰度值

假設我們用彩色圖片取代灰度圖片。這樣每個圖片將需要用3個矩陣來表示,每種顏色對應一個矩陣,此時輸入的資料會變得略微複雜一些。

接著更進一步,假設為了實現無人駕駛需要進行實時圖片識別:為了能通過高質量的實時資料做決策,我們會使用1000x1000畫素的RGB圖片,並且每秒鐘需要識別30幀。每一秒,都需要處理90個1000x1000的矩陣(30幀x3色)。如果每個畫素用一個32位值表示,那就是90x1000x1000x4位元組,大約343兆位元組。如果用到了多個攝像頭,資料量還會進一步激增。

對神經網路來說這個資料量已經很大了:為了獲得最優效能(例如最小延遲),GPU並不會逐張處理圖片,而是會偏批量處理。如果批的大小為8,我們的神經網路將以1000x1000x24的塊為單位處理輸入的資料,也就是以三原色代表的8張1000x1000畫素圖片組成的三維陣列。

底線:最起碼需要理解NDArrays :) 這是神經網路的基礎,並且我們的大部分資料都會儲存為這種形式。

NDArray API

瞭解了NDArrays的重要性後,再來看看工作方式(沒錯,終於開始講程式碼了!)。如果你曾用過numpy這個Python庫會更好理解:NDArrays與其極為類似,並且你可能已經熟悉其中的大部分API,完整文件可參閱這裡

首先從最基礎的開始。這就不需要過多解釋了吧 :)

>>> a = mx.nd.array([[1,2,3], [4,5,6]])
>>> a.size
6
>>> a.shape
(2L, 3L)
>>> a.dtype
<type 'numpy.float32'>

預設情況下,一個NDArray可以儲存32位浮點,不過這個大小可以調整。

>>> import numpy as np
>>> b = mx.nd.array([[1,2,3], [2,3,4]], dtype=np.int32)
>>> b.dtype

NDArray的列印很簡單,這樣:

>>> b.asnumpy()
array([[1, 2, 3],
       [2, 3, 4]], dtype=int32)

NDArray支援所有需要的數學運算,例如可以試試看進行一個面向元素的矩陣乘法:

>>> a = mx.nd.array([[1,2,3], [4,5,6]])
>>> b = a*a
>>> b.asnumpy()
array([[  1.,   4.,   9.],
       [ 16.,  25.,  36.]], dtype=float32)

再來個嚴格意義上的矩陣乘法(又叫“點積”)怎麼樣?

>>> a = mx.nd.array([[1,2,3], [4,5,6]])
>>> a.shape
(2L, 3L)
>>> a.asnumpy()
array([[ 1.,  2.,  3.],
       [ 4.,  5.,  6.]], dtype=float32)
>>> b = a.T
>>> b.shape
(3L, 2L)
>>> b.asnumpy()
array([[ 1.,  4.],
       [ 2.,  5.],
       [ 3.,  6.]], dtype=float32)
>>> c = mx.nd.dot(a,b)
>>> c.shape
(2L, 2L)
>>> c.asnumpy()
array([[ 14.,  32.],
       [ 32.,  77.]], dtype=float32)

接著再來試試一些更復雜的運算:

  • 初始化一個均勻分佈的1000x1000矩陣並存儲在GPU#0(此處使用了一個g2例項)。
  • 初始化另一個正態分佈的1000x1000矩陣(均值為1,標準差為2),也儲存在GPU#0。
>>> c = mx.nd.uniform(low=0, high=1, shape=(1000,1000), ctx="gpu(0)")
>>> d = mx.nd.normal(loc=1, scale=2, shape=(1000,1000), ctx="gpu(0)")
>>> e = mx.nd.dot(c,d)

別忘了,MXNet可以在CPU和GPU上實現一致的執行結果。這就是個很棒的例子:只要將上述程式碼中的“gpu(0)”替換為“cpu(0)”,就可以通過CPU執行這個點積。

至此你應該可以開始與NDArray一起遊戲了。我們還可以用其他更高階的函式(FullyConnected等)來構建神經網路,這些內容等真正開始介紹神經網路的時候再說。

今天要講的就是這些。下篇文章將要介紹Symbol API,通過它我們可以定義資料流,而這才是神經網路最重要的部分。感謝閱讀,還請繼續關注。

後續內容:

- 第2篇:Symbol API

- 第3篇:Module API

- 第4篇:使用預訓練模型進行圖片分類(Inception v3)

- 第5篇:進一步瞭解預訓練模型(VGG16和ResNet-152)

- 第6篇:通過樹莓派進行實時物體檢測(並讓它講話!)

相關推薦

Mxnet入門--1

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

mxnet入門--4

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

mxnet入門--6

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

python進階1 函數入門

避免 活性 保持 分開 append 表達 按順序 lose item 知識內容: 1.函數的作用 2.函數的定義與調用 3.函數的返回值 4.函數的參數 一、函數的作用 1.復用代碼 將可能重復執行的代碼封裝成函數,並在需要執行的地方調用函數,不僅可以實現代碼的復

《Java從入門到精通 魔力科技著》之1 Java概述

       1991 年Sun公司的James Gosling等人開始開發名稱為 Oak 的語言,希望用於控制嵌入在有線電視交換盒、PDA等的微處理器;        1994年將Oak語言更名為Java; Java的三種技術架構:        JAVAEE:J

【springboot 入門1 一個spring-boot程式(多種搭建方式)

學習一個新技術,先別管他的原理啊,流程啊,怎麼組織程式碼啊什麼的。直接從官網或者部落格抄一個小demo,自己親自跑一遍,然後再去看那一堆讓人頭皮發麻的講解,就能相對容易的看懂了。 初學者的態度應該是:不要問我為什麼,反正我就是可以這樣執行! 1. 建立一個spring boot專案可以使用

乞丐版servlet容器1

編程 需要 stop 參數 nal 問題 工廠類 int 編寫 本系列參照pkpk1234大神的BeggarServletContainer,具體請訪問:https://github.com/pkpk1234/BeggarServletContainer。 一步一步從無到有

Beta階段——1 Scrum 沖刺博客

需要 調查 並且 角色 class clas 們的 web ble a. 介紹小組新加入的成員,Ta擔任的角色。 新加的成員 : 劉舒婷 擔任的成員 : PM項目經理 b. 討論是否需要更換團隊的PM。 經小組討論後,由新成員擔任我們的項目經理 c 下一階段需要改進

Java 10 實戰 1 :局部變量類型推斷

static nsh ima 推斷 定義類 println 虛擬機 ID 圖片 現在 Java 9 被遺棄了直接升級到了 Java 10,之前也發過 Java 10 新特性的文章,現在是開始實戰 Java 10 的時候了。 今天要實戰的是 Java 10 中最重要的特性:局

Python爬蟲開發【1】【urllib2】

返回JSON數據 驗證 ajax 本地磁盤 發送請求 doc 大寫 總結 錯誤 1、urlopen # urllib2_urlopen.py # 導入urllib2 庫 import urllib2 # 向指定的url發送請求,並返回服務器響應的類文件對象 respo

Python爬蟲開發【1】【正則表達式】

返回 true ccf color arch iter 子串 call last 1、正則表達式   它是對字符串操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。 2、re

Python爬蟲開發【1】【beautifulSoup4解析器】

res tail {} nbsp catalog XML select 解析器 enc CSS 選擇器:BeautifulSoup4 Beautiful Soup 也是一個HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 數據。 pip 安裝:pip

Python爬蟲開發【1】【爬蟲案例】

selenium NPU word fun isa time input == 百度 案例一:網站模擬登錄 # douban.py from selenium import webdriver from selenium.webdriver.common.keys im

python從零開始 -- 1之環境搭建

接收 window .py 文檔 路徑 很多 教程 編碼 官方   事實上,網絡上有很多相應的教程,本文無意做成文章的粘貼展示板,附上我認為的簡易的安裝詳解: 安裝 Python 環境(編程小白的第一本 Python 入門書),包含了python以及相關的IDE,圖文並茂,

《Python量化交易教程》第一部分新手入門 1天:誰來給我講講Python?

一、量化投資視訊學習課程 二、Python手把手教學 第1天:誰來給我講講Python? PS: 1.注意使用方法,這個以後都有大用 2.注意符號的使用方式 3.儘量用英文表達 4.本日學習內容以及其他注意事項: 今天學習了Python的基本頁面、操作,以及幾種主要的容器型別,天還要學習Pyt

開啟運維之路之 1 ——安裝虛擬機器VMware、作業系統CentOS7、Xshell6、FTP Rush

OK,老樣子,先說個冷笑話: 有個程式設計師,坐在大廈下苦苦檢查bug。 這時候過來一個乞丐順勢坐在他旁邊,開始要飯。 程式設計師覺得他可憐,就給了他1塊錢,然後接著除錯程式。 乞丐可能生意不好,就無聊的看著他在幹什麼。 過了一會,乞丐幽幽地對程式設計師說:“你這裡少了個分號。” 程式設計師

1 Qt5基礎(一)Qt開發環境的搭建和hello world

1、開發qt可以使用那些IDE? 使用Qt Creator進行Qt開發; 使用VS進行Qt開發; 不用IDE,直接使用記事本也可以編寫Qt程式。 2、在專案模板中選擇Application,然後選擇Qt Widgets Application,這樣便會生成一個桌面Qt圖

1 java 8 流的學習----篩選和切片

篩選、切片和匹配  查詢、匹配和歸約  使用數值範圍等數值流  從多個源建立流  無限流 /** * 篩選和切片 */ public class Demo01 { public static void main(String[] args) { List&l

WEB攻擊手段及防禦1-XSS

  概念 XSS全稱為Cross Site Script,即跨站點指令碼攻擊,XSS攻擊是最為普遍且中招率最多的web攻擊方式,一般攻擊者通過在網頁惡意植入攻擊指令碼來篡改網頁,在使用者瀏覽網頁時就能執行惡意的操作,像html、css、img都有可能被攻擊。

雜談(1) | 程序、執行緒、協程的區別與聯絡

作為程式設計師,在面試的時候經常被問到:說說程序、執行緒、協程的區別。下面我們就總結一下。 1.面試答案     1.1  程序與執行緒的區別 總述:執行緒是程序的一個實體,一個程序至少有一個執行緒。 1.根本區別;程序是作業系統資源分配的基本