偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

擺好正確姿勢(shì) 看 Google 神級(jí)深度學(xué)習(xí)框架 TensorFlow 的實(shí)踐思路

原創(chuàng)
人工智能 深度學(xué)習(xí) 開(kāi)發(fā)工具 移動(dòng)開(kāi)發(fā)
作為Goolge二代DL框架,使用數(shù)據(jù)流圖的形式進(jìn)行計(jì)算的TensorFlow已經(jīng)成為了機(jī)器學(xué)習(xí)、深度學(xué)習(xí)領(lǐng)域中最受歡迎的框架之一。自從發(fā)布以來(lái),TensorFlow不斷在完善并增加新功能,并在今年的2月26號(hào)在Mountain View舉辦的首屆年度TensorFlow開(kāi)發(fā)者峰會(huì)上正式發(fā)布了TensorFlow 1.0版本,其最大的亮點(diǎn)就是通過(guò)優(yōu)化模型達(dá)到最快的速度,且快到令人難以置信,更讓人想不到的是很多擁護(hù)者用TensorFlow 1.0的發(fā)布來(lái)定義AI的元年。

在2015年11月9號(hào)Google發(fā)布了人工智能系統(tǒng)TensorFlow并宣布開(kāi)源,此舉在深度學(xué)習(xí)領(lǐng)域影響巨大,也受到大量的深度學(xué)習(xí)開(kāi)發(fā)者極大的關(guān)注。當(dāng)然,對(duì)于人工智能這個(gè)領(lǐng)域,依然有不少質(zhì)疑的聲音,但不可否認(rèn)的是人工智能仍然是未來(lái)發(fā)展的趨勢(shì)。

而TensorFlow能夠在登陸GitHub的當(dāng)天就成為最受關(guān)注的項(xiàng)目,作為構(gòu)建深度學(xué)習(xí)模型的最佳方式、深度學(xué)習(xí)框架的領(lǐng)頭者,在發(fā)布當(dāng)周輕松獲得超過(guò)1萬(wàn)個(gè)星數(shù)評(píng)級(jí),這主要是因?yàn)镚oogle在人工智能領(lǐng)域的研發(fā)成績(jī)斐然和神級(jí)的技術(shù)人才儲(chǔ)備。當(dāng)然還有一點(diǎn)是在圍棋上第一次打敗人類,然后升級(jí)版Master保持連續(xù)60盤不敗的AlphaGo,其強(qiáng)化學(xué)習(xí)的框架也是基于TensorFlow的高級(jí)API實(shí)現(xiàn)的。

 

TensorFlow: 為什么是它?


作為Goolge二代DL框架,使用數(shù)據(jù)流圖的形式進(jìn)行計(jì)算的TensorFlow已經(jīng)成為了機(jī)器學(xué)習(xí)、深度學(xué)習(xí)領(lǐng)域中最受歡迎的框架之一。自從發(fā)布以來(lái),TensorFlow不斷在完善并增加新功能,并在今年的2月26號(hào)在Mountain View舉辦的首屆年度TensorFlow開(kāi)發(fā)者峰會(huì)上正式發(fā)布了TensorFlow 1.0版本,其最大的亮點(diǎn)就是通過(guò)優(yōu)化模型達(dá)到最快的速度,且快到令人難以置信,更讓人想不到的是很多擁護(hù)者用TensorFlow 1.0的發(fā)布來(lái)定義AI的元年。


通過(guò)以上Google指數(shù),深度學(xué)習(xí)占據(jù)目前流程技術(shù)的第一位

TensorFlow在過(guò)去獲得成績(jī)主要有以下幾點(diǎn):

  • TensorFlow被應(yīng)用在Google很多的應(yīng)用包括:Gmail, Google Play Recommendation, Search, Translate, Map等等;
  • 在醫(yī)療方面,TensorFlow被科學(xué)家用來(lái)搭建根據(jù)視網(wǎng)膜來(lái)預(yù)防糖尿病致盲(后面也提到Stanford的PHD使用TensorFlow來(lái)預(yù)測(cè)皮膚癌,相關(guān)工作上了Nature封面);
  • 通過(guò)在音樂(lè)、繪畫這塊的領(lǐng)域使用TensorFlow構(gòu)建深度學(xué)習(xí)模型來(lái)幫助人類更好地理解藝術(shù);
  • 使用TensorFlow框架和高科技設(shè)備,構(gòu)建自動(dòng)化的海洋生物檢測(cè)系統(tǒng),用來(lái)幫助科學(xué)家了解海洋生物的情況;
  • TensorFlow在移動(dòng)客戶端發(fā)力,有多款在移動(dòng)設(shè)備上使用TensorFlow做翻譯、風(fēng)格化等工作;
  • TensorFlow在移動(dòng)設(shè)備CPU(高通820)上,能夠達(dá)到更高的性能和更低的功耗;
  • TensorFlow ecosystem結(jié)合其他開(kāi)源項(xiàng)目能夠快速地搭建高性能的生產(chǎn)環(huán)境;
  • TensorBoard Embedded vector可視化工作
  • 能夠幫助PHD/科研工作者快速開(kāi)展project研究工作。

Google第一代分布式機(jī)器學(xué)習(xí)框架DistBelief不再滿足Google內(nèi)部的需求,Google的小伙伴們?cè)贒istBelief基礎(chǔ)上做了重新設(shè)計(jì),引入各種計(jì)算設(shè)備的支持包括CPU/GPU/TPU,以及能夠很好地運(yùn)行在移動(dòng)端,如安卓設(shè)備、ios、樹(shù)莓派 等等,支持多種不同的語(yǔ)言(因?yàn)楦鞣Nhigh-level的api,訓(xùn)練僅支持Python,inference支持包括C++,Go,Java等等),另外包括像TensorBoard這類很棒的工具,能夠有效地提高深度學(xué)習(xí)研究工作者的效率。

TensorFlow在Google內(nèi)部項(xiàng)目應(yīng)用的增長(zhǎng)也十分迅速:在Google多個(gè)產(chǎn)品都有應(yīng)用如:Gmail,Google Play Recommendation, Search, Translate, Map等等;有將近100多project和paper使用TensorFlow做相關(guān)工作。

TensorFlow在正式版發(fā)布前的過(guò)去14個(gè)月的時(shí)間內(nèi)也獲得了很多的成績(jī),包括475+非Google的Contributors,14000+次commit,超過(guò)5500標(biāo)題中出現(xiàn)過(guò)TensorFlow的github project以及在Stack Overflow上有包括5000+個(gè)已被回答 的問(wèn)題,平均每周80+的issue提交,且被一些頂尖的學(xué)術(shù)研究項(xiàng)目使用: – Neural Machine Translation – Neural Architecture Search – Show and Tell.

當(dāng)然了,說(shuō)到底深度學(xué)習(xí)就是用非監(jiān)督式或者半監(jiān)督式的特征學(xué)習(xí),分層特征提取高校算法來(lái)替代手工獲取特征。目前研究人員和從事深度學(xué)習(xí)的開(kāi)發(fā)者使用深度學(xué)習(xí)框架也并非只有TensorFlow一個(gè),同樣也有很多在視覺(jué)、語(yǔ)言、自然語(yǔ)言處理和生物信息等領(lǐng)域較為優(yōu)秀的框架,比如Torch、Caffe、Theano、Deeplearning4j等。

下面,編者整理段石石博文中的一些對(duì)網(wǎng)絡(luò)神經(jīng)模型、算法深度分析的內(nèi)容,了解TensorFlow這個(gè)開(kāi)源深度學(xué)習(xí)框架的強(qiáng)大之處。

 

深入理解Neural Style


這篇文章主要針對(duì)Tensorflow利用CNN的方法對(duì)藝術(shù)照片做下Neural Style的相關(guān)工作。首先,作者會(huì)詳細(xì)解釋下A Neural Algorithm of Artistic Style這篇paper是怎么做的,然后會(huì)結(jié)合一個(gè)開(kāi)源的Tensorflow的Neural Style版本來(lái)領(lǐng)略下大神的風(fēng)采。

A Neural Algorithm of Artistic Style

在藝術(shù)領(lǐng)域,尤其是繪畫,藝術(shù)家們通過(guò)創(chuàng)造不同的內(nèi)容與風(fēng)格,并相互交融影響來(lái)創(chuàng)立獨(dú)立的視覺(jué)體驗(yàn)。如果給定兩張圖像,現(xiàn)在的技術(shù)手段,完全有能力讓計(jì)算機(jī)識(shí)別出圖像具體內(nèi)容。而風(fēng)格是一種很抽象的東西,在計(jì)算機(jī)的眼中,當(dāng)然就是一些pixel,但人眼就能很有效地的辨別出不同畫家不同的style,是否有一些更復(fù)雜的feature來(lái)構(gòu)成,最開(kāi)始學(xué)習(xí)DeepLearning的paper時(shí),多層網(wǎng)絡(luò)的實(shí)質(zhì)其實(shí)就是找出更復(fù)雜、更內(nèi)在的features,所以圖像的style理論上可以通過(guò)多層網(wǎng)絡(luò)來(lái)提取里面可能一些有意思的東西。而這篇文章就是利用卷積神經(jīng)網(wǎng)絡(luò)(利用pretrain的Pre-trained VGG network model)來(lái)分別做Content、Style的reconstruction,在合成時(shí)考慮content loss 與style loss的最小化(其實(shí)還包括去噪變化的的loss),這樣合成出來(lái)的圖像會(huì)保證在content 和style的重構(gòu)上更準(zhǔn)確。


這里是整個(gè)paper在neural style的工作流,理解這幅圖對(duì)理解整篇paper的邏輯很關(guān)鍵,主要分為兩部分:

  • Content Reconstruction: 上圖中下面部分是Content Reconstruction對(duì)應(yīng)于CNN中的a,b,c,d,e層,注意最開(kāi)始標(biāo)了Content Representations的部分不是原始圖片(可以理解是給計(jì)算機(jī)比如分類器看的圖片,因此如果可視化它,可能完全就不知道是什么內(nèi)容),而是經(jīng)過(guò)了Pre-trained之后的VGG network model的圖像數(shù)據(jù), 該model主要用來(lái)做object recognition, 這里主要用來(lái)生成圖像的Content Representations。理解了這里,后面就比較容易了,經(jīng)過(guò)五層卷積網(wǎng)絡(luò)來(lái)做Content的重構(gòu),文章作者實(shí)驗(yàn)發(fā)現(xiàn)在前3層的Content Reconstruction效果比較好,d,e兩層丟失了部分細(xì)節(jié)信息,保留了比較high-level的信息。

  • Style Reconstruction: Style的重構(gòu)比較復(fù)雜,很難去模型化Style這個(gè)東西,Style Represention的生成也是和Content Representation的生成類似,也是由VGG network model去做的,不同點(diǎn)在于a,b,c,d,e的處理方式不同,Style Represention的Reconstruction是在CNN的不同的子集上來(lái)計(jì)算的,怎么說(shuō)呢,它會(huì)分別構(gòu)造conv1_1(a),[conv1_1, conv2_1](b),[conv1_1, conv2_1, conv3_1],[conv1_1, conv2_1, conv3_1,conv4_1],[conv1_1, conv2_1, conv3_1, conv4_1, conv5_1]。這樣重構(gòu)的Style 會(huì)在各個(gè)不同的尺度上更加匹配圖像本身的style,忽略場(chǎng)景的全局信息。

methods

理解了以上兩點(diǎn),剩下的就是建模的數(shù)據(jù)問(wèn)題了,這里按Content和Style來(lái)分別計(jì)算loss,Content loss的method比較簡(jiǎn)單:

其中F^l是產(chǎn)生的Content Representation在第l層的數(shù)據(jù)表示,P^l是原始圖片在第l層的數(shù)據(jù)表示,定義squared-error loss為兩種特征表示的error。

Style的loss基本也和Content loss一樣,只不過(guò)要包含每一層輸出的errors之和

其中A^l 是原始style圖片在第l的數(shù)據(jù)表示,而G^l是產(chǎn)生的Style Representation在第l層的表示

定義好loss之后就是采用優(yōu)化方法來(lái)最小化模型loss(注意paper當(dāng)中只有content loss和style loss),源碼當(dāng)中還涉及到降噪的loss:

優(yōu)化方法這里就不講了,tensorflow有內(nèi)置的如Adam這樣的方法來(lái)處理。

 

深入理解AlexNet


前面看了一些Tensorflow的文檔和一些比較有意思的項(xiàng)目,發(fā)現(xiàn)這里面水很深的,需要多花時(shí)間好好從頭了解下,尤其是cv這塊的東西,特別感興趣,接下來(lái)一段時(shí)間會(huì)開(kāi)始深入了解ImageNet比賽中中獲得好成績(jī)的那些模型: AlexNet、GoogLeNet、VGG(對(duì)就是之前在nerual network用的pretrained的model)、deep residual networks。

ImageNet Classification with Deep Convolutional Neural Networks

ImageNet Classification with Deep Convolutional Neural Networks 是Hinton和他的學(xué)生Alex Krizhevsky在12年ImageNet Challenge使用的模型結(jié)構(gòu),刷新了Image Classification的幾率,從此deep learning在Image這塊開(kāi)始一次次超過(guò)state-of-art,甚至于搭到打敗人類的地步,看這邊文章的過(guò)程中,發(fā)現(xiàn)了很多以前零零散散看到的一些優(yōu)化技術(shù),但是很多沒(méi)有深入了解,這篇文章講解了他們alexnet如何做到能達(dá)到那么好的成績(jī),好的廢話不多說(shuō),來(lái)開(kāi)始看文章:

這張圖是基本的caffe中alexnet的網(wǎng)絡(luò)結(jié)構(gòu),這里比較抽象,作者用caffe的draw_net把a(bǔ)lexnet的網(wǎng)絡(luò)結(jié)構(gòu)畫出來(lái)了:

 

AlexNet的基本結(jié)構(gòu)

alexnet總共包括8層,其中前5層convolutional,后面3層是full-connected,文章里面說(shuō)的是減少任何一個(gè)卷積結(jié)果會(huì)變得很差,下面具體講講每一層的構(gòu)成:

  • 第一層卷積層 輸入圖像為227*227*3(paper上貌似有點(diǎn)問(wèn)題224*224*3)的圖像,使用了96個(gè)kernels(96,11,11,3),以4個(gè)pixel為一個(gè)單位來(lái)右移或者下移,能夠產(chǎn)生5555個(gè)卷積后的矩形框值,然后進(jìn)行response-normalized(其實(shí)是Local Response Normalized,后面我會(huì)講下這里)和pooled之后,pool這一層好像caffe里面的alexnet和paper里面不太一樣,alexnet里面采樣了兩個(gè)GPU,所以從圖上面看第一層卷積層厚度有兩部分,池化pool_size=(3,3),滑動(dòng)步長(zhǎng)為2個(gè)pixels,得到96個(gè)2727個(gè)feature。
  • 第二層卷積層使用256個(gè)(同樣,分布在兩個(gè)GPU上,每個(gè)128kernels(5*5*48)),做pad_size(2,2)的處理,以1個(gè)pixel為單位移動(dòng)(感謝網(wǎng)友指出),能夠產(chǎn)生27*27個(gè)卷積后的矩陣框,做LRN處理,然后pooled,池化以3*3矩形框,2個(gè)pixel為步長(zhǎng),得到256個(gè)13*13個(gè)features。
  • 第三層、第四層都沒(méi)有LRN和pool,第五層只有pool,其中第三層使用384個(gè)kernels(3*3*384,pad_size=(1,1),得到384*15*15,kernel_size為(3,3),以1個(gè)pixel為步長(zhǎng),得到384*13*13);第四層使用384個(gè)kernels(pad_size(1,1)得到384*15*15,核大小為(3,3)步長(zhǎng)為1個(gè)pixel,得到384*13*13);第五層使用256個(gè)kernels(pad_size(1,1)得到384*15*15,kernel_size(3,3),得到256*13*13,pool_size(3,3)步長(zhǎng)2個(gè)pixels,得到256*6*6)。
  • 全連接層: 前兩層分別有4096個(gè)神經(jīng)元,最后輸出softmax為1000個(gè)(ImageNet),注意caffe圖中全連接層中有relu、dropout、innerProduct。

paper里面也指出了這張圖是在兩個(gè)GPU下做的,其中和caffe里面的alexnet可能還真有點(diǎn)差異,但這可能不是重點(diǎn),各位在使用的時(shí)候,直接參考caffe中的alexnet的網(wǎng)絡(luò)結(jié)果,每一層都十分詳細(xì),基本的結(jié)構(gòu)理解和上面是一致的。

AlexNet為啥取得比較好的結(jié)果

前面講了下AlexNet的基本網(wǎng)絡(luò)結(jié)構(gòu),大家肯定會(huì)對(duì)其中的一些點(diǎn)產(chǎn)生疑問(wèn),比如LRN、Relu、dropout, 相信接觸過(guò)dl的小伙伴們都有聽(tīng)說(shuō)或者了解過(guò)這些。這里按paper中的描述詳細(xì)講述這些東西為什么能提高最終網(wǎng)絡(luò)的性能。

ReLU Nonlinearity

一般來(lái)說(shuō),剛接觸神經(jīng)網(wǎng)絡(luò)還沒(méi)有深入了解深度學(xué)習(xí)的小伙伴們對(duì)這個(gè)都不會(huì)太熟,一般都會(huì)更了解另外兩個(gè)激活函數(shù)(真正往神經(jīng)網(wǎng)絡(luò)中引入非線性關(guān)系,使神經(jīng)網(wǎng)絡(luò)能夠有效擬合非線性函數(shù))tanh(x)和(1+e^(-x))^(-1),而ReLU(Rectified Linear Units) f(x)=max(0,x)?;赗eLU的深度卷積網(wǎng)絡(luò)比基于tanh的網(wǎng)絡(luò)訓(xùn)練塊數(shù)倍,下圖是一個(gè)基于CIFAR-10的四層卷積網(wǎng)絡(luò)在tanh和ReLU達(dá)到25%的training error的迭代次數(shù):

實(shí)線、間斷線分別代表的是ReLU、tanh的training error,可見(jiàn)ReLU比tanh能夠更快的收斂

Local Response Normalization

使用ReLU f(x)=max(0,x)后,你會(huì)發(fā)現(xiàn)激活函數(shù)之后的值沒(méi)有了tanh、sigmoid函數(shù)那樣有一個(gè)值域區(qū)間,所以一般在ReLU之后會(huì)做一個(gè)normalization,LRU就是文中提出(這里不確定,應(yīng)該是提出?)一種方法,在神經(jīng)科學(xué)中有個(gè)概念叫“Lateral inhibition”,講的是活躍的神經(jīng)元對(duì)它周邊神經(jīng)元的影響。

Dropout

Dropout也是經(jīng)常挺說(shuō)的一個(gè)概念,能夠比較有效地防止神經(jīng)網(wǎng)絡(luò)的過(guò)擬合。 相對(duì)于一般如線性模型使用正則的方法來(lái)防止模型過(guò)擬合,而在神經(jīng)網(wǎng)絡(luò)中Dropout通過(guò)修改神經(jīng)網(wǎng)絡(luò)本身結(jié)構(gòu)來(lái)實(shí)現(xiàn)。對(duì)于某一層神經(jīng)元,通過(guò)定義的概率來(lái)隨機(jī)刪除一些神經(jīng)元,同時(shí)保持輸入層與輸出層神經(jīng)元的個(gè)人不變,然后按照神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)方法進(jìn)行參數(shù)更新,下一次迭代中,重新隨機(jī)刪除一些神經(jīng)元,直至訓(xùn)練結(jié)束 

 

Data Augmentation

其實(shí),最簡(jiǎn)單的增強(qiáng)模型性能,防止模型過(guò)擬合的方法是增加數(shù)據(jù),但是其實(shí)增加數(shù)據(jù)也是有策略的,paper當(dāng)中從256*256中隨機(jī)提出227*227的patches(paper里面是224*224),還有就是通過(guò)PCA來(lái)擴(kuò)展數(shù)據(jù)集。這樣就很有效地?cái)U(kuò)展了數(shù)據(jù)集,其實(shí)還有更多的方法視你的業(yè)務(wù)場(chǎng)景去使用,比如做基本的圖像轉(zhuǎn)換如增加減少亮度,一些濾光算法等等之類的,這是一種特別有效地手段,尤其是當(dāng)數(shù)據(jù)量不夠大的時(shí)候。

 

深度理解GoogLeNet


GoogLeNet是ILSVRC 2014的冠軍,主要是致敬經(jīng)典的LeNet-5算法,主要是Google的team成員完成,paper見(jiàn)Going Deeper with Convolutions.相關(guān)工作主要包括LeNet-5、Gabor filters、Network-in-Network.Network-in-Network改進(jìn)了傳統(tǒng)的CNN網(wǎng)絡(luò),采用少量的參數(shù)就輕松地?fù)魯×薃lexNet網(wǎng)絡(luò),使用Network-in-Network的模型最后大小約為29MNetwork-in-Network caffe model.GoogLeNet借鑒了Network-in-Network的思想,下面會(huì)詳細(xì)講述下。

1) Network-in-Network

左邊是CNN的線性卷積層,一般來(lái)說(shuō)線性卷積層用來(lái)提取線性可分的特征,但所提取的特征高度非線性時(shí),需要更加多的filters來(lái)提取各種潛在的特征,這樣就存在一個(gè)問(wèn)題,filters太多,導(dǎo)致網(wǎng)絡(luò)參數(shù)太多,網(wǎng)絡(luò)過(guò)于復(fù)雜對(duì)于計(jì)算壓力太大。

文章主要從兩個(gè)方法來(lái)做了一些改良:

1,卷積層的改進(jìn):MLPconv,在每個(gè)local部分進(jìn)行比傳統(tǒng)卷積層復(fù)雜的計(jì)算,如上圖右,提高每一層卷積層對(duì)于復(fù)雜特征的識(shí)別能力,這里舉個(gè)不恰當(dāng)?shù)睦樱瑐鹘y(tǒng)的CNN網(wǎng)絡(luò),每一層的卷積層相當(dāng)于一個(gè)只會(huì)做單一任務(wù),你必須要增加海量的filters來(lái)達(dá)到完成特定量類型的任務(wù),而MLPconv的每層conv有更加大的能力,每一層能夠做多種不同類型的任務(wù),在選擇filters時(shí)只需要很少量的部分;
2,采用全局均值池化來(lái)解決傳統(tǒng)CNN網(wǎng)絡(luò)中最后全連接層參數(shù)過(guò)于復(fù)雜的特點(diǎn),而且全連接會(huì)造成網(wǎng)絡(luò)的泛化能力差,Alexnet中有提高使用dropout來(lái)提高網(wǎng)絡(luò)的泛化能力。

最后作者設(shè)計(jì)了一個(gè)4層的Network-in-network+全局均值池化層來(lái)做imagenet的分類問(wèn)題。

  1. class NiN(Network): 
  2.     def setup(self): 
  3.         (self.feed('data'
  4.              .conv(11119644, padding='VALID', name='conv1'
  5.              .conv(119611, name='cccp1'
  6.              .conv(119611, name='cccp2'
  7.              .max_pool(3322, name='pool1'
  8.              .conv(5525611, name='conv2'
  9.              .conv(1125611, name='cccp3'
  10.              .conv(1125611, name='cccp4'
  11.              .max_pool(3322, padding='VALID', name='pool2'
  12.              .conv(3338411, name='conv3'
  13.              .conv(1138411, name='cccp5'
  14.              .conv(1138411, name='cccp6'
  15.              .max_pool(3322, padding='VALID', name='pool3'
  16.              .conv(33102411, name='conv4-1024'
  17.              .conv(11102411, name='cccp7-1024'
  18.              .conv(11100011, name='cccp8-1024'
  19.              .avg_pool(6611, padding='VALID', name='pool4'
  20.              .softmax(name='prob')) 

網(wǎng)絡(luò)基本結(jié)果如上,代碼見(jiàn)https://github.com/ethereon/caffe-tensorflow. 這里因?yàn)樽髡咦罱ぷ髯儎?dòng)的問(wèn)題,沒(méi)有了機(jī)器來(lái)跑一篇,也無(wú)法畫下基本的網(wǎng)絡(luò)結(jié)構(gòu)圖,之后會(huì)補(bǔ)上。這里指的提出的是中間cccp1和ccp2(cross channel pooling)等價(jià)于1*1kernel大小的卷積層。caffe中NIN的實(shí)現(xiàn)(略,請(qǐng)前往原文閱讀)

NIN的提出其實(shí)也可以認(rèn)為我們加深了網(wǎng)絡(luò)的深度,通過(guò)加深網(wǎng)絡(luò)深度(增加單個(gè)NIN的特征表示能力)以及將原先全連接層變?yōu)閍ver_pool層,大大減少了原先需要的filters數(shù),減少了model的參數(shù)。paper中實(shí)驗(yàn)證明達(dá)到Alexnet相同的性能,最終model大小僅為29M。

理解NIN之后,再來(lái)看GoogLeNet就不會(huì)有不明所理的感覺(jué)。

痛點(diǎn):

  • 越大的CNN網(wǎng)絡(luò),有更大的model參數(shù),也需要更多的計(jì)算力支持,并且由于模型過(guò)于復(fù)雜會(huì)過(guò)擬合;
  • 在CNN中,網(wǎng)絡(luò)的層數(shù)的增加會(huì)伴隨著需求計(jì)算資源的增加;
  • 稀疏的network是可以接受,但是稀疏的數(shù)據(jù)結(jié)構(gòu)通常在計(jì)算時(shí)效率很低

Inception module

Inception module的提出主要考慮多個(gè)不同size的卷積核能夠hold圖像當(dāng)中不同cluster的信息,為方便計(jì)算,paper中分別使用1*1,3*3,5*5,同時(shí)加入3*3 max pooling模塊。 然而這里存在一個(gè)很大的計(jì)算隱患,每一層Inception module的輸出的filters將是分支所有filters數(shù)量的綜合,經(jīng)過(guò)多層之后,最終model的數(shù)量將會(huì)變得巨大,naive的inception會(huì)對(duì)計(jì)算資源有更大的依賴。 前面有提到Network-in-Network模型,1*1的模型能夠有效進(jìn)行降維(使用更少的來(lái)表達(dá)盡可能多的信息),所以文章提出了”Inception module with dimension reduction”,在不損失模型特征表示能力的前提下,盡量減少filters的數(shù)量,達(dá)到減少model復(fù)雜度的目的。

Overall of GoogLeNet

在tensorflow構(gòu)造GoogLeNet基本的代碼在https://github.com/ethereon/caffe-tensorflow中(如果懶得找,原文有展示),作者封裝了一些基本的操作,了解網(wǎng)絡(luò)結(jié)構(gòu)之后,構(gòu)造GoogLeNet很容易。之后等到新公司之后,作者會(huì)試著在tflearn的基礎(chǔ)上寫下GoogLeNet的網(wǎng)絡(luò)代碼。

GoogLeNet on Tensorflow

GoogLeNet為了實(shí)現(xiàn)方便,作者用tflearn來(lái)重寫了下,代碼中和caffe model里面不一樣的就是一些padding的位置,因?yàn)楦牡谋容^麻煩,必須保持inception部分的concat時(shí)要一致,這里也不知道怎么修改pad的值(caffe prototxt),所以統(tǒng)一padding設(shè)定為same,具體代碼(略,原文有展示)

大家如果感興趣,可以看看這部分的caffe model prototxt, 幫忙檢查下是否有問(wèn)題,代碼作者已經(jīng)提交到tflearn的官方庫(kù)了,add GoogLeNet(Inception) in Example,各位有tensorflow的直接安裝下tflearn,看看是否能幫忙檢查下是否有問(wèn)題,這里因?yàn)闆](méi)有GPU的機(jī)器,跑的比較慢,TensorBoard的圖如下,不像之前Alexnet那么明顯(主要還是沒(méi)有跑那么多epoch,這里在寫入的時(shí)候發(fā)現(xiàn)主機(jī)上沒(méi)有磁盤空間了,尷尬,然后從新寫了restore來(lái)跑的,TensorBoard的圖也貌似除了點(diǎn)問(wèn)題, 好像每次載入都不太一樣,但是從基本的log里面的東西來(lái)看,是逐步在收斂的,這里圖也貼下看看吧)

網(wǎng)絡(luò)結(jié)構(gòu),這里有個(gè)bug,可能是TensorBoard的,googlenet的graph可能是太大,大概是1.3m,在chrome上無(wú)法下載,試了火狐貌似可以了:

深入理解VGG\Residual Network


 這段時(shí)間到了新公司,工作上開(kāi)始研究DeepLearning以及TensorFlow,挺忙了,前段時(shí)間看了VGG和deep residual的paper,一直沒(méi)有時(shí)間寫,今天準(zhǔn)備好好把這兩篇相關(guān)的paper重讀下。

VGGnet

VGGnet是Oxford的Visual Geometry Group的team,在ILSVRC 2014上的相關(guān)工作,主要工作是證明了增加網(wǎng)絡(luò)的深度能夠在一定程度上影響網(wǎng)絡(luò)最終的性能,如下圖,文章通過(guò)逐步增加網(wǎng)絡(luò)深度來(lái)提高性能,雖然看起來(lái)有一點(diǎn)小暴力,沒(méi)有特別多取巧的,但是確實(shí)有效,很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相對(duì)其他的方法,參數(shù)空間很大,最終的model有500多m,alnext只有200m,googlenet更少,所以train一個(gè)vgg模型通常要花費(fèi)更長(zhǎng)的時(shí)間,所幸有公開(kāi)的pretrained model讓我們很方便的使用,前面neural style這篇文章就使用的pretrained的model,paper中的幾種模型如下:

可以從圖中看出,從A到最后的E,他們?cè)黾拥氖敲恳粋€(gè)卷積組中的卷積層數(shù),最后D,E是我們常見(jiàn)的VGG-16,VGG-19模型,C中作者說(shuō)明,在引入1*1是考慮做線性變換(這里channel一致, 不做降維),后面在最終數(shù)據(jù)的分析上來(lái)看C相對(duì)于B確實(shí)有一定程度的提升,但不如D、VGG主要得優(yōu)勢(shì)在于

  • 減少參數(shù)的措施,對(duì)于一組(假定3個(gè),paper里面只stack of three 3*3)卷積相對(duì)于7*7在使用3層的非線性關(guān)系(3層RELU)的同時(shí)保證參數(shù)數(shù)量為3*(3^2C^2)=27C^2的,而7*7為49C^2,參數(shù)約為7*7的81%
  • 去掉了LRN,減少了內(nèi)存的小消耗和計(jì)算時(shí)間

VGG-16 tflearn實(shí)現(xiàn)

tflearn 官方github上有給出基于tflearn下的VGG-16的實(shí)現(xiàn) from future import division, print_function, absolute_import

  1. import tflearn 
  2. from tflearn.layers.core import input_data, dropout, fully_connected 
  3. from tflearn.layers.conv import conv_2d, max_pool_2d 
  4. from tflearn.layers.estimator import regression 
  5.  
  6. # Data loading and preprocessing 
  7. import tflearn.datasets.oxflower17 as oxflower17 
  8. X, Y = oxflower17.load_data(one_hot=True
  9.  
  10. # Building 'VGG Network' 
  11. network = input_data(shape=[None2242243]) 
  12.  
  13. network = conv_2d(network, 643, activation='relu'
  14. network = conv_2d(network, 643, activation='relu'
  15. network = max_pool_2d(network, 2, strides=2
  16.  
  17. network = conv_2d(network, 1283, activation='relu'
  18. network = conv_2d(network, 1283, activation='relu'
  19. network = max_pool_2d(network, 2, strides=2
  20.  
  21. network = conv_2d(network, 2563, activation='relu'
  22. network = conv_2d(network, 2563, activation='relu'
  23. network = conv_2d(network, 2563, activation='relu'
  24. network = max_pool_2d(network, 2, strides=2
  25.  
  26. network = conv_2d(network, 5123, activation='relu'
  27. network = conv_2d(network, 5123, activation='relu'
  28. network = conv_2d(network, 5123, activation='relu'
  29. network = max_pool_2d(network, 2, strides=2
  30.  
  31. network = conv_2d(network, 5123, activation='relu'
  32. network = conv_2d(network, 5123, activation='relu'
  33. network = conv_2d(network, 5123, activation='relu'
  34. network = max_pool_2d(network, 2, strides=2
  35.  
  36. network = fully_connected(network, 4096, activation='relu'
  37. network = dropout(network, 0.5
  38. network = fully_connected(network, 4096, activation='relu'
  39. network = dropout(network, 0.5
  40. network = fully_connected(network, 17, activation='softmax'
  41.  
  42. network = regression(network, optimizer='rmsprop'
  43.                      loss='categorical_crossentropy'
  44.                      learning_rate=0.001
  45.  
  46. # Training 
  47. model = tflearn.DNN(network, checkpoint_path='model_vgg'
  48.                     max_checkpoints=1, tensorboard_verbose=0
  49. model.fit(X, Y, n_epoch=500, shuffle=True
  50.           show_metric=True, batch_size=32, snapshot_step=500
  51.           snapshot_epoch=False, run_id='vgg_oxflowers17'

 VGG-16 graph如下:

對(duì)VGG,作者個(gè)人覺(jué)得他的亮點(diǎn)不多,pre-trained的model我們可以很好的使用,但是不如GoogLeNet那樣讓人有眼前一亮的感覺(jué)。

Deep Residual Network

一般來(lái)說(shuō)越深的網(wǎng)絡(luò),越難被訓(xùn)練,Deep Residual Learning for Image Recognition中提出一種residual learning的框架,能夠大大簡(jiǎn)化模型網(wǎng)絡(luò)的訓(xùn)練時(shí)間,使得在可接受時(shí)間內(nèi),模型能夠更深(152甚至嘗試了1000),該方法在ILSVRC2015上取得最好的成績(jī)。

隨著模型深度的增加,會(huì)產(chǎn)生以下問(wèn)題:

  • vanishing/exploding gradient,導(dǎo)致了訓(xùn)練十分難收斂,這類問(wèn)題能夠通過(guò)norimalized initialization 和intermediate normalization layers解決;
  • 對(duì)合適的額深度模型再次增加層數(shù),模型準(zhǔn)確率會(huì)迅速下滑(不是overfit造成),training error和test error都會(huì)很高,相應(yīng)的現(xiàn)象在CIFAR-10和ImageNet都有提及

為了解決因深度增加而產(chǎn)生的性能下降問(wèn)題,作者提出下面一種結(jié)構(gòu)來(lái)做residual learning:

假設(shè)潛在映射為H(x),使stacked nonlinear layers去擬合F(x):=H(x)-x,殘差優(yōu)化比優(yōu)化H(x)更容易。 F(x)+x能夠很容易通過(guò)”shortcut connections”來(lái)實(shí)現(xiàn)。

這篇文章主要得改善就是對(duì)傳統(tǒng)的卷積模型增加residual learning,通過(guò)殘差優(yōu)化來(lái)找到近似最優(yōu)identity mappings。

paper當(dāng)中的一個(gè)網(wǎng)絡(luò)結(jié)構(gòu):

Deep Residual Network tflearn實(shí)現(xiàn)原文里面有詳細(xì)的介紹。

 

理解Fast Neural Style


前面幾篇文章講述了在Computer Vision領(lǐng)域里面常用的模型,接下來(lái)一段時(shí)間,作者會(huì)花精力來(lái)學(xué)習(xí)一些TensorFlow在Computer Vision領(lǐng)域的應(yīng)用,主要是分析相關(guān)pape和源碼,今天會(huì)來(lái)詳細(xì)了解下fast neural style的相關(guān)工作,前面也有文章分析neural style的內(nèi)容,那篇算是neural style的起源,但是無(wú)法應(yīng)用到實(shí)際工作上,為啥呢?它每次都需要指定好content image和style image,然后最小化content loss 和style loss去生成圖像,時(shí)間花銷很大,而且無(wú)法保存某種風(fēng)格的model,所以每次生成圖像都是訓(xùn)練一個(gè)model的過(guò)程,而fast neural style中能夠?qū)⒂?xùn)練好的某種style的image的模型保存下來(lái),然后對(duì)content image 進(jìn)行transform,當(dāng)然文中還提到了image transform的另一個(gè)應(yīng)用方向:Super-Resolution,利用深度學(xué)習(xí)的技術(shù)將低分辨率的圖像轉(zhuǎn)換為高分辨率圖像,現(xiàn)在在很多大型的互聯(lián)網(wǎng)公司,尤其是視頻網(wǎng)站上也有應(yīng)用。

Paper原理

幾個(gè)月前,就看了Neural Style相關(guān)的文章TensorFlow之深入理解Neural Style,A Neural Algorithm of Aritistic Style中構(gòu)造了一個(gè)多層的卷積網(wǎng)絡(luò),通過(guò)最小化定義的content loss和style loss最后生成一個(gè)結(jié)合了content和style的圖像,很有意思,而Perceptual Losses for Real-Time Style Transfer and Super-Resolution,通過(guò)使用perceptual loss來(lái)替代per-pixels loss使用pre-trained的vgg model來(lái)簡(jiǎn)化原先的loss計(jì)算,增加一個(gè)transform Network,直接生成Content image的style版本, 如何實(shí)現(xiàn)的呢,請(qǐng)看下圖:

整個(gè)網(wǎng)絡(luò)是由部分組成:image transformation network、 loss netwrok;Image Transformation network是一個(gè)deep residual conv netwrok,用來(lái)將輸入圖像(content image)直接transform為帶有style的圖像;而loss network參數(shù)是fixed的,這里的loss network和A Neural Algorithm of Aritistic Style中的網(wǎng)絡(luò)結(jié)構(gòu)一致,只是參數(shù)不做更新,只用來(lái)做content loss 和style loss的計(jì)算,這個(gè)就是所謂的perceptual loss,作者是這樣解釋的為Image Classification的pretrained的卷積模型已經(jīng)很好的學(xué)習(xí)了perceptual和semantic information(場(chǎng)景和語(yǔ)義信息),所以后面的整個(gè)loss network僅僅是為了計(jì)算content loss和style loss,而不像A Neural Algorithm of Aritistic Style做更新這部分網(wǎng)絡(luò)的參數(shù),這里更新的是前面的transform network的參數(shù),所以從整個(gè)網(wǎng)絡(luò)結(jié)構(gòu)上來(lái)看輸入圖像通過(guò)transform network得到轉(zhuǎn)換的圖像,然后計(jì)算對(duì)應(yīng)的loss,整個(gè)網(wǎng)絡(luò)通過(guò)最小化這個(gè)loss去update前面的transform network,是不是很簡(jiǎn)單?

loss的計(jì)算也和之前的都很類似,content loss: 

style loss:

style loss中的gram matrix:

Gram Matrix是一個(gè)很重要的東西,他可以保證y^hat和y之間有同樣的shape。 Gram的說(shuō)明具體見(jiàn)paper這部分,作者這也解釋不清楚,相信讀者一看就明白: 

相信看到這里就基本上明白了這篇paper在fast neural style是如何做的,總結(jié)一下:

  • transform network 網(wǎng)絡(luò)結(jié)構(gòu)為deep residual network,將輸入image轉(zhuǎn)換為帶有特種風(fēng)格的圖像,網(wǎng)絡(luò)參數(shù)可更新。
  • loss network 網(wǎng)絡(luò)結(jié)構(gòu)同之前paper類似,這里主要是計(jì)算content loss和style loss, 注意參數(shù)不做更新。
  • Gram matrix的提出,讓transform之后的圖像與最后經(jīng)過(guò)loss network之后的圖像不同shape時(shí)計(jì)算loss也很方便。

注:本文的技術(shù)內(nèi)容取得 深度學(xué)習(xí)工程師 段石石 的發(fā)布授權(quán),同時(shí)為了閱讀體驗(yàn),內(nèi)容有些小修改和整合,并精簡(jiǎn)了部分的實(shí)踐內(nèi)容。如果想了解更多的深度學(xué)習(xí)實(shí)踐,請(qǐng)移步到 小石頭的碼瘋營(yíng) 進(jìn)行閱讀。

【編輯推薦】

  1. 微服務(wù)時(shí)代 怎么看華為軟件開(kāi)發(fā)云實(shí)現(xiàn)DevOps落地
  2. Google要逆天!Google Wear 2.0 最新離線AI技術(shù)解析
  3. 基于React與Vue后,移動(dòng)開(kāi)源項(xiàng)目Weex如何定義未來(lái)
  4. 世界級(jí)的開(kāi)源項(xiàng)目:TiDB 如何重新定義下一代關(guān)系型數(shù)據(jù)庫(kù)
  5. APM從入門到放棄:可用性監(jiān)控體系和優(yōu)化手段的剖析

【責(zé)任編輯:林師授 TEL:(010)68476606】

責(zé)任編輯:林師授 來(lái)源: 51CTO.COM
相關(guān)推薦

2016-12-23 09:09:54

TensorFlowKubernetes框架

2018-08-16 12:11:40

Google 深度學(xué)習(xí)框架

2018-04-11 17:50:14

深度學(xué)習(xí)PyTorchTensorFlow

2016-05-19 17:28:48

Google IO谷歌

2022-11-13 08:11:03

TensorFlow人工智能開(kāi)源

2017-11-03 13:30:41

深度學(xué)習(xí)TensorFlowGoogle Brai

2018-01-11 15:31:39

命令Linux關(guān)機(jī)

2015-07-15 10:15:27

混合云云安全公有云

2017-02-23 15:37:44

OptionObject容器

2016-05-09 10:41:03

算法分析開(kāi)發(fā)

2017-12-01 15:24:04

TensorFlow深度學(xué)習(xí)教程

2019-09-01 19:19:04

TensorFlowPyTorch深度學(xué)習(xí)

2022-12-22 13:18:54

深度學(xué)習(xí)框架

2017-07-10 13:09:45

前端Flexbox

2017-03-16 11:39:33

Openstack源碼姿勢(shì)

2023-01-30 07:41:43

2021-05-06 09:05:11

深度學(xué)習(xí)

2020-02-25 15:04:48

深度學(xué)習(xí)編程人工智能

2017-03-01 13:36:41

TensorFlowTheano框架

2024-02-06 14:05:00

Go中間件框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)