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