【導讀】TensorFlow 在 2015 年年末一出現就受到了極大的關注,通過一年多的發展,已經成爲了在機器學習、深度學習項目中最受歡迎的框架之一。自發布以來,TensorFlow 不斷在完善並增長新功能,直到在此次大會上發佈了穩定版本的 TensorFlow V1.0。此次是谷歌第一次舉辦的TensorFlow開發者和愛好者大會,咱們從主題演講、有趣應用、技術生態、移動端和嵌入式應用多方面總結此次大會上的Submit,但願能對TensorFlow開發者有所幫助。node
TensorFlow:面向大衆的機器學習框架python
TensorFlow在過去得到成績主要有如下幾點:ios
TensorFlow被應用在Google不少的應用包括:Gmail, Google Play Recommendation, Search, Translate, Map等等;git
在醫療方面,TensorFlow被科學家用來搭建根據視網膜來預防糖尿病致盲(後面也提到Stanford的PHD使用TensorFlow來預測皮膚癌,相關工做上了Nature封面);github
經過在音樂、繪畫這塊的領域使用TensorFlow構建深度學習模型來幫助人類更好地理解藝術;算法
使用TensorFlow框架和高科技設備,構建自動化的海洋生物檢測系統,用來幫助科學家瞭解海洋生物的狀況;api
TensorFlow在移動客戶端發力,有多款在移動設備上使用TensorFlow作翻譯、風格化等工做;緩存
TensorFlow在移動設備CPU(高通820)上,可以達到更高的性能和更低的功耗;網絡
TensorFlow ecosystem結合其餘開源項目可以快速地搭建高性能的生產環境;app
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. 數據準備工做
支持的數據讀取方法,從快到慢依次是:
tf.Example, tf.SequenceExample對象;
原生的讀取CSV,JSON的OP;
直接從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的支持是的模型更快,那麼花在看這些演講上的時間感受沒有浪費,可是由於我的知識有限,如上面有錯誤或者不周到的地方,歡迎指出,敬請諒解。