cs20si:tensorflow for research 學(xué)習(xí)筆記1

今年一月份,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ù)流圖

screenshot.png
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下并行

screenshot.png

可以將計(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

  1. 節(jié)約計(jì)算資源,每次運(yùn)算僅僅只需運(yùn)行與結(jié)果有關(guān)的子圖

  2. 可以將圖分成小塊進(jìn)行自動微分

  3. 方便部署在多個(gè)設(shè)備上

  4. 很多機(jī)器學(xué)習(xí)算法都能夠被可視化為圖的結(jié)構(gòu)

以上就是第一個(gè)lecture的學(xué)習(xí)筆記。


本文的內(nèi)容和代碼都在該github

歡迎訪問我的博客

歡迎查看我的知乎專欄,深度煉丹

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. 介紹 首先讓我們來看看TensorFlow! 但是在我們開始之前,我們先來看看Python API中的Ten...
    JasonJe閱讀 11,986評論 1 32
  • 動車上,鄰座老大叔的公務(wù)包拉鏈壞了,他在我眼前來回的開開合合,黝黑的手笨戳地操作著。明明我可以幫助他的,在伸手剎那...
    童姥閱讀 416評論 1 2
  • 旅游在中國已經(jīng)成為老百姓生活的一部分。節(jié)假日各大旅游景點(diǎn)被踩爆,平日里也經(jīng)常聽到生活中熟知的某某去哪哪旅游的聲音。...
    尹丁閱讀 697評論 0 4
  • 轉(zhuǎn)眼快到八月底了。我與簡書結(jié)緣已快兩個(gè)月了。每天在簡書上讀讀寫寫成了我生活中的功課。在這里讀文讀詩讀各種故事長各種...
    岷水若風(fēng)閱讀 480評論 2 2

友情鏈接更多精彩內(nèi)容