深度學習入門實戰(一):像Prisma同樣算法生成梵高風格畫像

本文由雲+社區發表

做者:董超javascript

導語:如今人工智能是個大熱點,而人工智能離不開機器學習,機器學習中深度學習又是比較熱門的方向,本系列文章就從實戰出發,介紹下如何使用MXnet進行深度學習~ 既然是實戰並且本文是入門級別的咱們就不講那麼多你們都聽不懂的數學公式啦~html

0x00 深度學習簡介

雖然吧,咱們不講哪些深奧的數學原理,可是基本的原理仍是要掌握下的~java

在介紹深度學習以前咱們要先了解兩個概念,機器學習和神經網絡。python

機器學習:

在介紹深度學習以前,咱們先簡單介紹下機器學習,咱們引用下維基百科上機器學習的定義:git

機器學習是人工智能的一個分支。人工智能的研究是從以「推理」爲重點到以「知識」爲重點,再到以「學習」爲重點,一條天然、清晰的脈絡。顯然,機器學習是實現人工智能的一個途徑,即以機器學習爲手段解決人工智能中的問題。機器學習在近30多年已發展爲一門多領域交叉學科,涉及機率論、統計學、逼近論、凸分析、計算複雜性理論等多門學科。github

機器學習理論主要是設計和分析一些讓計算機能夠自動「學習」的算法。機器學習算法是一類從數據中自動分析得到規律,並利用規律對未知數據進行預測的算法。由於學習算法中涉及了大量的統計學理論,機器學習與推斷統計學聯繫尤其密切,也被稱爲統計學習理論。算法設計方面,機器學習理論關注能夠實現的,行之有效的學習算法。不少推論問題屬於無程序可循難度,因此部分的機器學習研究是開發容易處理的近似算法。算法

簡單的說機器學習就是讓機器去分析數據找規律,並經過找到的規律對新的數據進行處理。網絡

神經網絡:

神經元:

img

以圖像爲例子,每一個數據或者輸入就是一張圖片,而裏面的每一個x能夠是圖片中的每一個像素。對於每一個像素咱們都賦予一個權重,而後通過轉換函數(Transfer Function, 這裏是線性疊加)獲得一個數值。簡單來講,咱們對全部像素作個線性加權疊加。獲得的數值會通過激活函數獲得新的數值。這個激活函數(Activation Function)每每是那幾個符合某些特性的非線性函數。爲何須要非線性的轉換呢?舉個簡單的例子,在同一個平面你和你的影子是重疊是分不開的,在立體的空間大家卻能分開了。非線性的轉換有相似的做用。經常使用的激活函數有relu, softmax, tanh。框架

簡單的說一個神經元是一個簡單的分類器,你輸入一個iphone

好比咱們有一大堆貓、狗照片,把每一張照片送進一個機器裏,機器須要判斷這幅照片裏的東西是貓仍是狗。咱們把貓狗圖片處理一下,左邊是狗的特徵向量,右邊是貓的

img

你們想一想,最簡單地把這兩組特徵向量分開的方法是啥?固然是在兩組數據中間畫一條豎直線,直線左邊是狗,右邊是貓,分類器就完成了。之後來了新的向量,凡是落在直線左邊的都是狗,落在右邊的都是貓。

一條直線把平面一分爲二,一個平面把三維空間一分爲二,一個n-1維超平面把n維空間一分爲二,兩邊分屬不一樣的兩類,這種分類器就叫作神經元。

固然,上面那幅圖咱們是開了上帝視角才知道「一條豎直線能分開兩類」,在實際訓練神經元時,咱們並不知道特徵是怎麼抱團的。神經元模型的一種學習方法稱爲Hebb算法:

先隨機選一條直線/平面/超平面,而後把樣本一個個拿過來,若是這條直線分錯了,說明這個點分錯邊了,就稍微把直線移動一點,讓它靠近這個樣本,爭取跨過這個樣本,讓它跑到直線正確的一側;若是直線分對了,它就暫時停下不動。所以訓練神經元的過程就是這條直線不斷在跳舞,最終跳到兩個類之間的豎直線位置。

神經網絡:

神經網絡簡單點將就是由好多個神經元組成的系統。

神經元一個缺點是:它只能切一刀!你給我說說一刀怎麼能把下面這兩類分開吧。

img

解決辦法是多層神經網絡,底層神經元的輸出是高層神經元的輸入。咱們能夠在中間橫着砍一刀,豎着砍一刀,而後把左上和右下的部分合在一塊兒,與右上的左下部分分開;也能夠圍着左上角的邊沿砍10刀把這一部分先挖出來,而後和右下角合併。

每砍一刀,其實就是使用了一個神經元,把不一樣砍下的半平面作交、並等運算,就是把這些神經元的輸出看成輸入,後面再鏈接一個神經元。這個例子中特徵的形狀稱爲異或,這種狀況一個神經元搞不定,可是兩層神經元就能正確對其進行分類。

只要你能砍足夠多刀,把結果拼在一塊兒,什麼奇怪形狀的邊界神經網絡都可以表示,因此說神經網絡在理論上能夠表示很複雜的函數/空間分佈。可是真實的神經網絡是否能擺動到正確的位置還要看網絡初始值設置、樣本容量和分佈。

深度學習:

那什麼是深度學習呢?深度學習簡單點說就是一種爲了讓層數較多的多層神經網絡能夠訓練,可以運行起來而演化出來的一系列的新的結構和新的方法。

就像下圖

img

普通的神經網絡可能只有幾層,深度學習能夠達到十幾層。深度學習中的深度二字也表明了神經網絡的層數。如今流行的深度學習網絡結構有"CNN(卷積神經網絡)、RNN(循環神經網絡)、DNN(深度神經網絡)的等。

固然咱們是以實戰爲主,能夠直接使用如今市面上的一些現有深度學習框架,如今流行的深度學習框架有MXnet,tensorflow,caffe等,本文主要介紹MXnet這個開源的優秀深度學習框架。

0x01 安裝MXnet

這裏咱們安裝的是CPU版的MXnet,爲何不安裝GPU版?由於偶的Macbook是AMD的卡啊,MXnet只支持CUDA

1.下載源碼

新建一個目錄,到那個目錄下執行

git clone --recursive https://github.com/dmlc/mxnet

2.編譯安裝

運行setup-utils目錄下的install-mxnet-osx.sh腳本,中間要編譯些東西,要多等會,再輸入個密碼,就自動編譯安裝完成啦。

注意一下:

1.由於要讀取make目錄下的文件,因此這裏要在MXnet源碼的根目錄執行安裝腳本~

好比在mxnet的源碼根目錄執行

sh ./setup-utils/install-mxnet-osx.sh

2.之後運行腳本可能須要一些python模塊,建議安裝下pip

mac下安裝的方法也很簡單: sudo easy_install pip

0x02 樣例運行

咱們能夠試着運行下MXnet自帶的一些樣例,這裏咱們試下Neural art這個樣例

Neural art是個讓機器模仿已有畫做的繪畫風格來把一張照片從新繪畫的算法。

好比咱們輸入

img

img

最終生成

img

1.首先打開example/neural-style目錄,大部分樣例都是有README的,你們在運行以前能夠先看看

這個樣例的README有說

First use download.shto download pre-trained model and sample inputs Then run python nstyle.py, use -h to see more options

那咱們就要運行這個目錄下的download.sh

腳本會自動下載訓練模型vgg19.params到Model目錄,輸入的素材到input目錄

2.運行Demo

由於咱們運行的是CPU版,因此要這麼輸入

python nstyle.py --gpu -1 --max-num-epochs 150 --output_dir ~/Desktop/

--gpu:使用哪一個一個GPU,-1表明使用CPU

--max-num-epochs:最大迭代次數,這裏咱們迭代150次

--output_dir:結果輸出路徑

可能你們一次運行不起來,會出現No module named for xxx的提示,通常是相應的python模塊沒有安裝,在google搜下No module named for xxx通常都能找到安裝方法,大部分都能經過pip安裝~

運行結果

咱們看下不一樣迭代次數時的結果是什麼樣的

10次:

img

50次:

img

100次:

img

150次:

img

能夠看出迭代次數越多效果越好~固然因爲深度學習是有不少層神經網絡組成,須要的運算量巨大,使用CPU即便是i7,150次迭代也須要好幾十分鐘了,有條件的看官能夠嘗試使用GPU版,能夠將時間縮短到幾分鐘,甚至在雲平臺上跑。

樣例的具體原理能夠參考參考附錄的第二個連接。

參考附錄:

http://www.leiphone.com/news/...

此文已由做者受權騰訊雲+社區在各渠道發佈

獲取更多新鮮技術乾貨,能夠關注咱們騰訊雲技術社區-雲加社區官方號及知乎機構號

相關文章
相關標籤/搜索