cs20si: tensorflow for research 學習筆記1
今年一月份,Stanford大學新開了一門課專門講如何用tensorflow做科研,這門課從最基礎的計算圖講起,擴展到非常流行的演算法,如neural style,seq2seq等等,通過課程和作業,能夠掌握tensorflow大部分的用法。因為太久沒有使用tensorflow了,所以決定學學這門課重新複習一下,這是課程網站和github,沒有官方的視頻,youtube和b站上有其他人根據slide錄的視頻。
我會學習這門課,然後記錄筆記,完成github上的代碼作為練習,同時會對代碼中一些錯誤進行修正。
下面是lecture1的學習筆記。
介紹
深度學習後面的數學概念已經存在10多年,但是深度學習框架是最近幾年才出來的。現在大量的框架在靈活性上和便於工業界使用上做了權衡,靈活性對於科研非常重要,但是對於工業界太慢了,但是換句話說,足夠快,能夠用於分散式的框架只適用於特別的網路結構,這對科研又不夠靈活。這留給了使用者一個矛盾的境地:我們是否應該嘗試用沒有那麼靈活的框架做科研,這樣當應用於工業界的時候,我們不必再重新用另外一個框架復現代碼;或者是我們是否應該在做研究的時候使用一個框架,在工業界應用的時候使用另外一個完全不同的框架呢?
如果選擇前者,那麼做研究的時候並不方便嘗試很多不同類型的網路,如果選擇後者,我們必須要重新復現代碼,這容易導致實驗結果和工業應用上不同,我們也需要付出很多精力去學習。
TensorFlow的出現希望解決這個矛盾的事情。
什麼是TensorFlow?
- 使用數據流和圖來做數值計算的開源軟體,用於機器智能
- 主要是由Google Brain團隊開發用於機器學習和深度神經網路的研究
- 能夠應用於廣泛的領域
雖然TensorFlow是開源的,但是只有GitHub上的部分是開源的,Google還有一個內部版本,官方說法是Google的內部版本有很多轉為其定製的工具和服務,大眾沒有需求使用,並不是Google的開源沒有誠意,希望如此吧。
為什麼使用TensorFlow?
- Python API,這是大多數深度學習框架都有的
- 能夠使用多個CPU和GPU,最重要的是能夠很容易部署到伺服器上和移動端,這是很多框架不能做的事
- 足夠靈活,非常低層
- tensorboard可視化非常好
- Checkpoints作為實驗管理,能夠隨時保存模型
- 自動微分
- 龐大的社區
- 大量優秀的項目正在使用TensorFlow
Getting Started
tensor
0-d tensor:標量,1-d tensor:向量,2-d tensor:矩陣
數據流圖
import tensorflow as tfna = tf.add(3, 5)nprint(a)n>> Tensor("Add: 0", shape=(), dtype=int32)n
並不能得到8,需要開啟session,在session中操作能夠被執行,Tensor能夠被計算,這點有點反人類,跟一般的推斷式編程是不同的,比如PyTorch
import tensorflow as tfna = tf.add(3, 5)nsess = tf.Session()nprint(sess.run(a))nsess.close()n>> 8n
當然可以使用一種更高效的寫法
import tensorflow as tfna = tf.add(3, 5)nwith tf.Session() as sess:n print(sess.run(a))n>> 8n
當然可以建立更複雜的計算圖如下
x = 2ny = 3nadd_op = tf.add(x, y)nmul_op = tf.mul(x, y)nuseless = tf.mul(x, add_op)npow_op = tf.pow(add_op, mul_op)nwith tf.Session() as sess:n z, not_useless = sess.run([op3, useless])n
在`sess.run`調用的時候使用[]來得到多個結果。
也可以將圖分成很多小塊,讓他們在多個CPU和GPU下並行
可以將計算圖的一部分放在特定的GPU或者CPU下
with tf.device(/gpu:2):n a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], name=a)n b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], name=b)n c = tf.matmul(a, b)nnsess = tf.Session(config=tf.ConfigProto(log_device_placement=True))nprint(sess.run(c))n
盡量不要使用多個計算圖,因為每個計算圖需要一個session,而每個session會使用所有的顯卡資源,必須要用python/numpy才能在兩個圖之間傳遞數據,最好在一個圖中建立兩個不聯通的子圖
為什麼使用Graph
1. 節約計算資源,每次運算僅僅只需運行與結果有關的子圖
2. 可以將圖分成小塊進行自動微分
3. 方便部署在多個設備上
4. 很多機器學習演算法都能夠被可視化為圖的結構
以上就是第一個lecture的學習筆記。
本文的內容和代碼都在該github上
歡迎訪問我的博客
歡迎查看我的知乎專欄,深度煉丹
推薦閱讀:
※Quo Vadis, Action Recognition? A New Model and the Kinetics
※五分鐘喝不完一杯咖啡,但五分鐘可以帶你入門TensorFlow
※Tensorflow源碼解讀(一):AttentionnSeq2Seq模型
※配置深度學習主機與環境(TensorFlow+1080Ti) | 第一章:硬體選購與主機組裝
※ChatGirl 一個基於 TensorFlow Seq2Seq 模型的聊天機器人
TAG:TensorFlow |