久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

TensorFlow深度學(xué)習(xí),一篇文章就夠了

 gljin_cn 2016-09-26


作者: 陳迪豪,,就職小米科技,,深度學(xué)習(xí)工程師,TensorFlow代碼提交者,。

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

Google不僅是大數(shù)據(jù)和云計算的領(lǐng)導(dǎo)者,,在機器學(xué)習(xí)和深度學(xué)習(xí)上也有很好的實踐和積累,在2015年年底開源了內(nèi)部使用的深度學(xué)習(xí)框架TensorFlow,。

與Caffe、Theano,、Torch,、MXNet等框架相比,,TensorFlow在Github上Fork數(shù)和Star數(shù)都是最多的,而且在圖形分類,、音頻處理,、推薦系統(tǒng)和自然語言處理等場景下都有豐富的應(yīng)用。最近流行的Keras框架底層默認(rèn)使用TensorFlow,,著名的斯坦福CS231n課程使用TensorFlow作為授課和作業(yè)的編程語言,,國內(nèi)外多本TensorFlow書籍已經(jīng)在籌備或者發(fā)售中,AlphaGo開發(fā)團(tuán)隊Deepmind也計劃將神經(jīng)網(wǎng)絡(luò)應(yīng)用遷移到TensorFlow中,,這無不印證了TensorFlow在業(yè)界的流行程度,。

TensorFlow不僅在Github開放了源代碼,在《TensorFlow: Large-Scale Machine Learning on Heterogeneous Distributed Systems》論文中也介紹了系統(tǒng)框架的設(shè)計與實現(xiàn),,其中測試過200節(jié)點規(guī)模的訓(xùn)練集群也是其他分布式深度學(xué)習(xí)框架所不能媲美的,。Google還在《Wide & Deep Learning for Recommender Systems》《The YouTube Video Recommendation System》論文中介紹了Google Play應(yīng)用商店和YouTube視頻推薦的算法模型,還提供了基于TensorFlow的代碼實例,,使用TensorFlow任何人都可以在ImageNet或Kaggle競賽中得到接近State of the art的好成績,。

TensorFlow從入門到應(yīng)用

毫不夸張得說,TensorFlow的流行讓深度學(xué)習(xí)門檻變得越來越低,,只要你有Python和機器學(xué)習(xí)基礎(chǔ),,入門和使用神經(jīng)網(wǎng)絡(luò)模型變得非常簡單。TensorFlow支持Python和C++兩種編程語言,,再復(fù)雜的多層神經(jīng)網(wǎng)絡(luò)模型都可以用Python來實現(xiàn),,如果業(yè)務(wù)使用其他編程也不用擔(dān)心,使用跨語言的gRPC或者HTTP服務(wù)也可以訪問使用TensorFlow訓(xùn)練好的智能模型,。

那使用Python如何編寫TensorFlow應(yīng)用呢,?從入門到應(yīng)用究竟有多難呢?

下面我們編寫了一個Hello world應(yīng)用,,輸出字符串和進(jìn)行簡單的運算,。

從這段簡單的代碼可以了解到TensorFlow的使用非常方便,通過Python標(biāo)準(zhǔn)庫的形式導(dǎo)入,,不需要啟動額外的服務(wù),。第一次接觸TensorFlow可能比較疑惑,這段邏輯Python也可以實現(xiàn),,為什么要使用tf.constant()和tf.Session()呢,?其實TensorFlow通過Graph和Session來定義運行的模型和訓(xùn)練,這在復(fù)雜的模型和分布式訓(xùn)練上有非常大好處,,將在文章的后續(xù)部分介紹到,。

前面的Hello world應(yīng)用并沒有訓(xùn)練模型,接下來介紹一個邏輯回歸問題與模型。我們使用numpy構(gòu)建一組線性關(guān)系的數(shù)據(jù),,通過TensorFlow實現(xiàn)的隨機梯度算法,,在訓(xùn)練足夠長的時間后可以自動求解函數(shù)中的斜率和截距。

上面的代碼可以在tensorflow_examples項目中找到,,經(jīng)過訓(xùn)練,,我們看到輸出的斜率w約為2,截距b約為10,,與我們構(gòu)建的數(shù)據(jù)之間的關(guān)聯(lián)關(guān)系十分吻合,!注意在TensorFlow代碼中并沒有實現(xiàn)最小二乘法等算法,也沒有if-else來控制代碼邏輯,,完全是由數(shù)據(jù)驅(qū)動并且根據(jù)梯度下降算法動態(tài)調(diào)整Loss值學(xué)習(xí)出來的,。這樣我們即使換了其他數(shù)據(jù)集,甚至換成圖像分類等其他領(lǐng)域的問題,,無需修改代碼也可以由機器自動學(xué)習(xí),,這也是神經(jīng)網(wǎng)絡(luò)和TensorFlow強大的地方。

前面的模型只有w和b兩個變量,,如果數(shù)據(jù)處于非線性關(guān)系就難以得到很好的結(jié)果,,因此我們建議使用深層神經(jīng)網(wǎng)絡(luò),這也是TensorFlow設(shè)計重點就要解決的深度學(xué)習(xí)模型,。我們知道Google在2014年憑借Inception模型贏下了ImageNet全球競賽,,里面代碼就是基于TensorFlow實現(xiàn)的,下面是較為復(fù)雜的模型定義代碼,。

使用TensorFlow已經(jīng)封裝好的全連接網(wǎng)絡(luò),、卷積神經(jīng)網(wǎng)絡(luò)、RNN和LSTM,,我們已經(jīng)可以組合出各種網(wǎng)絡(luò)模型,,實現(xiàn)Inception這樣的多層神經(jīng)網(wǎng)絡(luò)如拼湊Lego一樣簡單。但在選擇優(yōu)化算法,、生成TFRecords,、導(dǎo)出模型文件和支持分布式訓(xùn)練上,這里有比較多的細(xì)節(jié),,接下來我們將在一篇文章的篇幅內(nèi)介紹所有TensorFlow相關(guān)的核心使用技巧,。

TensorFlow核心使用技巧

為了介紹TensorFlow的各種用法,我們將使用deep_recommend_system這個開源項目,,它實現(xiàn)了TFRecords,、QueueRunner、Checkpoint,、TensorBoard,、Inference,、GPU支持、分布式訓(xùn)練和多層神經(jīng)網(wǎng)絡(luò)模型等特性,,而且可以輕易拓展實現(xiàn)Wide and deep等模型,,在實際的項目開發(fā)中可以直接下載使用。

1. 準(zhǔn)備訓(xùn)練數(shù)據(jù)

一般TensorFlow應(yīng)用代碼包含Graph的定義和Session的運行,,代碼量不大可以封裝到一個文件中,如cancer_classifier.py文件,。訓(xùn)練前需要準(zhǔn)備樣本數(shù)據(jù)和測試數(shù)據(jù),,一般數(shù)據(jù)文件是空格或者逗號分隔的CSV文件,但TensorFlow建議使用二進(jìn)制的TFRecords格式,,這樣可以支持QueuRunner和Coordinator進(jìn)行多線程數(shù)據(jù)讀取,,并且可以通過batch size和epoch參數(shù)來控制訓(xùn)練時單次batch的大小和對樣本文件迭代訓(xùn)練多少輪。如果直接讀取CSV文件,,需要在代碼中記錄下一次讀取數(shù)據(jù)的指針,,而且在樣本無法全部加載到內(nèi)存時使用非常不便。

data目錄,,項目已經(jīng)提供了CSV與TFRecords格式轉(zhuǎn)換工具convert_cancer_to_tfrecords.py,,參考這個腳本你就可以parse任意格式的CSV文件,轉(zhuǎn)成TensorFlow支持的TFRecords格式,。無論是大數(shù)據(jù)還是小數(shù)據(jù),,通過簡單的腳本工具就可以直接對接TensorFlow,項目中還提供print_cancer_tfrecords.py腳本來調(diào)用API直接讀取TFRecords文件的內(nèi)容,。

2. 接受命令行參數(shù)

有了TFRecords,,我們就可以編寫代碼來訓(xùn)練神經(jīng)網(wǎng)絡(luò)模型了,但眾所周知,,深度學(xué)習(xí)有過多的Hyperparameter需要調(diào)優(yōu),,我們就優(yōu)化算法、模型層數(shù)和不同模型都需要不斷調(diào)整,,這時候使用命令行參數(shù)是非常方便的,。

TensorFlow底層使用了python-gflags項目,然后封裝成tf.app.flags接口,,使用起來非常簡單和直觀,,在實際項目中一般會提前定義命令行參數(shù),尤其在后面將會提到的Cloud Machine Learning服務(wù)中,,通過參數(shù)來簡化Hyperparameter的調(diào)優(yōu),。

3. 定義神經(jīng)網(wǎng)絡(luò)模型

準(zhǔn)備完數(shù)據(jù)和參數(shù),最重要的還是要定義好網(wǎng)絡(luò)模型,,定義模型參數(shù)可以很簡單,,創(chuàng)建多個Variable即可,,也可以做得比較復(fù)雜,例如使用使用tf.variable_scope()和tf.get_variables()接口,。為了保證每個Variable都有獨特的名字,,而且能都輕易地修改隱層節(jié)點數(shù)和網(wǎng)絡(luò)層數(shù),我們建議參考項目中的代碼,,尤其在定義Variables時注意要綁定CPU,,TensorFlow默認(rèn)使用GPU可能導(dǎo)致參數(shù)更新過慢。

上述代碼在生產(chǎn)環(huán)境也十分常見,,無論是訓(xùn)練,、實現(xiàn)inference還是驗證模型正確率和auc時都會用到。項目中還基于此代碼實現(xiàn)了Wide and deep模型,,在Google Play應(yīng)用商店的推薦業(yè)務(wù)有廣泛應(yīng)用,,這也是適用于普遍的推薦系統(tǒng),將傳統(tǒng)的邏輯回歸模型和深度學(xué)習(xí)的神經(jīng)網(wǎng)絡(luò)模型有機結(jié)合在一起,。

4. 使用不同的優(yōu)化算法

定義好網(wǎng)絡(luò)模型,,我們需要覺得使用哪種Optimizer去優(yōu)化模型參數(shù),是應(yīng)該選擇Sgd,、Rmsprop還是選擇Adagrad,、Ftrl呢?對于不同場景和數(shù)據(jù)集沒有固定的答案,,最好的方式就是實踐,,通過前面定義的命令行參數(shù)我們可以很方便得使用不同優(yōu)化算法來訓(xùn)練模型。

在生產(chǎn)實踐中,,不同優(yōu)化算法在訓(xùn)練結(jié)果,、訓(xùn)練速度上都有很大差異,過度優(yōu)化網(wǎng)絡(luò)參數(shù)可能效果沒有使用其他優(yōu)化算法來得有效,,因此選用正確的優(yōu)化算法也是Hyperparameter調(diào)優(yōu)中很重要的一步,,通過在TensorFlow代碼中加入這段邏輯也可以很好地實現(xiàn)對應(yīng)的功能。

5. Online learning與Continuous learning

很多機器學(xué)習(xí)廠商都會宣稱自己的產(chǎn)品支持Online learning,,其實這只是TensorFlow的一個基本的功能,,就是支持在線數(shù)據(jù)不斷優(yōu)化模型。TensorFlow可以通過tf.train.Saver()來保存模型和恢復(fù)模型參數(shù),,使用Python加載模型文件后,,可不斷接受在線請求的數(shù)據(jù),更新模型參數(shù)后通過Saver保存成checkpoint,,用于下一次優(yōu)化或者線上服務(wù),。

而Continuous training是指訓(xùn)練即使被中斷,也能繼續(xù)上一次的訓(xùn)練結(jié)果繼續(xù)優(yōu)化模型,,在TensorFlow中也是通過Saver和checkpoint文件來實現(xiàn),。在deep_recommend_system項目默認(rèn)能從上一次訓(xùn)練中繼續(xù)優(yōu)化模型,,也可以在命令行中指定train_from_scratch,不僅不用擔(dān)心訓(xùn)練進(jìn)程被中斷,,也可以一邊訓(xùn)練一邊做inference提供線上服務(wù),。

6. 使用TensorBoard優(yōu)化參數(shù)

TensorFlow還集成了一個功能強大的圖形化工具,也即是TensorBoard,,一般只需要在代碼中加入我們關(guān)心的訓(xùn)練指標(biāo),,TensorBoard就會自動根據(jù)這些參數(shù)繪圖,通過可視化的方式來了解模型訓(xùn)練的情況,。

tf.scalar_summary(‘loss’, loss)
tf.scalar_summary(‘a(chǎn)ccuracy’, accuracy)
tf.scalar_summary(‘a(chǎn)uc’, auc_op)

7. 分布式TensorFlow應(yīng)用

最后不得不介紹TensorFlow強大的分布式計算功能,,傳統(tǒng)的計算框架如Caffe,原生不支持分布式訓(xùn)練,,在數(shù)據(jù)量巨大的情況下往往無法通過增加機器scale out。TensorFlow承載了Google各個業(yè)務(wù)PB級的數(shù)據(jù),,在設(shè)計之初就考慮到分布式計算的需求,,通過gRPC、Protobuf等高性能庫實現(xiàn)了神經(jīng)網(wǎng)絡(luò)模型的分布式計算,。

實現(xiàn)分布式TensorFlow應(yīng)用并不難,,構(gòu)建Graph代碼與單機版相同,我們實現(xiàn)了一個分布式的cancer_classifier.py例子,,通過下面的命令就可以啟動多ps多worker的訓(xùn)練集群,。

1
2
3
4
5
6
7
cancer_classifier.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=ps --task_index=0
cancer_classifier.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=ps --task_index=1
cancer_classifier.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=worker --task_index=0
cancer_classifier.py --ps_hosts=127.0.0.1:2222,127.0.0.1:2223 --worker_hosts=127.0.0.1:2224,127.0.0.1:2225 --job_name=worker --task_index=1

在深入閱讀代碼前,我們需要了解分布式TensorFlow中ps,、worker,、in-graph、between-graph,、synchronous training和asynchronous training的概念,。首先ps是整個訓(xùn)練集群的參數(shù)服務(wù)器,保存模型的Variable,,worker是計算模型梯度的節(jié)點,,得到的梯度向量會交付給ps更新模型。in-graph與between-graph對應(yīng),,但兩者都可以實現(xiàn)同步訓(xùn)練和異步訓(xùn)練,,in-graph指整個集群由一個client來構(gòu)建graph,并且由這個client來提交graph到集群中,,其他worker只負(fù)責(zé)處理梯度計算的任務(wù),,而between-graph指的是一個集群中多個worker可以創(chuàng)建多個graph,但由于worker運行的代碼相同因此構(gòu)建的graph也相同,,并且參數(shù)都保存到相同的ps中保證訓(xùn)練同一個模型,,這樣多個worker都可以構(gòu)建graph和讀取訓(xùn)練數(shù)據(jù),,適合大數(shù)據(jù)場景。同步訓(xùn)練和異步訓(xùn)練差異在于,,同步訓(xùn)練每次更新梯度需要阻塞等待所有worker的結(jié)果,,而異步訓(xùn)練不會有阻塞,訓(xùn)練的效率更高,,在大數(shù)據(jù)和分布式的場景下一般使用異步訓(xùn)練,。

8. Cloud Machine Learning

前面已經(jīng)介紹了TensorFlow相關(guān)的全部內(nèi)容,細(xì)心的網(wǎng)友可能已經(jīng)發(fā)現(xiàn),,TensorFlow功能強大,,但究其本質(zhì)還是一個library,用戶除了編寫TensorFlow應(yīng)用代碼還需要在物理機上起服務(wù),,并且手動指定訓(xùn)練數(shù)據(jù)和模型文件的目錄,,維護(hù)成本比較大,而且機器之間不可共享,。

縱觀大數(shù)據(jù)處理和資源調(diào)度行業(yè),,Hadoop生態(tài)儼然成為了業(yè)界的標(biāo)準(zhǔn),通過MapReduce或Spark接口來處理數(shù)據(jù),,用戶通過API提交任務(wù)后由Yarn進(jìn)行統(tǒng)一的資源分配和調(diào)度,,不僅讓分布式計算成為可能,,也通過資源共享和統(tǒng)一調(diào)度平的臺極大地提高了服務(wù)器的利用率。很遺憾TensorFlow定義是深度學(xué)習(xí)框架,并不包含集群資源管理等功能,,但開源TensorFlow以后,,Google很快公布了Google Cloud ML服務(wù),,我們從Alpha版本開始已經(jīng)是Cloud ML的早期用戶,,深深體會到云端訓(xùn)練深度學(xué)習(xí)的便利性。通過Google Cloud ML服務(wù),,我們可以把TensorFlow應(yīng)用代碼直接提交到云端運行,,甚至可以把訓(xùn)練好的模型直接部署在云上,通過API就可以直接訪問,,也得益于TensorFlow良好的設(shè)計,,我們基于Kubernetes和TensorFlow serving實現(xiàn)了Cloud Machine Learning服務(wù),架構(gòu)設(shè)計和使用接口都與Google Cloud ML類似,。

TensorFlow是很好深度學(xué)習(xí)框架,,對于個人開發(fā)者、科研人員已經(jīng)企業(yè)都是值得投資的技術(shù)方向,,而Cloud Machine Learning可以解決用戶在環(huán)境初始化,、訓(xùn)練任務(wù)管理以及神經(jīng)網(wǎng)絡(luò)模型的在線服務(wù)上的管理和調(diào)度問題。目前Google Cloud ML已經(jīng)支持automatically hyperparameter tunning,,參數(shù)調(diào)優(yōu)未來也將成為計算問題而不是技術(shù)問題,,即使有的開發(fā)者使用MXNet或者其他,,而不是TensorFlow,我們也愿意與更多深度學(xué)習(xí)用戶和平臺開發(fā)者交流,,促進(jìn)社區(qū)的發(fā)展,。

最后總結(jié)

總結(jié)一下,本文主要介紹TensorFlow深度學(xué)習(xí)框架的學(xué)習(xí)與應(yīng)用,,通過deep_recommend_system項目介紹了下面使用TensorFlow的8個核心要點,,也歡迎大家下載源碼試用和反饋。

1. 準(zhǔn)備訓(xùn)練數(shù)據(jù)

2. 接受命令行參數(shù)

3. 定義神經(jīng)網(wǎng)絡(luò)模型

4. 使用不同的優(yōu)化算法

5. Online learning與Continuous learning

6. 使用TensorBoard優(yōu)化參數(shù)

7. 分布式TensorFlow應(yīng)用

8. Cloud Machine Learning

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點擊一鍵舉報,。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多