擺好正確姿勢 看 Google 神級深度學習框架 TensorFlow 的實踐思路
原創(chuàng)在2015年11月9號Google發(fā)布了人工智能系統(tǒng)TensorFlow并宣布開源,此舉在深度學習領域影響巨大,也受到大量的深度學習開發(fā)者極大的關注。當然,對于人工智能這個領域,依然有不少質疑的聲音,但不可否認的是人工智能仍然是未來發(fā)展的趨勢。
而TensorFlow能夠在登陸GitHub的當天就成為最受關注的項目,作為構建深度學習模型的最佳方式、深度學習框架的領頭者,在發(fā)布當周輕松獲得超過1萬個星數(shù)評級,這主要是因為Google在人工智能領域的研發(fā)成績斐然和神級的技術人才儲備。當然還有一點是在圍棋上第一次打敗人類,然后升級版Master保持連續(xù)60盤不敗的AlphaGo,其強化學習的框架也是基于TensorFlow的高級API實現(xiàn)的。
TensorFlow: 為什么是它?
作為Goolge二代DL框架,使用數(shù)據(jù)流圖的形式進行計算的TensorFlow已經(jīng)成為了機器學習、深度學習領域中最受歡迎的框架之一。自從發(fā)布以來,TensorFlow不斷在完善并增加新功能,并在今年的2月26號在Mountain View舉辦的首屆年度TensorFlow開發(fā)者峰會上正式發(fā)布了TensorFlow 1.0版本,其最大的亮點就是通過優(yōu)化模型達到最快的速度,且快到令人難以置信,更讓人想不到的是很多擁護者用TensorFlow 1.0的發(fā)布來定義AI的元年。
通過以上Google指數(shù),深度學習占據(jù)目前流程技術的第一位
TensorFlow在過去獲得成績主要有以下幾點:
|
Google第一代分布式機器學習框架DistBelief不再滿足Google內部的需求,Google的小伙伴們在DistBelief基礎上做了重新設計,引入各種計算設備的支持包括CPU/GPU/TPU,以及能夠很好地運行在移動端,如安卓設備、ios、樹莓派 等等,支持多種不同的語言(因為各種high-level的api,訓練僅支持Python,inference支持包括C++,Go,Java等等),另外包括像TensorBoard這類很棒的工具,能夠有效地提高深度學習研究工作者的效率。
TensorFlow在Google內部項目應用的增長也十分迅速:在Google多個產(chǎn)品都有應用如:Gmail,Google Play Recommendation, Search, Translate, Map等等;有將近100多project和paper使用TensorFlow做相關工作。
TensorFlow在正式版發(fā)布前的過去14個月的時間內也獲得了很多的成績,包括475+非Google的Contributors,14000+次commit,超過5500標題中出現(xiàn)過TensorFlow的github project以及在Stack Overflow上有包括5000+個已被回答 的問題,平均每周80+的issue提交,且被一些頂尖的學術研究項目使用: – Neural Machine Translation – Neural Architecture Search – Show and Tell.
當然了,說到底深度學習就是用非監(jiān)督式或者半監(jiān)督式的特征學習,分層特征提取高校算法來替代手工獲取特征。目前研究人員和從事深度學習的開發(fā)者使用深度學習框架也并非只有TensorFlow一個,同樣也有很多在視覺、語言、自然語言處理和生物信息等領域較為優(yōu)秀的框架,比如Torch、Caffe、Theano、Deeplearning4j等。
下面,編者整理段石石博文中的一些對網(wǎng)絡神經(jīng)模型、算法深度分析的內容,了解TensorFlow這個開源深度學習框架的強大之處。
深入理解Neural Style
這篇文章主要針對Tensorflow利用CNN的方法對藝術照片做下Neural Style的相關工作。首先,作者會詳細解釋下A Neural Algorithm of Artistic Style這篇paper是怎么做的,然后會結合一個開源的Tensorflow的Neural Style版本來領略下大神的風采。
A Neural Algorithm of Artistic Style
在藝術領域,尤其是繪畫,藝術家們通過創(chuàng)造不同的內容與風格,并相互交融影響來創(chuàng)立獨立的視覺體驗。如果給定兩張圖像,現(xiàn)在的技術手段,完全有能力讓計算機識別出圖像具體內容。而風格是一種很抽象的東西,在計算機的眼中,當然就是一些pixel,但人眼就能很有效地的辨別出不同畫家不同的style,是否有一些更復雜的feature來構成,最開始學習DeepLearning的paper時,多層網(wǎng)絡的實質其實就是找出更復雜、更內在的features,所以圖像的style理論上可以通過多層網(wǎng)絡來提取里面可能一些有意思的東西。而這篇文章就是利用卷積神經(jīng)網(wǎng)絡(利用pretrain的Pre-trained VGG network model)來分別做Content、Style的reconstruction,在合成時考慮content loss 與style loss的最小化(其實還包括去噪變化的的loss),這樣合成出來的圖像會保證在content 和style的重構上更準確。
這里是整個paper在neural style的工作流,理解這幅圖對理解整篇paper的邏輯很關鍵,主要分為兩部分:
|
methods
理解了以上兩點,剩下的就是建模的數(shù)據(jù)問題了,這里按Content和Style來分別計算loss,Content loss的method比較簡單:
其中F^l是產(chǎn)生的Content Representation在第l層的數(shù)據(jù)表示,P^l是原始圖片在第l層的數(shù)據(jù)表示,定義squared-error loss為兩種特征表示的error。
Style的loss基本也和Content loss一樣,只不過要包含每一層輸出的errors之和
其中A^l 是原始style圖片在第l的數(shù)據(jù)表示,而G^l是產(chǎn)生的Style Representation在第l層的表示
定義好loss之后就是采用優(yōu)化方法來最小化模型loss(注意paper當中只有content loss和style loss),源碼當中還涉及到降噪的loss:
優(yōu)化方法這里就不講了,tensorflow有內置的如Adam這樣的方法來處理。
深入理解AlexNet
前面看了一些Tensorflow的文檔和一些比較有意思的項目,發(fā)現(xiàn)這里面水很深的,需要多花時間好好從頭了解下,尤其是cv這塊的東西,特別感興趣,接下來一段時間會開始深入了解ImageNet比賽中中獲得好成績的那些模型: AlexNet、GoogLeNet、VGG(對就是之前在nerual network用的pretrained的model)、deep residual networks。
ImageNet Classification with Deep Convolutional Neural Networks
ImageNet Classification with Deep Convolutional Neural Networks 是Hinton和他的學生Alex Krizhevsky在12年ImageNet Challenge使用的模型結構,刷新了Image Classification的幾率,從此deep learning在Image這塊開始一次次超過state-of-art,甚至于搭到打敗人類的地步,看這邊文章的過程中,發(fā)現(xiàn)了很多以前零零散散看到的一些優(yōu)化技術,但是很多沒有深入了解,這篇文章講解了他們alexnet如何做到能達到那么好的成績,好的廢話不多說,來開始看文章:
這張圖是基本的caffe中alexnet的網(wǎng)絡結構,這里比較抽象,作者用caffe的draw_net把alexnet的網(wǎng)絡結構畫出來了:
AlexNet的基本結構
alexnet總共包括8層,其中前5層convolutional,后面3層是full-connected,文章里面說的是減少任何一個卷積結果會變得很差,下面具體講講每一層的構成:
|
paper里面也指出了這張圖是在兩個GPU下做的,其中和caffe里面的alexnet可能還真有點差異,但這可能不是重點,各位在使用的時候,直接參考caffe中的alexnet的網(wǎng)絡結果,每一層都十分詳細,基本的結構理解和上面是一致的。
AlexNet為啥取得比較好的結果
前面講了下AlexNet的基本網(wǎng)絡結構,大家肯定會對其中的一些點產(chǎn)生疑問,比如LRN、Relu、dropout, 相信接觸過dl的小伙伴們都有聽說或者了解過這些。這里按paper中的描述詳細講述這些東西為什么能提高最終網(wǎng)絡的性能。
ReLU Nonlinearity
一般來說,剛接觸神經(jīng)網(wǎng)絡還沒有深入了解深度學習的小伙伴們對這個都不會太熟,一般都會更了解另外兩個激活函數(shù)(真正往神經(jīng)網(wǎng)絡中引入非線性關系,使神經(jīng)網(wǎng)絡能夠有效擬合非線性函數(shù))tanh(x)和(1+e^(-x))^(-1),而ReLU(Rectified Linear Units) f(x)=max(0,x)?;赗eLU的深度卷積網(wǎng)絡比基于tanh的網(wǎng)絡訓練塊數(shù)倍,下圖是一個基于CIFAR-10的四層卷積網(wǎng)絡在tanh和ReLU達到25%的training error的迭代次數(shù):
實線、間斷線分別代表的是ReLU、tanh的training error,可見ReLU比tanh能夠更快的收斂
Local Response Normalization
使用ReLU f(x)=max(0,x)后,你會發(fā)現(xiàn)激活函數(shù)之后的值沒有了tanh、sigmoid函數(shù)那樣有一個值域區(qū)間,所以一般在ReLU之后會做一個normalization,LRU就是文中提出(這里不確定,應該是提出?)一種方法,在神經(jīng)科學中有個概念叫“Lateral inhibition”,講的是活躍的神經(jīng)元對它周邊神經(jīng)元的影響。
Dropout
Dropout也是經(jīng)常挺說的一個概念,能夠比較有效地防止神經(jīng)網(wǎng)絡的過擬合。 相對于一般如線性模型使用正則的方法來防止模型過擬合,而在神經(jīng)網(wǎng)絡中Dropout通過修改神經(jīng)網(wǎng)絡本身結構來實現(xiàn)。對于某一層神經(jīng)元,通過定義的概率來隨機刪除一些神經(jīng)元,同時保持輸入層與輸出層神經(jīng)元的個人不變,然后按照神經(jīng)網(wǎng)絡的學習方法進行參數(shù)更新,下一次迭代中,重新隨機刪除一些神經(jīng)元,直至訓練結束
Data Augmentation
其實,最簡單的增強模型性能,防止模型過擬合的方法是增加數(shù)據(jù),但是其實增加數(shù)據(jù)也是有策略的,paper當中從256*256中隨機提出227*227的patches(paper里面是224*224),還有就是通過PCA來擴展數(shù)據(jù)集。這樣就很有效地擴展了數(shù)據(jù)集,其實還有更多的方法視你的業(yè)務場景去使用,比如做基本的圖像轉換如增加減少亮度,一些濾光算法等等之類的,這是一種特別有效地手段,尤其是當數(shù)據(jù)量不夠大的時候。
深度理解GoogLeNet
GoogLeNet是ILSVRC 2014的冠軍,主要是致敬經(jīng)典的LeNet-5算法,主要是Google的team成員完成,paper見Going Deeper with Convolutions.相關工作主要包括LeNet-5、Gabor filters、Network-in-Network.Network-in-Network改進了傳統(tǒng)的CNN網(wǎng)絡,采用少量的參數(shù)就輕松地擊敗了AlexNet網(wǎng)絡,使用Network-in-Network的模型最后大小約為29MNetwork-in-Network caffe model.GoogLeNet借鑒了Network-in-Network的思想,下面會詳細講述下。
1) Network-in-Network
左邊是CNN的線性卷積層,一般來說線性卷積層用來提取線性可分的特征,但所提取的特征高度非線性時,需要更加多的filters來提取各種潛在的特征,這樣就存在一個問題,filters太多,導致網(wǎng)絡參數(shù)太多,網(wǎng)絡過于復雜對于計算壓力太大。
文章主要從兩個方法來做了一些改良:
1,卷積層的改進:MLPconv,在每個local部分進行比傳統(tǒng)卷積層復雜的計算,如上圖右,提高每一層卷積層對于復雜特征的識別能力,這里舉個不恰當?shù)睦?,傳統(tǒng)的CNN網(wǎng)絡,每一層的卷積層相當于一個只會做單一任務,你必須要增加海量的filters來達到完成特定量類型的任務,而MLPconv的每層conv有更加大的能力,每一層能夠做多種不同類型的任務,在選擇filters時只需要很少量的部分; 2,采用全局均值池化來解決傳統(tǒng)CNN網(wǎng)絡中最后全連接層參數(shù)過于復雜的特點,而且全連接會造成網(wǎng)絡的泛化能力差,Alexnet中有提高使用dropout來提高網(wǎng)絡的泛化能力。 |
最后作者設計了一個4層的Network-in-network+全局均值池化層來做imagenet的分類問題。
- class NiN(Network):
- def setup(self):
- (self.feed('data')
- .conv(11, 11, 96, 4, 4, padding='VALID', name='conv1')
- .conv(1, 1, 96, 1, 1, name='cccp1')
- .conv(1, 1, 96, 1, 1, name='cccp2')
- .max_pool(3, 3, 2, 2, name='pool1')
- .conv(5, 5, 256, 1, 1, name='conv2')
- .conv(1, 1, 256, 1, 1, name='cccp3')
- .conv(1, 1, 256, 1, 1, name='cccp4')
- .max_pool(3, 3, 2, 2, padding='VALID', name='pool2')
- .conv(3, 3, 384, 1, 1, name='conv3')
- .conv(1, 1, 384, 1, 1, name='cccp5')
- .conv(1, 1, 384, 1, 1, name='cccp6')
- .max_pool(3, 3, 2, 2, padding='VALID', name='pool3')
- .conv(3, 3, 1024, 1, 1, name='conv4-1024')
- .conv(1, 1, 1024, 1, 1, name='cccp7-1024')
- .conv(1, 1, 1000, 1, 1, name='cccp8-1024')
- .avg_pool(6, 6, 1, 1, padding='VALID', name='pool4')
- .softmax(name='prob'))
網(wǎng)絡基本結果如上,代碼見https://github.com/ethereon/caffe-tensorflow. 這里因為作者最近工作變動的問題,沒有了機器來跑一篇,也無法畫下基本的網(wǎng)絡結構圖,之后會補上。這里指的提出的是中間cccp1和ccp2(cross channel pooling)等價于1*1kernel大小的卷積層。caffe中NIN的實現(xiàn)(略,請前往原文閱讀)
NIN的提出其實也可以認為我們加深了網(wǎng)絡的深度,通過加深網(wǎng)絡深度(增加單個NIN的特征表示能力)以及將原先全連接層變?yōu)閍ver_pool層,大大減少了原先需要的filters數(shù),減少了model的參數(shù)。paper中實驗證明達到Alexnet相同的性能,最終model大小僅為29M。
理解NIN之后,再來看GoogLeNet就不會有不明所理的感覺。
痛點:
|
Inception module
Inception module的提出主要考慮多個不同size的卷積核能夠hold圖像當中不同cluster的信息,為方便計算,paper中分別使用1*1,3*3,5*5,同時加入3*3 max pooling模塊。 然而這里存在一個很大的計算隱患,每一層Inception module的輸出的filters將是分支所有filters數(shù)量的綜合,經(jīng)過多層之后,最終model的數(shù)量將會變得巨大,naive的inception會對計算資源有更大的依賴。 前面有提到Network-in-Network模型,1*1的模型能夠有效進行降維(使用更少的來表達盡可能多的信息),所以文章提出了”Inception module with dimension reduction”,在不損失模型特征表示能力的前提下,盡量減少filters的數(shù)量,達到減少model復雜度的目的。
Overall of GoogLeNet
在tensorflow構造GoogLeNet基本的代碼在https://github.com/ethereon/caffe-tensorflow中(如果懶得找,原文有展示),作者封裝了一些基本的操作,了解網(wǎng)絡結構之后,構造GoogLeNet很容易。之后等到新公司之后,作者會試著在tflearn的基礎上寫下GoogLeNet的網(wǎng)絡代碼。
GoogLeNet on Tensorflow
GoogLeNet為了實現(xiàn)方便,作者用tflearn來重寫了下,代碼中和caffe model里面不一樣的就是一些padding的位置,因為改的比較麻煩,必須保持inception部分的concat時要一致,這里也不知道怎么修改pad的值(caffe prototxt),所以統(tǒng)一padding設定為same,具體代碼(略,原文有展示)
大家如果感興趣,可以看看這部分的caffe model prototxt, 幫忙檢查下是否有問題,代碼作者已經(jīng)提交到tflearn的官方庫了,add GoogLeNet(Inception) in Example,各位有tensorflow的直接安裝下tflearn,看看是否能幫忙檢查下是否有問題,這里因為沒有GPU的機器,跑的比較慢,TensorBoard的圖如下,不像之前Alexnet那么明顯(主要還是沒有跑那么多epoch,這里在寫入的時候發(fā)現(xiàn)主機上沒有磁盤空間了,尷尬,然后從新寫了restore來跑的,TensorBoard的圖也貌似除了點問題, 好像每次載入都不太一樣,但是從基本的log里面的東西來看,是逐步在收斂的,這里圖也貼下看看吧)
網(wǎng)絡結構,這里有個bug,可能是TensorBoard的,googlenet的graph可能是太大,大概是1.3m,在chrome上無法下載,試了火狐貌似可以了:
深入理解VGG\Residual Network
這段時間到了新公司,工作上開始研究DeepLearning以及TensorFlow,挺忙了,前段時間看了VGG和deep residual的paper,一直沒有時間寫,今天準備好好把這兩篇相關的paper重讀下。
VGGnet
VGGnet是Oxford的Visual Geometry Group的team,在ILSVRC 2014上的相關工作,主要工作是證明了增加網(wǎng)絡的深度能夠在一定程度上影響網(wǎng)絡最終的性能,如下圖,文章通過逐步增加網(wǎng)絡深度來提高性能,雖然看起來有一點小暴力,沒有特別多取巧的,但是確實有效,很多pretrained的方法就是使用VGG的model(主要是16和19),VGG相對其他的方法,參數(shù)空間很大,最終的model有500多m,alnext只有200m,googlenet更少,所以train一個vgg模型通常要花費更長的時間,所幸有公開的pretrained model讓我們很方便的使用,前面neural style這篇文章就使用的pretrained的model,paper中的幾種模型如下:
可以從圖中看出,從A到最后的E,他們增加的是每一個卷積組中的卷積層數(shù),最后D,E是我們常見的VGG-16,VGG-19模型,C中作者說明,在引入1*1是考慮做線性變換(這里channel一致, 不做降維),后面在最終數(shù)據(jù)的分析上來看C相對于B確實有一定程度的提升,但不如D、VGG主要得優(yōu)勢在于
|
VGG-16 tflearn實現(xiàn)
tflearn 官方github上有給出基于tflearn下的VGG-16的實現(xiàn) from future import division, print_function, absolute_import
- import tflearn
- from tflearn.layers.core import input_data, dropout, fully_connected
- from tflearn.layers.conv import conv_2d, max_pool_2d
- from tflearn.layers.estimator import regression
- # Data loading and preprocessing
- import tflearn.datasets.oxflower17 as oxflower17
- X, Y = oxflower17.load_data(one_hot=True)
- # Building 'VGG Network'
- network = input_data(shape=[None, 224, 224, 3])
- network = conv_2d(network, 64, 3, activation='relu')
- network = conv_2d(network, 64, 3, activation='relu')
- network = max_pool_2d(network, 2, strides=2)
- network = conv_2d(network, 128, 3, activation='relu')
- network = conv_2d(network, 128, 3, activation='relu')
- network = max_pool_2d(network, 2, strides=2)
- network = conv_2d(network, 256, 3, activation='relu')
- network = conv_2d(network, 256, 3, activation='relu')
- network = conv_2d(network, 256, 3, activation='relu')
- network = max_pool_2d(network, 2, strides=2)
- network = conv_2d(network, 512, 3, activation='relu')
- network = conv_2d(network, 512, 3, activation='relu')
- network = conv_2d(network, 512, 3, activation='relu')
- network = max_pool_2d(network, 2, strides=2)
- network = conv_2d(network, 512, 3, activation='relu')
- network = conv_2d(network, 512, 3, activation='relu')
- network = conv_2d(network, 512, 3, activation='relu')
- network = max_pool_2d(network, 2, strides=2)
- network = fully_connected(network, 4096, activation='relu')
- network = dropout(network, 0.5)
- network = fully_connected(network, 4096, activation='relu')
- network = dropout(network, 0.5)
- network = fully_connected(network, 17, activation='softmax')
- network = regression(network, optimizer='rmsprop',
- loss='categorical_crossentropy',
- learning_rate=0.001)
- # Training
- model = tflearn.DNN(network, checkpoint_path='model_vgg',
- max_checkpoints=1, tensorboard_verbose=0)
- model.fit(X, Y, n_epoch=500, shuffle=True,
- show_metric=True, batch_size=32, snapshot_step=500,
- snapshot_epoch=False, run_id='vgg_oxflowers17')
VGG-16 graph如下:
對VGG,作者個人覺得他的亮點不多,pre-trained的model我們可以很好的使用,但是不如GoogLeNet那樣讓人有眼前一亮的感覺。
Deep Residual Network
一般來說越深的網(wǎng)絡,越難被訓練,Deep Residual Learning for Image Recognition中提出一種residual learning的框架,能夠大大簡化模型網(wǎng)絡的訓練時間,使得在可接受時間內,模型能夠更深(152甚至嘗試了1000),該方法在ILSVRC2015上取得最好的成績。
隨著模型深度的增加,會產(chǎn)生以下問題:
- vanishing/exploding gradient,導致了訓練十分難收斂,這類問題能夠通過norimalized initialization 和intermediate normalization layers解決;
- 對合適的額深度模型再次增加層數(shù),模型準確率會迅速下滑(不是overfit造成),training error和test error都會很高,相應的現(xiàn)象在CIFAR-10和ImageNet都有提及
為了解決因深度增加而產(chǎn)生的性能下降問題,作者提出下面一種結構來做residual learning:
假設潛在映射為H(x),使stacked nonlinear layers去擬合F(x):=H(x)-x,殘差優(yōu)化比優(yōu)化H(x)更容易。 F(x)+x能夠很容易通過”shortcut connections”來實現(xiàn)。
這篇文章主要得改善就是對傳統(tǒng)的卷積模型增加residual learning,通過殘差優(yōu)化來找到近似最優(yōu)identity mappings。
paper當中的一個網(wǎng)絡結構:
Deep Residual Network tflearn實現(xiàn)原文里面有詳細的介紹。
理解Fast Neural Style
前面幾篇文章講述了在Computer Vision領域里面常用的模型,接下來一段時間,作者會花精力來學習一些TensorFlow在Computer Vision領域的應用,主要是分析相關pape和源碼,今天會來詳細了解下fast neural style的相關工作,前面也有文章分析neural style的內容,那篇算是neural style的起源,但是無法應用到實際工作上,為啥呢?它每次都需要指定好content image和style image,然后最小化content loss 和style loss去生成圖像,時間花銷很大,而且無法保存某種風格的model,所以每次生成圖像都是訓練一個model的過程,而fast neural style中能夠將訓練好的某種style的image的模型保存下來,然后對content image 進行transform,當然文中還提到了image transform的另一個應用方向:Super-Resolution,利用深度學習的技術將低分辨率的圖像轉換為高分辨率圖像,現(xiàn)在在很多大型的互聯(lián)網(wǎng)公司,尤其是視頻網(wǎng)站上也有應用。
Paper原理
幾個月前,就看了Neural Style相關的文章TensorFlow之深入理解Neural Style,A Neural Algorithm of Aritistic Style中構造了一個多層的卷積網(wǎng)絡,通過最小化定義的content loss和style loss最后生成一個結合了content和style的圖像,很有意思,而Perceptual Losses for Real-Time Style Transfer and Super-Resolution,通過使用perceptual loss來替代per-pixels loss使用pre-trained的vgg model來簡化原先的loss計算,增加一個transform Network,直接生成Content image的style版本, 如何實現(xiàn)的呢,請看下圖:
整個網(wǎng)絡是由部分組成:image transformation network、 loss netwrok;Image Transformation network是一個deep residual conv netwrok,用來將輸入圖像(content image)直接transform為帶有style的圖像;而loss network參數(shù)是fixed的,這里的loss network和A Neural Algorithm of Aritistic Style中的網(wǎng)絡結構一致,只是參數(shù)不做更新,只用來做content loss 和style loss的計算,這個就是所謂的perceptual loss,作者是這樣解釋的為Image Classification的pretrained的卷積模型已經(jīng)很好的學習了perceptual和semantic information(場景和語義信息),所以后面的整個loss network僅僅是為了計算content loss和style loss,而不像A Neural Algorithm of Aritistic Style做更新這部分網(wǎng)絡的參數(shù),這里更新的是前面的transform network的參數(shù),所以從整個網(wǎng)絡結構上來看輸入圖像通過transform network得到轉換的圖像,然后計算對應的loss,整個網(wǎng)絡通過最小化這個loss去update前面的transform network,是不是很簡單?
loss的計算也和之前的都很類似,content loss:
style loss:
style loss中的gram matrix:
Gram Matrix是一個很重要的東西,他可以保證y^hat和y之間有同樣的shape。 Gram的說明具體見paper這部分,作者這也解釋不清楚,相信讀者一看就明白:
相信看到這里就基本上明白了這篇paper在fast neural style是如何做的,總結一下:
|
注:本文的技術內容取得 深度學習工程師 段石石 的發(fā)布授權,同時為了閱讀體驗,內容有些小修改和整合,并精簡了部分的實踐內容。如果想了解更多的深度學習實踐,請移步到 小石頭的碼瘋營 進行閱讀。
【編輯推薦】
- 微服務時代 怎么看華為軟件開發(fā)云實現(xiàn)DevOps落地
- Google要逆天!Google Wear 2.0 最新離線AI技術解析
- 基于React與Vue后,移動開源項目Weex如何定義未來
- 世界級的開源項目:TiDB 如何重新定義下一代關系型數(shù)據(jù)庫
- APM從入門到放棄:可用性監(jiān)控體系和優(yōu)化手段的剖析
【責任編輯:林師授 TEL:(010)68476606】