1. 程式人生 > >【轉載】史上最全:TensorFlow 好玩的技術、應用和你不知道的黑科技

【轉載】史上最全:TensorFlow 好玩的技術、應用和你不知道的黑科技

tube map 高性能 知識 seq 出現 執行時間 mes lex

【導讀】TensorFlow 在 2015 年年底一出現就受到了極大的關註,經過一年多的發展,已經成為了在機器學習、深度學習項目中最受歡迎的框架之一。自發布以來,TensorFlow 不斷在完善並增加新功能,直到在這次大會上發布了穩定版本的 TensorFlow V1.0。這次是谷歌第一次舉辦的TensorFlow開發者和愛好者大會,我們從主題演講、有趣應用、技術生態、移動端和嵌入式應用多方面總結這次大會上的Submit,希望能對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比較有技術含量,相信各位會更加有興趣。

  有趣的應用案例

  皮膚癌圖像分類

首先我們說下兩個數據:1. 醫療機構統計皮膚癌在早期的治愈率是98%;2. 在2020,預計全球有61億臺智能手機。

這位小哥做的工作是啥呢,他拿到了一批皮膚癌的數據,然後使用一個pretrained的inception-v3對數據來做一個inference:

技術分享

最終結果:

技術分享

而且在手機上很容易搭建,完成一個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: 音樂和藝術生成

這個項目講的是利用深度學習來做一些藝術相關的工作,項目地址:https://github.com/tensorflow/magenta有一些很好玩的東西,如風格化,生成藝術家風格的音樂,利用深度學習模型模擬人類對藝術的想象力,創造出屬於DeepLearning的藝術風格。

  DeepMind團隊所做的一些開發工作

DeepMind在被Google收購之後,也選擇TensorFlow作為其深度學習相關研究的平臺,然後做了很多很有意思的東西。

  1. Data Center Cooling

這是Google在全世界各地若幹個數據中心之一:

技術分享

然後這群Google的小夥伴做了些什麽事情呢?

技術分享

Google的小夥伴利用強化學習,是的!你沒有聽錯,應用在AlphaGo上的一種技術來做數據中心冷卻設備的自動控制,並且效果十分顯著:

技術分享

  2. Gorila

Gorial是DeepMind下的一個強化學習的框架,基於TensorFlow的高級API實現,很穩定,只需要更改其中極少部分代碼就可以完成新的實驗,支持分布式訓練,十分高效,並且訓練好的模型可以通過TensorFlow Serving快速地部署到生產環境。

  3. AlphaGo

這個相信不說,大家都知道的,第一次在圍棋上打敗人類,然後升級版的Master 連續60盤不敗,原理不說了,網絡上很多分析文章,貼兩張圖聊表敬意:

  技術分享

  技術分享

  技術分享

  技術分享

  4. WaveNet:語音音頻合成

這裏DeepMind的小哥演示了WaveNet的一些demo, 具體的可以參見(https://deepmind.com/blog/wavenet-generative-model-raw-audio/)來了解。貼一些效果對比:

技術分享

  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原理涉及到編譯器,這塊不是我擅長的地方,所以這裏就這樣過了, 如果有興趣的小夥伴可以關註下(https://www.tensorflow.org/versions/master/experimental/xla/)還有此次TensorFlowDev Submit上XLA的talk(https://www.youtube.com/watch?v=kAOanJczHA0&index=2&list=PLOU2XLYxmsIKGc_NBoIhTn2Qhraji53cv#t=108.706756)

最後貼幾張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 Submit上講了以下內容:

技術分享

所以之後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))cnn = tf.keras.applications.InceptionV3(weights=‘imagenet‘, include_top=False, pool=‘avg)cnn.trainable = Falseencoded_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)

這裏代碼是無法在現在的tensorflow版本上跑的,如果想了解下keras上構建上述模型的簡便性,可以看看Keras的文檔(https://keras.io/getting-started/functional-api-guide/)。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

技術分享

構造左圖中所示的深度網絡只需要如圖右中的七行代碼同樣,構建訓練、評估、預測也很快可以通過api調用完成:

技術分享

最後是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)

技術分享

  其他技術及生態

  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. 數據準備工作

支持的數據讀取方法,從快到慢依次是:

  1. tf.Example, tf.SequenceExample對象;

  2. 原生的讀取CSV,JSON的OP;

  3. 直接從Python feed數據(最簡單)。

如何在其他如Hadoop, Spark上支持TFRecords(Beam原生支持) 見(github.com/tensorflow/ecosystem)

  2. 集群的管理

TensorFlow支持以下多種框架:

技術分享

  3. 分布式存儲

技術分享

  4. 容器支持

技術分享

  5. 模型導出

  • SavedModel: 1,TensorFlow模型的標準保存格式;2,包括以下必須的assets,比如vocabularies(不太會翻,啥意思);

  • GraphDef: 通常在移動設備的模型保存比較通用。

  移動端以及嵌入式應用

  Mobile and Embedded TensorFlow

Pete Warden介紹了怎麽在移動設備比如安卓、IOS設備、樹莓派上面怎麽使用TensorFlow來做一些開發,具體的可能對移動設備程序開發的小夥伴們比較有用,有興趣的可以去看看https://www.youtube.com/watch?v=0r9w3V923rk&index=9&list=PLOU2XLYxmsIKGc_NBoIhTn2Qhraji53cv

  Hands On TensorBoard

這個talk主要是介紹了TensorBoard的一些應用,很多用法以前都沒有嘗試過,聽演講者描述之後受益匪淺。

  # 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]})

很多小夥伴都寫過類似的代碼,構造網絡,然後設定訓練方式,最後輸出一些基本的結果信息,如下:

  step 0, training accuracy 10% step 500, training accuracy 12% step 1500, training accuracy 9% step 2000, training accuracy 13%

TensorFlow給你的不僅僅是這些,有一個特別棒的工具TensorBoard能夠可視化訓練過程中的信息,能讓人直觀的感受,當然需要一些簡單的配置:

寫入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,收集更多的數據記錄顯示在TensorBoard中:

  tf.summary.scalar(‘cross_entropy‘, xent) tf.summary.scalar(‘accuracy‘, 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")

配置將訓練過程中的數據寫入:

  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中主要演示超參的兩個方面:

  • 不同學習率

  • 不同網絡結構

# 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的調試

  • 增加插件的支持

  • 企業級TensorBoard的支持

  總結

照例總結下,從上面不難看出TensorFlow在過去一年的時間裏確實做了很多很有意思的工作,無論是在Reasearch還是Production上,包括各種有意思的工具,其中收獲最大的是利用TensorFlow來做超參的調節、還有Keras的新的支持、分布式的各種模型變量保存的優化方法、分布式容災、XLA的支持是的模型更快,那麽花在看這些演講上的時間感覺沒有浪費,但是因為個人知識有限,如上面有錯誤或者不周到的地方,歡迎指出,敬請諒解。

【轉載】史上最全:TensorFlow 好玩的技術、應用和你不知道的黑科技