摘要:現(xiàn)場宣布全球領(lǐng)先的深度學(xué)習(xí)開源框架正式對外發(fā)布版本,并保證的本次發(fā)布版本的接口滿足生產(chǎn)環(huán)境穩(wěn)定性要求。有趣的應(yīng)用案例皮膚癌圖像分類皮膚癌在全世界范圍內(nèi)影響深遠(yuǎn),患病人數(shù)眾多,嚴(yán)重威脅身體機(jī)能。
前言
本文屬于介紹性文章,其中會介紹許多TensorFlow的新feature和summit上介紹的一些有意思的案例,文章比較長,可能會花費30分鐘到一個小時
Google于2017年2月16日(北京時間)凌晨2點在美國加利福尼亞州山景城舉辦了首屆TensorFlow開發(fā)者峰會。Google現(xiàn)場宣布全球領(lǐng)先的深度學(xué)習(xí)開源框架TensorFlow正式對外發(fā)布V1.0版本,并保證Google的本次發(fā)布版本的API接口滿足生產(chǎn)環(huán)境穩(wěn)定性要求。
TensorFlow 在 2015 年年底一出現(xiàn)就受到了極大的關(guān)注,經(jīng)過一年多的發(fā)展,已經(jīng)成為了在機(jī)器學(xué)習(xí)、深度學(xué)習(xí)項目中更受歡迎的框架之一。自發(fā)布以來,TensorFlow不斷在完善并增加新功能,直到在這次大會上發(fā)布了穩(wěn)定版本的TensorFlow V1.0。這次是谷歌第一次舉辦的TensorFlow開發(fā)者和愛好者大會,我們從主題演講、有趣應(yīng)用、技術(shù)生態(tài)、移動端和嵌入式應(yīng)用多方面總結(jié)這次大會上的內(nèi)容,希望能對TensorFlow開發(fā)者有所幫助。
TensorFlow: 為大眾準(zhǔn)備的機(jī)器學(xué)習(xí)框架
TensorFlow在過去獲得成績主要有以下幾點:
TensorFlow被應(yīng)用在Google很多的應(yīng)用包括:Gmail, Google Play Recommendation, Search, Translate, Map等等;
在醫(yī)療方面,TensorFlow被科學(xué)家用來搭建根據(jù)視網(wǎng)膜來預(yù)防糖尿病致盲(后面也提到Stanford的PHD使用TensorFlow來預(yù)測皮膚癌,相關(guān)工作上了Nature封面);
通過在音樂、繪畫這塊的領(lǐng)域使用TensorFlow構(gòu)建深度學(xué)習(xí)模型來幫助人類更好地理解藝術(shù);
使用TensorFlow框架和高科技設(shè)備,構(gòu)建自動化的海洋生物檢測系統(tǒng),用來幫助科學(xué)家了解海洋生物的情況;
TensorFlow在移動客戶端發(fā)力,有多款在移動設(shè)備上使用TensorFlow做翻譯、風(fēng)格化等工作;
TensorFlow在移動設(shè)備CPU(高通820)上,能夠達(dá)到更高的性能和更低的功耗;
TensorFlow ecosystem結(jié)合其他開源項目能夠快速地搭建高性能的生產(chǎn)環(huán)境;
TensorBoard Embedded vector可視化工作
能夠幫助PHD/科研工作者快速開展project研究工作。
Google第一代分布式機(jī)器學(xué)習(xí)框架DistBelief不再滿足Google內(nèi)部的需求,Google的小伙伴們在DistBelief基礎(chǔ)上做了重新設(shè)計,引入各種計算設(shè)備的支持包括CPU/GPU/TPU,以及能夠很好地運行在移動端,如安卓設(shè)備、ios、樹莓派 等等,支持多種不同的語言(因為各種high-level的api,訓(xùn)練僅支持Python,inference支持包括C++,Go,Java等等),另外包括像TensorBoard這類很棒的工具,能夠有效地提高深度學(xué)習(xí)研究工作者的效率。
TensorFlow在Google內(nèi)部項目應(yīng)用的增長也十分迅速:在Google多個產(chǎn)品都有應(yīng)用如:Gmail,Google Play Recommendation, Search, Translate, Map等等;有將近100多project和paper使用TensorFlow做相關(guān)工作
TensorFlow在過去14個月的開源的時間內(nèi)也獲得了很多的成績,包括475+非Google的Contributors,14000+次commit,超過5500標(biāo)題中出現(xiàn)過TensorFlow的github project以及在Stack Overflow上有包括5000+個已被回答 的問題,平均每周80+的issue提交。
過去1年,TensorFlow從最開始的0.5,差不多一個半月一個版本:
TensorFlow 1.0的發(fā)布
TensorFlow1.0也發(fā)布了,雖然改了好多api,但是也提供了tf_upgrade.py來對你的代碼進(jìn)行更新。TensorFlow 1.0在分布式訓(xùn)練inception-v3模型上,64張GPU可以達(dá)到58X的加速比,更靈活的高層抽象接口,以及更穩(wěn)定的API。
New High Level API
對于新的抽象接口,TensorFlow相對于其他DeepLearning FrameWork做的比較好,layers能讓人很容易build一個model,基于layer之上的包括TF.Learn里面仿照scikit-learn風(fēng)格的各種estimator設(shè)計以及之后將融入TensorFlow 官方支持的Keras,能夠讓小伙伴用幾行配置模型結(jié)構(gòu)、運行方式、模型輸出等等;在這層之上就有canned Estimator,所謂的model in box,比如lr,kmeans這類。
Broad ML Support
在TensorFlow中有一些高興的機(jī)器學(xué)習(xí)的算法實現(xiàn),如LR, SVM、 Random Forest,在TF.Learn中有很多常用的機(jī)器學(xué)習(xí)算法的實現(xiàn),用戶可以很快的使用,而且API風(fēng)格和scikit-learn很類似,而且在后續(xù)的video提到會有分布式的支持。
XLA: An Experimental TensorFlow Compiler
TensorFlow XLA能夠快速地將TensorFlow轉(zhuǎn)成比較底層的實現(xiàn)(依賴device),這里后面有個talk,詳細(xì)講述了XLA。
廣泛的合作
Included in IBM’s PowerAI
Support movidus myriad 2 accelerator
Qualcomm’s Hexagon DSP (8倍加速,這里還請了Qualcomm的產(chǎn)品負(fù)責(zé)人來站臺)
TensorFlow In Depth
TensorFlow在research和production上有很好的優(yōu)勢,如下圖:
在模型訓(xùn)練上,1機(jī)8卡的性能無論是在一些標(biāo)準(zhǔn)的基準(zhǔn)測試或者是真實數(shù)據(jù)上都有比較好的加速比:
當(dāng)然在多機(jī)分布式訓(xùn)練上,能夠達(dá)到64張GPU上58倍的加速比:
TensorFlow被一些頂尖的學(xué)術(shù)研究項目使用: – Neural Machine Translation – Neural Architecture Search – Show and Tell
當(dāng)然TensorFlow在生產(chǎn)上也被廣泛應(yīng)用:
如Mobile Google Translate,Gmail等等,也被國內(nèi)外很多大廠使用做為模型訓(xùn)練的工具。
這些都是Jeff Dean在Keynote的內(nèi)容講到的內(nèi)容,內(nèi)容有點多,而且個人感覺這群google的小伙伴的ppt做的有點任性,不過誰叫他們牛逼呢,接下來幾個talk比較有技術(shù)含量,相信各位會更加有興趣。
有趣的應(yīng)用案例
皮膚癌圖像分類
皮膚癌在全世界范圍內(nèi)影響深遠(yuǎn),患病人數(shù)眾多,嚴(yán)重威脅身體機(jī)能。所幸醫(yī)療機(jī)構(gòu)統(tǒng)計皮膚癌在早期的治愈率是98%,更值得慶幸的是在這樣一個時代,智能終端能夠在早期及時發(fā)現(xiàn),及早預(yù)防(到2020,預(yù)計全球有61億臺智能手機(jī))。
這位小哥做的工作是啥呢,他拿到了一批皮膚癌的數(shù)據(jù),然后使用一個pretrained的inception-v3對數(shù)據(jù)來做一個inference,
最終結(jié)果:
而且在手機(jī)上很容易搭建,完成一個app用來做早起皮膚癌的檢測:
最終相關(guān)成果發(fā)表在Nature,而且在Nature的封面,這是一個特別成功地通過計算機(jī)視覺及深度學(xué)習(xí)相關(guān)的技術(shù),利用廉價的移動設(shè)備,能夠很有效地檢測是否有皮膚癌,大大節(jié)省了醫(yī)療檢測的成本,相信在未來 會有更多相關(guān)的技術(shù)出現(xiàn)。
利用AI預(yù)測糖尿病,預(yù)防失明
這個talk講的前面也提到的通過視網(wǎng)膜圖像預(yù)測糖尿病,預(yù)防失明:
通過視網(wǎng)膜圖片預(yù)測糖尿病是一個困難的問題,即使是專業(yè)的醫(yī)生,也很難去判斷,但是深度學(xué)習(xí)卻可以幫助我們:
通過收集適量的醫(yī)療數(shù)據(jù),構(gòu)建一個26layers的深度卷積網(wǎng)絡(luò),我們可以讓網(wǎng)絡(luò)自動學(xué)習(xí)這些圖像中的feature,來獲得較高的分類準(zhǔn)確率,而這個是人眼很難解決的。 這里有一個demo的演示:
模型最后的評估比專業(yè)醫(yī)生對比,F(xiàn)-score為0.95,比專業(yè)醫(yī)生的中位數(shù)0.91還高,這個太厲害了,相信不久會看到深度學(xué)習(xí)在醫(yī)療,尤其是這種病癥圖像分析上有很多驚人的成果。
Wide & Deep In Google Play
這項技術(shù)有段時間特別火,被用來做推薦相關(guān)的應(yīng)用,首先解釋下Memorization和Generalization:
模型的基本結(jié)構(gòu)如下:
整個推薦會同事考慮到商品的相關(guān)性以及一些推理關(guān)系,例如老鷹會飛、麻雀會飛這類邏輯屬于Memorization, 而說帶翅膀的動物會飛這屬于Genralization。
在具體的應(yīng)用場景,如Google Play的App推薦:
這里構(gòu)建一個如下圖的網(wǎng)絡(luò)來進(jìn)行訓(xùn)練(joint training):
為啥要joint training,而不是直接用deep和wide的來做ensemble呢? 這里做這個給出一個解釋,因為wide和deep會相互影響,最后較精確度會高,并且model會比較小:
而上面提到的Wide & Deep Learning Model在Tensorflow下僅僅只需要10行代碼來實現(xiàn)(突然想起了那個100美元畫一條線的故事):
Magenta: 音樂和藝術(shù)生成
這個項目講的是利用深度學(xué)習(xí)來做一些藝術(shù)相關(guān)的工作,項目地址:tensorflow-magenta 有一些很好玩的東西,如風(fēng)格化,生成藝術(shù)家風(fēng)格的音樂,利用深度學(xué)習(xí)模型模擬人類對藝術(shù)的想象力,創(chuàng)造出屬于DeepLearning的藝術(shù)風(fēng)格。 想要詳細(xì)了解的可以看看這里的介紹welcome-to-magenta,還有前面提到的github上project。
DeepMind團(tuán)隊所做的一些開發(fā)工作
DeepMind在被Google收購之后,也選擇TensorFlow作為其深度學(xué)習(xí)相關(guān)研究的平臺,然后做了很多很有意思的東西:
Data Center Cooling
這是Google在全世界各地若干個數(shù)據(jù)中心之一:
然后這群Google的小伙伴做了些什么事情呢?
Google的小伙伴利用強(qiáng)化學(xué)習(xí),是的!你沒有聽錯,應(yīng)用在AlphaGo上的一種技術(shù)來做數(shù)據(jù)中心冷卻設(shè)備的自動控制,并且效果十分顯著:
Gorila
Gorial是DeepMind下的一個強(qiáng)化學(xué)習(xí)的框架,基于TensorFlow的高級API實現(xiàn),很穩(wěn)定,只需要更改其中極少部分代碼就可以完成新的實驗,支持分布式訓(xùn)練,十分高效, 并且訓(xùn)練好的模型可以通過TensorFlow Serving快速地部署到生產(chǎn)環(huán)境。
AlphaGo
這個相信不說,大家都知道的,第一次在圍棋上打敗人類,然后升級版的Master 連續(xù)60盤不敗,原理不說了,網(wǎng)絡(luò)上很多分析文章,貼兩張圖聊表敬意:
WaveNet:語音音頻合成
這里DeepMind的小哥演示了WaveNet的一些demo, 具體的可以參見這里來了解。 貼一些效果對比:
XLA以及Keras與TensorFlow的融合
XLA與TensorFlow的結(jié)合
TensorFlow的各方面的優(yōu)勢都很突出,除了在速度這塊有些不足,如果,TensorFlow能在速度上做進(jìn)一步優(yōu)化,會怎么樣呢 ?
是的,Google的開發(fā)者也意識到這個問題,于是有了這個XLA, XLA的優(yōu)勢:
提高執(zhí)行速度,編譯子圖會減少生命周期較短的op的時間,來至少TensorFlow執(zhí)行是的時間;融合pipelined的op來減少內(nèi)存的開銷;
通過分析和調(diào)節(jié)內(nèi)存需求,來減少很多中間結(jié)果的緩存
減少定制化op的依賴,通過提供自動化融合底層ops的性能來達(dá)到原先需要手工去融合定制化op的性能
減少移動設(shè)備的內(nèi)存占用,使用AOT編譯子圖來減少tensorflow執(zhí)行時間,能夠共享object/header file pair給其他應(yīng)用,能夠在Mobile Inference上減少幾個數(shù)量級的內(nèi)存占用
提高了程序的可移植性,能夠在不改變大部分tensorflow源碼的前提下,很容易地更改以適應(yīng)新的硬件設(shè)備,
XLA主要包括兩種使用方式:JIT(Just in time)能夠自動將Graph中的部分子圖通過XLA融合某些操作來減少內(nèi)存需求提高執(zhí)行速度;AOT(Ahead of time)可以提前將Graph轉(zhuǎn)換為可以執(zhí)行的源碼,減少生成的可執(zhí)行文件的大小, 減少運行的時間消耗,一個很明顯的應(yīng)用場景是模型在移動設(shè)備上的Inference優(yōu)化。
因為XLA原理涉及到編譯器,這塊不是我擅長的地方,所以這里就這樣過了, 如果有興趣的小伙伴可以關(guān)注下xla docs還有此次TensorFlow Dev Summit 上XLA的talkXLA: TensorFlow, Compiled! 最后貼幾張XLA的一些評測性能:
Keras與TensorFlow的集成
Keras 是一個可以在很多平臺上應(yīng)用的深度學(xué)習(xí)框架,”An API Specify for building deep learning models across many platforms”。 TensorFlow已經(jīng)會在官方TensorFlow支持,1.1會在tf.contrib,1.2會tf.keras,而且會支持TensorFlow Serving,是不是很心動。 Keras的作者在TensorFlow Dev Summit上講了以下內(nèi)容:
所以之后Keras的用戶可以更快的在TensorFlow的框架下做出相應(yīng)地模型,能更方便地進(jìn)行分布式訓(xùn)練,使用Google的Cloud ML, 進(jìn)行超參,還有更更重要的:TF-Serving。 這些feature現(xiàn)在好像還沒有支持,不過應(yīng)該很快了,大家可以期待下。 這里,F(xiàn)rancois Chollet使用Keras構(gòu)造了一個Video-QA的model,這個模型在Keras的官方文檔也有描述,具體可以去那邊看看,大概是這樣一個場景:
這樣一個場景,利用原生的python構(gòu)造太難了,但是用Keras,只需要考慮設(shè)計你的模型,如何來完成類似的功能,完全不用擔(dān)心coding的實現(xiàn),如圖是一個類似問題的一個簡單地模型設(shè)計:
更詳細(xì)一點:
而在Keras中如何實現(xiàn)呢
video = tf.keras.layers.Input(shape=(None, 150, 150, 3))cnn = tf.keras.applications.InceptionV3(weights="imagenet", include_top=False, pool="avg)
cnn.trainable = False
encoded_frames = tf.keras.layers.TimeDistributed(cnn)(video)
encoded_vid = tf.layers.LSTM(256)(encode_frames)
question = tf.keras.layers.Input(shape=(100), dtype="int32")
x = tf.keras.layers.Embedding(10000, 256, mask_zero=True)(question)
encoded_q = tf.keras.layers.LSTM(128)(x)
x = tf.keras.layers.concat([encoded_vid, encoded_q])
x = tf.keras.layers.Dense(128, activation=tf.nn.relu)(x)
outputs = tf.keras.layers.Dense(1000)(x)
model = tf.keras.models.Mode([video, question], outputs)
model.compile(optimizer=tf.AdamOptimizer(), loss=tf.softmax_crossentropy_with_logits)
這里代碼是無法在現(xiàn)在的tensorflow版本上跑的,如果想了解下keras上構(gòu)建上述模型的簡便性,可以看看這里. Keras在構(gòu)造深度模型的方便是大家眾所周知的,值得期待之后Keras在TensorFlow的更新:
TensorFlow High-Level APIs: Models in a Box
TensorFlow在靈活性、可擴(kuò)展性、可維護(hù)性上做的很好,但是現(xiàn)在在高級api、模塊式算法這塊原先都還不足,但是Google Brain的工程師在這個talk上介紹了一些High-level API的相關(guān)工作。
layers: 封裝了一些層的操作,簡化用原生TensorFlow源碼,比如new 一個variable來做weight等等;
Estimator or Keras: 封裝了一些更高層的操作包括,train和evaluate操作,用戶可以通過幾行代碼來快速構(gòu)建訓(xùn)練和評估過程;
Canned Estimators: 更高級API,所謂的Models in a box
構(gòu)造左圖中所示的深度網(wǎng)絡(luò)只需要如圖右中的七行代碼 同樣,構(gòu)建訓(xùn)練、評估、預(yù)測也很快可以通過api調(diào)用完成:
最后是Model in a Box
area = real_valued_column("square_foot")rooms = real_valued_column("num_rooms")zip_code = sparse_column_with_integerized_feature("zip_code", 100000)regressor = LinearRegressor(feature_columns=[area, room, zip_code])classifier.fit(train_input_fn)classifier.evaluate(eval_input_fn)
一些其他技術(shù)以及生態(tài)
ML Toolkit
TensorFlow可能最開始被人知曉,就是因為大家都覺得他是一個深度學(xué)習(xí)的框架,其實不是,現(xiàn)在TensorFlow上還有很多機(jī)器學(xué)習(xí)的算法集成:
而且算法API的開發(fā)都是仿照scikit-learn的風(fēng)格,有Python下做機(jī)器學(xué)習(xí)的小伙伴,可以很快的適應(yīng)。 這里值得提出的,有趣TensorFlow對機(jī)器學(xué)習(xí)和深度學(xué)習(xí)模型的支持,小伙伴們可以特別容易地結(jié)合傳統(tǒng)的機(jī)器學(xué)習(xí)方法和深度學(xué)習(xí)模型來一起訓(xùn)練:
分布式TensorFlow
TensorFlow在分布式性能上,前面也提到了,在1.0版本上有了很大的提升可以做到64塊GPU上達(dá)到58倍的加速,這里先基本介紹下數(shù)據(jù)并行和模型并行:
數(shù)據(jù)并行 每一個worker上有完整的模型,部分?jǐn)?shù)據(jù),參數(shù)的更新傳給Params Server;
模型并行 每一個worker上有部分的網(wǎng)絡(luò)模型;
怎么在TensorFlow寫分布式代碼,這里我就不說了,很簡單地配置,這里我講下,可能大部分像我這樣的小伙伴之前不太了解的一些彩蛋 在TensorFlow中做分布式訓(xùn)練的一些技巧,有過分布式train的經(jīng)驗應(yīng)該會很感激這些黑科技: – Round-Robin variables – Load balancing and partitioning
上面說的是啥呢? Params Server在保存模型的參數(shù)時,默認(rèn)是每一個ps存一個variable,然后下一個到下個ps上存,但是就會存在很多問題,可能這個variable很小,但是另一個很大,這樣你會發(fā)現(xiàn)ps和work 之間的帶寬的占用差距很多,怎么解決呢?看下面幾張圖
說點題外話,為啥我在看到這里的時候特別激動呢,筆者之前在開展團(tuán)隊內(nèi)部的分布式訓(xùn)練平臺時就遇到這個問題,我們在測試AlexNet模型時,發(fā)現(xiàn)多個ps上的帶寬占用差別極大,原因在與AlexNet模型的最后三個 全連接參數(shù)太多,造成了ps的不均衡。
上面說了下Distributed TensorFlow我特別激動的東西,之后talk的就是比較簡單的了,如果在TensorFlow做分布式的job,文檔里面都有,很簡單,這里不提了 不對,這里還必須說下TensorFlow對于容災(zāi)的一個支持: 下圖是幾種分布式下機(jī)器掛掉的情況:
多麻煩是吧,但是沒有關(guān)系,在TensorFlow下能夠自動對這些進(jìn)行一個快速的恢復(fù),只需要更改一行代碼
將模型布入生產(chǎn)環(huán)境
如何把訓(xùn)練好的模型快速部署在生產(chǎn)環(huán)境提供可用的服務(wù),TensorFlow Serving就是專注在這塊,我這里簡單介紹下吧:
把訓(xùn)練好的模型提供生產(chǎn)環(huán)境可用的服務(wù),通常有以下幾個需求:
長期穩(wěn)定服務(wù),低時延
支持多個模型服務(wù)
支持同一模型多版本
保證計算時耗盡量小以保證一些實時性需求
mini-batching的支持,以提高效率
TensorFlow Serving的設(shè)計就是為了解決這些需求,而且TensorFlow基于gRPC,支持多種語言。
TensorFlow生態(tài)
這部分講了如果利用TensorFlow生態(tài)結(jié)合一些流程的框架比如Spark、Hadoop等等來更好地使用TensorFlow。
數(shù)據(jù)準(zhǔn)備工作
支持的數(shù)據(jù)讀取方法,從快到慢依次是: 1.tf.Example, tf.SequenceExample對象; 2.原生的讀取CSV,JSON的OP 3.直接從Python feed數(shù)據(jù)(最簡單)
如何在其他如Hadoop, Spark上支持TFRecords(Beam原生支持) 見tensorflow ecosystem
集群的管理
TensorFlow支持以下多種框架:
分布式存儲
容器支持
模型導(dǎo)出
SavedModel: 1,TensorFlow模型的標(biāo)準(zhǔn)保存格式;2,包括以下必須的assets,比如vocabularies(不太會翻,啥意思);
GraphDef: 通常在移動設(shè)備的模型保存比較通用
移動端以及嵌入式應(yīng)用
Mobile and Embedded TensorFlow
這里介紹了怎么在移動設(shè)備比如安卓、IOS設(shè)備、樹莓派上面怎么使用TensorFlow來做一些開發(fā),具體的可能對移動設(shè)備程序開發(fā)的小伙伴們比較有用,我這里也不描述了,給個talk的 地址,有興趣的可以去看看吧。
Hands On TensorBoard
這個talk主要是介紹了TensorBoard的一些應(yīng)用,很多用法以前都沒有嘗試過,聽演講者描述之后受益匪淺。
# Define a simple convolutional layer def conv_layer(input, channels_in, channels_out):?
? ? w = tf.Variable(tf.zeros([5, 5, channels_in, channels_out]))?
? ? b = tf.Variable(tf.zeros([channels_out]))?
? ? conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")?
? ? act = tf.nn.relu(conv + b)?
? ? return act# And a fully connected layer def fc_layer(input, channels_in, channels_out):?
? ? w = tf.Variable(tf.zeros([channels_in, channels_out]))?
? ? b = tf.Variable(tf.zeros([channels_out]))?
? ? act = tf.nn.relu(tf.matmul(input, w) + b)?
? ? return act# Setup placeholders, and reshape the data x = tf.placeholder(tf.float32, shape=[None, 784]) y = tf.placeholder(tf.float32, shape=[None, 10]) x_image = tf.reshape(x, [-1, 28, 28, 1])# Create the network conv1 = conv_layer(x_image, 1, 32) pool1 = tf.nn.max_pool(conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")conv2 = conv_layer(pooled, 32, 64) pool2 = tf.nn.max_pool(conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME") flattened = tf.reshape(pool2, [-1, 7 * 7 * 64])fc1 = fc_layer(flattened, 7 * 7 * 64, 1024) logits = fc_layer(fc1, 1024, 10)# Compute cross entropy as our loss function cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))# Use an AdamOptimizer to train the network train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy)# compute the accuracy correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))# Initialize all the variables sess.run(tf.global_variables_initializer())# Train for 2000 steps for i in range(2000): batch = mnist.train.next_batch(100)# Occasionally report accuracy if i % 500 == 0: [train_accuracy] = sess.run([accuracy], feed_dict={x: batch[0], y: batch[1]})?
? ? print("step %d, training accuracy %g" % (i, train_accuracy))# Run the training step sess.run(train_step, feed_dict={x: batch[0], y_true: batch[1]})
很多小伙伴都寫過類似的代碼,構(gòu)造網(wǎng)絡(luò),然后設(shè)定訓(xùn)練方式,最后輸出一些基本的結(jié)果信息,如下:
step 0, training accuracy 10% step 500, training accuracy 12% step 1500, training accuracy 9% step 2000, training accuracy 13%
TensorFlow給你的不僅僅是這些,有一個特別棒的工具TensorBoard能夠可視化訓(xùn)練過程中的信息,能讓人直觀的感受,當(dāng)然需要一些簡單的配置:
寫入Graph
writer = tf.summary.FileWriter("/tmp/mnist_demo/1") writer.add_graph(sess.graph)
這里雖然能夠可視化Graph,卻感覺很雜亂,我們可以通過給一些node增加name,scope,讓圖變得更好看點:
def conv_layer(input, channels_in, channels_out, name="conv"):?
? ? with tf.name_scope(name):?
? ? ? ? w = tf.Variable(tf.zeros([5, 5, channels_in, channels_out]), name="W")?
? ? ? ? b = tf.Variable(tf.zeros([channels_out]), name="B")?
? ? ? ? conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")?
? ? ? ? act = tf.nn.relu(conv + b)?
? ? ? ? return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")def fc_layer(input, channels_in, channels_out, name="fc"):?
? ? with tf.name_scope(name):?
? ? ? ? w = tf.Variable(tf.zeros([channels_in, channels_out]), name="W")?
? ? ? ? b = tf.Variable(tf.zeros([channels_out]), name="B")?
? ? ? ? return tf.nn.relu(tf.matmul(input, w) + b)# Setup placeholders, and reshape the data x = tf.placeholder(tf.float32, shape=[None, 784], name="x") x_image = tf.reshape(x, [-1, 28, 28, 1]) y = tf.placeholder(tf.float32, shape=[None, 10], name="labels")conv1 = conv_layer(x_image, 1, 32, "conv1") conv2 = conv_layer(conv1, 32, 64, "conv2")flattened = tf.reshape(conv2, [-1, 7 * 7 * 64]) fc1 = fc_layer(flattened, 7 * 7 * 64, 1024, "fc1") logits = fc_layer(fc1, 1024, 10, "fc2")with tf.name_scope("xent"):?
? ? xent = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y))with tf.name_scope("train"):?
? ? train_step = tf.train.AdamOptimizer(1e-4).minimize(xent)with tf.name_scope("accuracy"):?
? ? correct_prediction = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))?
? ? accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))writer = tf.summary.FileWriter("/tmp/mnist_demo/2") writer.add_graph(sess.graph)
通過TensorFlow的api,收集更多的數(shù)據(jù)記錄顯示在TensorBoard中:
?tf.summary.Scalar(‘cross_entropy’, xent) tf.summary.scalar(‘a(chǎn)ccuracy’, accuracy) tf.summary.image(‘input’, x_image, 3)
修改Conv的代碼,將Weight,bias,act加入到histogram中:
def conv_layer(input, channels_in, channels_out, name="conv"):?
? ? with tf.name_scope(name):?
? ? w = tf.Variable(tf.zeros([5, 5, channels_in, channels_out]), name="W")?
? ? b = tf.Variable(tf.zeros([channels_out]), name="B")?
? ? conv = tf.nn.conv2d(input, w, strides=[1, 1, 1, 1], padding="SAME")?
? ? act = tf.nn.relu(conv + b)?
? ? tf.summary.histogram("weights", w)?
? ? tf.summary.histogram("biases", b)?
? ? tf.summary.histogram("activations", act)?
? ? return tf.nn.max_pool(act, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding="SAME")
配置將訓(xùn)練過程中的數(shù)據(jù)寫入:
merged_summary = tf.summary.merge_all() writer = tf.summary.FileWriter("/tmp/mnist_demo/3") writer.add_graph(sess.graph)for i in range(2001):?
? ? batch = mnist.train.next_batch(100)?
? ? if i % 5 == 0:?
? ? ? ? s = sess.run(merged_summary, feed_dict={x: batch[0], y: batch[1]})?
? ? ? ? writer.add_summary(s, i)?
? ? ? ? sess.run(train_step, feed_dict={x: batch[0], y: batch[1]})
Hyperparameter Search
這次這個TensorBoard的talk給我較大的收獲就是用TensorBoard做Hyperparamter Search 是這么的方便, 這次talk中主要演示超參的兩個方面:
不同學(xué)習(xí)率
不同網(wǎng)絡(luò)結(jié)構(gòu)
代碼如下:
# Try a few learning rates for learning_rate in [1E-3, 1E-4, 1E-5]:
? ? # Try a model with fewer layers for use_two_fc in [True, False]:?
? ? for use_two_conv in [True, False]:
? ? # Construct a hyperparameter string for each one (example: "lr_1E-3,fc=2,conv=2)?
? ? ? ? hparam_str = make_hparam_string(learning_rate, use_two_fc, use_two_conv)
? ? ? ? writer = tf.summary.FileWriter("/tmp/mnist_tutorial/" + hparam_str)
? ? ? ? # Actually run with the new settings?
? ? ? ? mnist(learning_rate, use_two_fully_connected_layers, use_two_conv_layers, writer)
tensorboard --logdir /tmp/mnist_tutorial
Embedding Visualizer
embedding = tf.Variable(tf.zeros([10000, embedding_size]), name="test_embedding") assignment = embedding.assign(embedding_input)config = tf.contrib.tensorboard.plugins.projector.ProjectorConfig() embedding_config = config.embeddings.add() embedding_config.tensor_name = embedding.name?
embedding_config.sprite.image_path = os.path.join(LOG_DIR, "sprite.png") # Specify the width and height of a single thumbnail. embedding_config.sprite.single_image_dim.extend([28, 28]) tf.contrib.tensorboard.plugins.projector.visualize_embeddings(writer, config)for i in range(2001):?
? ? batch = mnist.train.next_batch(100)?
? ? if i % 5 == 0:?
? ? ? ? [train_accuracy, s] = sess.run([accuracy, summ], feed_dict={x: batch[0], y: batch[1]})?
? ? ? ? writer.add_summary(s, i)?
? ? if i % 500 == 0:?
? ? ? ? sess.run(assignment, feed_dict={x: mnist.test.images, y_true: mnist.test.labels})?
? ? ? ? saver.save(sess, os.path.join(LOG_DIR, "model.ckpt"), i)?
? ? sess.run(train_step, feed_dict={x: batch[0], y_true: batch[1]})
Future for TensorBoard
未來TensorBoard,會在以下三個方面來做一些提升:
在TensorBoard上集成Tensorflow的調(diào)試
增加插件的支持
企業(yè)級TensorBoard的支持
總結(jié)
照例總結(jié)下,從上面不難看出TensorFlow在過去一年的時間里確實做了很多很有意思的工作,無論是在Reasearch還是Production上,包括各種有意思的工具,其中收獲較大的是利用TensorFlow來做超參的調(diào)節(jié)、還有Keras的新的支持、分布式的各種模型變量保存的優(yōu)化方法、分布式容災(zāi)、XLA的支持是的模型更快,這么幾天的時間花費感覺沒有浪費,但是因為個人知識有限,如上面有錯誤或者不周到 的地方,歡迎指出,敬請諒解。
感謝
十分感謝InfoQ的Tina Du對文章一些編輯工作,做了很多文字方面的總結(jié)
歡迎加入本站公開興趣群商業(yè)智能與數(shù)據(jù)分析群
興趣范圍包括各種讓數(shù)據(jù)產(chǎn)生價值的辦法,實際應(yīng)用案例分享與討論,分析工具,ETL工具,數(shù)據(jù)倉庫,數(shù)據(jù)挖掘工具,報表系統(tǒng)等全方位知識
QQ群:81035754
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/4479.html
摘要:云主機(jī)產(chǎn)品簡介增強(qiáng)型云主機(jī)是基于成熟的云計算技術(shù),專享高性能硬件的云主機(jī)服務(wù)。目前提供采用采用和采用機(jī)型。支持多種操作系統(tǒng)增強(qiáng)型云主機(jī)支持多種操作系統(tǒng),如等,以適應(yīng)不同行業(yè)的專業(yè)軟件及建模需求。機(jī)型與性能型可選顆。GPU云主機(jī)UHost產(chǎn)品簡介GPU增強(qiáng)型云主機(jī)是基于UCloud成熟的云計算技術(shù),專享高性能GPU硬件的云主機(jī)服務(wù)。大幅提升圖形圖像處理和高性能計算能力,并具備彈性、低成本、易于...
摘要:深度學(xué)習(xí)在過去的幾年里取得了許多驚人的成果,均與息息相關(guān)。機(jī)器學(xué)習(xí)進(jìn)階筆記之一安裝與入門是基于進(jìn)行研發(fā)的第二代人工智能學(xué)習(xí)系統(tǒng),被廣泛用于語音識別或圖像識別等多項機(jī)器深度學(xué)習(xí)領(lǐng)域。零基礎(chǔ)入門深度學(xué)習(xí)長短時記憶網(wǎng)絡(luò)。 多圖|入門必看:萬字長文帶你輕松了解LSTM全貌 作者 | Edwin Chen編譯 | AI100第一次接觸長短期記憶神經(jīng)網(wǎng)絡(luò)(LSTM)時,我驚呆了。原來,LSTM是神...
閱讀 2418·2023-04-26 00:46
閱讀 581·2023-04-25 21:36
閱讀 729·2021-11-24 10:19
閱讀 2266·2021-11-23 09:51
閱讀 1015·2021-10-21 09:39
閱讀 830·2021-09-22 10:02
閱讀 1664·2021-09-03 10:29
閱讀 2676·2019-08-30 15:53