今年一月份,Stanford大學(xué)新開了一門課專門講如何用tensorflow做科研,這門課從最基礎(chǔ)的計(jì)算圖講起,擴(kuò)展到非常流行的算法,如neural style,seq2seq等等,通過課程和作業(yè),能夠掌握tensorflow大部分的用法。因?yàn)樘脹]有使用tensorflow了,所以決定學(xué)學(xué)這門課重新復(fù)習(xí)一下,這是課程網(wǎng)址和github,沒有官方的視頻,youtube和b站上有其他人根據(jù)slide錄的視頻。
我會學(xué)習(xí)這門課,然后記錄筆記,完成github上的代碼作為練習(xí),同時(shí)會對代碼中一些錯(cuò)誤進(jìn)行修正。
下面是lecture1的學(xué)習(xí)筆記。
介紹
深度學(xué)習(xí)后面的數(shù)學(xué)概念已經(jīng)存在10多年,但是深度學(xué)習(xí)框架是最近幾年才出來的?,F(xiàn)在大量的框架在靈活性上和?便于工業(yè)界使用上做了權(quán)衡,?靈活性對于科研非常重要,但是對于工業(yè)界太慢了,但是換句話說,足夠快,能夠用于分布式的框架只適用于特別的網(wǎng)絡(luò)結(jié)構(gòu),這對科研又不夠靈活。這留給了使用者一個(gè)矛盾的境地:我們是否應(yīng)該嘗試用沒有那么靈活的框架做科研,這樣當(dāng)應(yīng)用于工業(yè)界的時(shí)候,我們不必再重新用另外一個(gè)框架復(fù)現(xiàn)代碼;或者是我們是否應(yīng)該在做研究的時(shí)候使用一個(gè)框架,在工業(yè)界應(yīng)用的時(shí)候使用另外一個(gè)完全不同的框架呢?
如果選擇前者,那么做研究的時(shí)候并不方便嘗試很多不同類型的網(wǎng)絡(luò),如果選擇后者,我們必須要重新復(fù)現(xiàn)代碼,這容易導(dǎo)致實(shí)驗(yàn)結(jié)果和工業(yè)應(yīng)用上不同,我們也需要付出很多精力去學(xué)習(xí)。
TensorFlow的出現(xiàn)希望解決這個(gè)矛盾的事情。
什么是TensorFlow?
使用數(shù)據(jù)流和圖來做數(shù)值計(jì)算的開源軟件,用于機(jī)器智能
主要是由Google Brain團(tuán)隊(duì)開發(fā)用于機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)的研究
能夠應(yīng)用于廣泛的領(lǐng)域
雖然TensorFlow是開源的,但是只有GitHub上的部分是開源的,Google還有一個(gè)內(nèi)部版本,官方說法是Google的內(nèi)部版本有很多轉(zhuǎn)為其定制的工具和服務(wù),大眾沒有需求使用,并不是Google?的開源沒有誠意,希望如此吧。
為什么使用TensorFlow?
Python API,這是大多數(shù)深度學(xué)習(xí)框架都有的
能夠使用多個(gè)CPU和GPU,最重要的是能夠很容易部署到服務(wù)器上和移動端,這是很多框架不能做的事
足夠靈活,非常低層
tensorboard可視化非常好
Checkpoints作為實(shí)驗(yàn)管理,能夠隨時(shí)保存模型
自動微分
龐大的社區(qū)
大量優(yōu)秀的項(xiàng)目正在使用TensorFlow
Getting Started
tensor
0-d tensor:標(biāo)量,1-d tensor:向量,2-d tensor:矩陣
數(shù)據(jù)流圖

import tensorflow as tf
a = tf.add(3, 5)
print(a)
>> Tensor("Add: 0", shape=(), dtype=int32)
并不能得到8,需要開啟session,在session中操作能夠被執(zhí)行,Tensor能夠被計(jì)算,這點(diǎn)有點(diǎn)反人類,跟一般的推斷式編程是不同的,比如PyTorch
import tensorflow as tf
a = tf.add(3, 5)
sess = tf.Session()
print(sess.run(a))
sess.close()
>> 8
當(dāng)然可以使用一種更高效的寫法
import tensorflow as tf
a = tf.add(3, 5)
with tf.Session() as sess:
print(sess.run(a))
當(dāng)然可以建立更復(fù)雜的計(jì)算圖如下
x = 2
y = 3
add_op = tf.add(x, y)
mul_op = tf.mul(x, y)
useless = tf.mul(x, add_op)
pow_op = tf.pow(add_op, mul_op)
with tf.Session() as sess:
z, not_useless = sess.run([pow_op, useless])
在sess.run調(diào)用的時(shí)候使用[]來得到多個(gè)結(jié)果。
也可以將圖分成很多小塊,讓他們在多個(gè)CPU和GPU下并行

可以將計(jì)算圖的一部分放在特定的GPU或者CPU下
with tf.device('/gpu:2'):
a = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]], name='a')
b = tf.constant([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]], name='b')
c = tf.matmul(a, b)
sess = tf.Session(config=tf.ConfigProto(log_device_placement=True))
print(sess.run(c))
盡量不要使用多個(gè)計(jì)算圖,因?yàn)槊總€(gè)計(jì)算圖需要一個(gè)session,而每個(gè)session會使用所有的顯卡資源,必須要用python/numpy才能在兩個(gè)圖之間傳遞數(shù)據(jù),最好在一個(gè)圖中建立兩個(gè)不聯(lián)通的子圖
為什么使用Graph
節(jié)約計(jì)算資源,每次運(yùn)算僅僅只需運(yùn)行與結(jié)果有關(guān)的子圖
可以將圖分成小塊進(jìn)行自動微分
方便部署在多個(gè)設(shè)備上
很多機(jī)器學(xué)習(xí)算法都能夠被可視化為圖的結(jié)構(gòu)
以上就是第一個(gè)lecture的學(xué)習(xí)筆記。
本文的內(nèi)容和代碼都在該github上
歡迎訪問我的博客
歡迎查看我的知乎專欄,深度煉丹