作者:董超
來(lái)源:騰訊云技術(shù)社區(qū)「騰云閣」
現(xiàn)在人工智能是個(gè)大熱點(diǎn)夜焦,而人工智能離不開(kāi)機(jī)器學(xué)習(xí),機(jī)器學(xué)習(xí)中深度學(xué)習(xí)又是比較熱門(mén)的方向,本系列文章就從實(shí)戰(zhàn)出發(fā)借宵,介紹下如何使用MXnet進(jìn)行深度學(xué)習(xí)~
既然是實(shí)戰(zhàn)而且本文是入門(mén)級(jí)別的我們就不講那么多大家都聽(tīng)不懂的數(shù)學(xué)公式啦~
0x00 深度學(xué)習(xí)簡(jiǎn)介
雖然吧,我們不講哪些深?yuàn)W的數(shù)學(xué)原理矾削,但是基本的原理還是要掌握下的~
在介紹深度學(xué)習(xí)之前我們要先了解兩個(gè)概念壤玫,機(jī)器學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)。
機(jī)器學(xué)習(xí):
在介紹深度學(xué)習(xí)之前哼凯,我們先簡(jiǎn)單介紹下機(jī)器學(xué)習(xí)欲间,我們引用下維基百科上機(jī)器學(xué)習(xí)的定義:
機(jī)器學(xué)習(xí)是人工智能的一個(gè)分支。人工智能的研究是從以“推理”為重點(diǎn)到以“知識(shí)”為重點(diǎn)断部,再到以“學(xué)習(xí)”為重點(diǎn)猎贴,一條自然、清晰的脈絡(luò)蝴光。顯然她渴,機(jī)器學(xué)習(xí)是實(shí)現(xiàn)人工智能的一個(gè)途徑,即以機(jī)器學(xué)習(xí)為手段解決人工智能中的問(wèn)題蔑祟。機(jī)器學(xué)習(xí)在近30多年已發(fā)展為一門(mén)多領(lǐng)域交叉學(xué)科趁耗,涉及概率論、統(tǒng)計(jì)學(xué)疆虚、逼近論苛败、凸分析、計(jì)算復(fù)雜性理論等多門(mén)學(xué)科径簿。
機(jī)器學(xué)習(xí)理論主要是設(shè)計(jì)和分析一些讓計(jì)算機(jī)可以自動(dòng)“學(xué)習(xí)”的算法罢屈。機(jī)器學(xué)習(xí)算法是一類從數(shù)據(jù)中自動(dòng)分析獲得規(guī)律,并利用規(guī)律對(duì)未知數(shù)據(jù)進(jìn)行預(yù)測(cè)的算法牍帚。因?yàn)閷W(xué)習(xí)算法中涉及了大量的統(tǒng)計(jì)學(xué)理論儡遮,機(jī)器學(xué)習(xí)與推斷統(tǒng)計(jì)學(xué)聯(lián)系尤為密切,也被稱為統(tǒng)計(jì)學(xué)習(xí)理論暗赶。算法設(shè)計(jì)方面鄙币,機(jī)器學(xué)習(xí)理論關(guān)注可以實(shí)現(xiàn)的肃叶,行之有效的學(xué)習(xí)算法。很多推論問(wèn)題屬于無(wú)程序可循難度十嘿,所以部分的機(jī)器學(xué)習(xí)研究是開(kāi)發(fā)容易處理的近似算法因惭。
簡(jiǎn)單的說(shuō)機(jī)器學(xué)習(xí)就是讓機(jī)器去分析數(shù)據(jù)找規(guī)律,并通過(guò)找到的規(guī)律對(duì)新的數(shù)據(jù)進(jìn)行處理绩衷。
神經(jīng)網(wǎng)絡(luò):
神經(jīng)元:
以圖像為例子蹦魔,每個(gè)數(shù)據(jù)或者輸入就是一張圖片,而里面的每個(gè)x可以是圖片中的每個(gè)像素咳燕。對(duì)于每個(gè)像素我們都賦予一個(gè)權(quán)重勿决,然后經(jīng)過(guò)轉(zhuǎn)換函數(shù)(Transfer Function, 這里是線性疊加)得到一個(gè)數(shù)值。簡(jiǎn)單來(lái)說(shuō)招盲,我們對(duì)所有像素做個(gè)線性加權(quán)疊加低缩。得到的數(shù)值會(huì)經(jīng)過(guò)激活函數(shù)得到新的數(shù)值。這個(gè)激活函數(shù)(Activation Function)往往是那幾個(gè)符合某些特性的非線性函數(shù)曹货。為什么需要非線性的轉(zhuǎn)換呢咆繁?舉個(gè)簡(jiǎn)單的例子,在同一個(gè)平面你和你的影子是重疊是分不開(kāi)的顶籽,在立體的空間你們卻能分開(kāi)了玩般。非線性的轉(zhuǎn)換有類似的作用。常用的激活函數(shù)有relu, softmax, tanh礼饱。
簡(jiǎn)單的說(shuō)一個(gè)神經(jīng)元是一個(gè)簡(jiǎn)單的分類器坏为,你輸入一個(gè)
比如我們有一大堆貓、狗照片慨仿,把每一張照片送進(jìn)一個(gè)機(jī)器里久脯,機(jī)器需要判斷這幅照片里的東西是貓還是狗。我們把貓狗圖片處理一下镰吆,左邊是狗的特征向量,右邊是貓的
大家想想跑慕,最簡(jiǎn)單地把這兩組特征向量分開(kāi)的方法是啥万皿?當(dāng)然是在兩組數(shù)據(jù)中間畫(huà)一條豎直線,直線左邊是狗核行,右邊是貓牢硅,分類器就完成了。以后來(lái)了新的向量芝雪,凡是落在直線左邊的都是狗减余,落在右邊的都是貓。
一條直線把平面一分為二惩系,一個(gè)平面把三維空間一分為二位岔,一個(gè)n-1維超平面把n維空間一分為二如筛,兩邊分屬不同的兩類,這種分類器就叫做神經(jīng)元抒抬。
當(dāng)然杨刨,上面那幅圖我們是開(kāi)了上帝視角才知道“一條豎直線能分開(kāi)兩類”,在實(shí)際訓(xùn)練神經(jīng)元時(shí)擦剑,我們并不知道特征是怎么抱團(tuán)的妖胀。神經(jīng)元模型的一種學(xué)習(xí)方法稱為Hebb算法:
先隨機(jī)選一條直線/平面/超平面,然后把樣本一個(gè)個(gè)拿過(guò)來(lái)惠勒,如果這條直線分錯(cuò)了赚抡,說(shuō)明這個(gè)點(diǎn)分錯(cuò)邊了,就稍微把直線移動(dòng)一點(diǎn)纠屋,讓它靠近這個(gè)樣本涂臣,爭(zhēng)取跨過(guò)這個(gè)樣本,讓它跑到直線正確的一側(cè)巾遭;如果直線分對(duì)了肉康,它就暫時(shí)停下不動(dòng)。因此訓(xùn)練神經(jīng)元的過(guò)程就是這條直線不斷在跳舞灼舍,最終跳到兩個(gè)類之間的豎直線位置吼和。
神經(jīng)網(wǎng)絡(luò):
神經(jīng)網(wǎng)絡(luò)簡(jiǎn)單點(diǎn)將就是由好多個(gè)神經(jīng)元組成的系統(tǒng)。
神經(jīng)元一個(gè)缺點(diǎn)是:它只能切一刀骑素!你給我說(shuō)說(shuō)一刀怎么能把下面這兩類分開(kāi)吧炫乓。
?解決辦法是多層神經(jīng)網(wǎng)絡(luò),底層神經(jīng)元的輸出是高層神經(jīng)元的輸入献丑。我們可以在中間橫著砍一刀末捣,豎著砍一刀,然后把左上和右下的部分合在一起创橄,與右上的左下部分分開(kāi)箩做;也可以圍著左上角的邊沿砍10刀把這一部分先挖出來(lái),然后和右下角合并妥畏。
每砍一刀邦邦,其實(shí)就是使用了一個(gè)神經(jīng)元,把不同砍下的半平面做交醉蚁、并等運(yùn)算燃辖,就是把這些神經(jīng)元的輸出當(dāng)作輸入,后面再連接一個(gè)神經(jīng)元网棍。這個(gè)例子中特征的形狀稱為異或黔龟,這種情況一個(gè)神經(jīng)元搞不定,但是兩層神經(jīng)元就能正確對(duì)其進(jìn)行分類。
只要你能砍足夠多刀氏身,把結(jié)果拼在一起巍棱,什么奇怪形狀的邊界神經(jīng)網(wǎng)絡(luò)都能夠表示,所以說(shuō)神經(jīng)網(wǎng)絡(luò)在理論上可以表示很復(fù)雜的函數(shù)/空間分布观谦。但是真實(shí)的神經(jīng)網(wǎng)絡(luò)是否能擺動(dòng)到正確的位置還要看網(wǎng)絡(luò)初始值設(shè)置拉盾、樣本容量和分布。
深度學(xué)習(xí):
那什么是深度學(xué)習(xí)呢豁状?深度學(xué)習(xí)簡(jiǎn)單點(diǎn)說(shuō)就是一種為了讓層數(shù)較多的多層神經(jīng)網(wǎng)絡(luò)可以訓(xùn)練捉偏,能夠運(yùn)行起來(lái)而演化出來(lái)的一系列的新的結(jié)構(gòu)和新的方法。
就像下圖
普通的神經(jīng)網(wǎng)絡(luò)可能只有幾層泻红,深度學(xué)習(xí)可以達(dá)到十幾層夭禽。深度學(xué)習(xí)中的深度二字也代表了神經(jīng)網(wǎng)絡(luò)的層數(shù)。現(xiàn)在流行的深度學(xué)習(xí)網(wǎng)絡(luò)結(jié)構(gòu)有"CNN(卷積神經(jīng)網(wǎng)絡(luò))谊路、RNN(循環(huán)神經(jīng)網(wǎng)絡(luò))讹躯、DNN(深度神經(jīng)網(wǎng)絡(luò))的等。
當(dāng)然我們是以實(shí)戰(zhàn)為主缠劝,可以直接使用現(xiàn)在市面上的一些現(xiàn)有深度學(xué)習(xí)框架潮梯,現(xiàn)在流行的深度學(xué)習(xí)框架有MXnet,tensorflow,caffe等,本文主要介紹MXnet這個(gè)開(kāi)源的優(yōu)秀深度學(xué)習(xí)框架惨恭。
0x01 安裝MXnet
這里我們安裝的是CPU版的MXnet秉馏,為什么不安裝GPU版?因?yàn)榕嫉腗acbook是AMD的卡啊脱羡,MXnet只支持CUDA
1.下載源碼
新建一個(gè)目錄萝究,到那個(gè)目錄下執(zhí)行
git clone --recursive https://github.com/dmlc/mxnet
2.編譯安裝
運(yùn)行setup-utils目錄下的install-mxnet-osx.sh腳本,中間要編譯些東西锉罐,要多等會(huì)帆竹,再輸入個(gè)密碼,就自動(dòng)編譯安裝完成啦脓规。
注意一下:
1.因?yàn)橐x取make目錄下的文件栽连,所以這里要在MXnet源碼的根目錄執(zhí)行安裝腳本~
比如在mxnet的源碼根目錄執(zhí)行
sh ./setup-utils/install-mxnet-osx.sh
2.以后運(yùn)行腳本可能需要一些python模塊,建議安裝下pip
mac下安裝的方法也很簡(jiǎn)單: sudo easy_install pip
0x02 樣例運(yùn)行
我們可以試著運(yùn)行下MXnet自帶的一些樣例侨舆,這里我們?cè)囅翹eural art這個(gè)樣例
Neural art是個(gè)讓機(jī)器模仿已有畫(huà)作的繪畫(huà)風(fēng)格來(lái)把一張照片重新繪畫(huà)的算法升酣。
比如我們輸入?和
最終生成?
1.首先打開(kāi)example/neural-style目錄,大部分樣例都是有README的态罪,大家在運(yùn)行之前可以先看看
這個(gè)樣例的README有說(shuō)
First use?
download.sh
to download pre-trained model and sample inputsThen run?
python nstyle.py
, use?-h
?to see more options
那我們就要運(yùn)行這個(gè)目錄下的download.sh
腳本會(huì)自動(dòng)下載訓(xùn)練模型vgg19.params到Model目錄,輸入的素材到input目錄
2.運(yùn)行Demo
因?yàn)槲覀冞\(yùn)行的是CPU版下面,所以要這么輸入
python nstyle.py --gpu -1 --max-num-epochs 150 --output_dir ~/Desktop/
--gpu:使用哪個(gè)一個(gè)GPU,-1代表使用CPU
--max-num-epochs:最大迭代次數(shù)复颈,這里我們迭代150次
--output_dir:結(jié)果輸出路徑
可能大家一次運(yùn)行不起來(lái),會(huì)出現(xiàn)No module named for xxx的提示,一般是相應(yīng)的python模塊沒(méi)有安裝耗啦,在google搜下No module named for xxx一般都能找到安裝方法凿菩,大部分都能通過(guò)pip安裝~
運(yùn)行結(jié)果
我們看下不同迭代次數(shù)時(shí)的結(jié)果是什么樣的
10次:??50次:?
?100次:?
?150次:?
?可以看出迭代次數(shù)越多效果越好~當(dāng)然由于深度學(xué)習(xí)是有很多層神經(jīng)網(wǎng)絡(luò)組成,需要的運(yùn)算量巨大帜讲,使用CPU即使是i7衅谷,150次迭代也需要好幾十分鐘了,有條件的看官可以嘗試使用GPU版似将,可以將時(shí)間縮短到幾分鐘获黔,甚至在云平臺(tái)上跑。
樣例的具體原理可以參考參考附錄的第二個(gè)鏈接在验。
參考附錄:
http://www.leiphone.com/news/201608/wh8osGY4vg28XlvM.html http://phunter.farbox.com/post/mxnet-tutorial2 https://zhuanlan.zhihu.com/p/20634163 http://www.cnblogs.com/peizhe123/p/4641149.html
直播推薦:
題圖:pexels玷氏,CC0 授權(quán)。
點(diǎn)擊閱讀原文腋舌,查看更多 Python 教程和資源盏触。
閱讀原文:http://mp.weixin.qq.com/s?__biz=MzAwNDc0MTUxMw==&mid=2649640089&idx=1&sn=e0d5cc3be458f7398f4bfefef5934b18&scene=0#wechat_redirect