CS224d-Day 2:TensorFlow 入门
CS224d-Day 2:
在 Day 1 里,先了解了一下 NLP 和 DP 的主要概念,對(duì)它們有了一個(gè)大體的印象,用向量去表示研究對(duì)象,用神經(jīng)網(wǎng)絡(luò)去學(xué)習(xí),用 TensorFlow 去訓(xùn)練模型,基本的模型和算法包括 word2vec,softmax,RNN,LSTM,GRU,CNN,大型數(shù)據(jù)的 seq2seq,還有未來(lái)比較火熱的研究方向 DMN,還有模型的調(diào)優(yōu)。
今天先不直接進(jìn)入理論學(xué)習(xí),而是先學(xué)習(xí)一下 TensorFlow,在原課程里,這部分在第7講,但是我覺(jué)得最高效地學(xué)習(xí)算法的方式,就是一邊學(xué)理論,一邊寫(xiě)代碼,實(shí)踐中才能理解更深刻。
Day 2 先認(rèn)識(shí) TensorFlow,了解一下基本用法,下一次就寫(xiě)代碼來(lái)訓(xùn)練模型算法,以問(wèn)題為導(dǎo)向,以項(xiàng)目為驅(qū)動(dòng)。
本文結(jié)構(gòu):
- 1. TensorFlow 是什么
- 2. 為什么需要 TensorFlow
- 3. TensorFlow 的優(yōu)點(diǎn)
- 4. TensorFlow 的工作原理
- 5. 安裝
- 6. TensorFlow 基本用法
- 要點(diǎn)
- 例子
- 概念
- 圖
- 張量
- 會(huì)話(huà)
1. TensorFlow 是什么
是一個(gè)深度學(xué)習(xí)庫(kù),由 Google 開(kāi)源,可以對(duì)定義在 Tensor(張量)上的函數(shù)自動(dòng)求導(dǎo)。
Tensor(張量)意味著 N 維數(shù)組,Flow(流)意味著基于數(shù)據(jù)流圖的計(jì)算,TensorFlow即為張量從圖的一端流動(dòng)到另一端。
它的一大亮點(diǎn)是支持異構(gòu)設(shè)備分布式計(jì)算,它能夠在各個(gè)平臺(tái)上自動(dòng)運(yùn)行模型,從電話(huà)、單個(gè)CPU / GPU到成百上千GPU卡組成的分布式系統(tǒng)。
支持CNN、RNN和LSTM算法,是目前在 Image,NLP 最流行的深度神經(jīng)網(wǎng)絡(luò)模型。
2. 為什么需要 TensorFlow 等庫(kù)
深度學(xué)習(xí)通常意味著建立具有很多層的大規(guī)模的神經(jīng)網(wǎng)絡(luò)。
除了輸入X,函數(shù)還使用一系列參數(shù),其中包括標(biāo)量值、向量以及最昂貴的矩陣和高階張量。
在訓(xùn)練網(wǎng)絡(luò)之前,需要定義一個(gè)代價(jià)函數(shù),常見(jiàn)的代價(jià)函數(shù)包括回歸問(wèn)題的方差以及分類(lèi)時(shí)候的交叉熵。
訓(xùn)練時(shí),需要連續(xù)的將多批新輸入投入網(wǎng)絡(luò),對(duì)所有的參數(shù)求導(dǎo)后,代入代價(jià)函數(shù),從而更新整個(gè)網(wǎng)絡(luò)模型。
這個(gè)過(guò)程中有兩個(gè)主要的問(wèn)題:1. 較大的數(shù)字或者張量在一起相乘百萬(wàn)次的處理,使得整個(gè)模型代價(jià)非常大。2. 手動(dòng)求導(dǎo)耗時(shí)非常久。
所以 TensorFlow 的對(duì)函數(shù)自動(dòng)求導(dǎo)以及分布式計(jì)算,可以幫我們節(jié)省很多時(shí)間來(lái)訓(xùn)練模型。
3. TensorFlow 的優(yōu)點(diǎn)
第一,基于Python,寫(xiě)的很快并且具有可讀性。
第二,在多GPU系統(tǒng)上的運(yùn)行更為順暢。
第三,代碼編譯效率較高。
第四,社區(qū)發(fā)展的非常迅速并且活躍。
第五,能夠生成顯示網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)和性能的可視化圖。
4. TensorFlow 的工作原理
TensorFlow是用數(shù)據(jù)流圖(data flow graphs)技術(shù)來(lái)進(jìn)行數(shù)值計(jì)算的。
數(shù)據(jù)流圖是描述有向圖中的數(shù)值計(jì)算過(guò)程。
有向圖中,節(jié)點(diǎn)通常代表數(shù)學(xué)運(yùn)算,邊表示節(jié)點(diǎn)之間的某種聯(lián)系,它負(fù)責(zé)傳輸多維數(shù)據(jù)(Tensors)。
節(jié)點(diǎn)可以被分配到多個(gè)計(jì)算設(shè)備上,可以異步和并行地執(zhí)行操作。因?yàn)槭怯邢驁D,所以只有等到之前的入度節(jié)點(diǎn)們的計(jì)算狀態(tài)完成后,當(dāng)前節(jié)點(diǎn)才能執(zhí)行操作。
5. 安裝
極客學(xué)院有官方文檔翻譯版,講的很清楚,有各種安裝方式的講解。
我選擇基于 Anaconda 的安裝,因?yàn)檫@個(gè)很方便。
Anaconda 是一個(gè)集成許多第三方科學(xué)計(jì)算庫(kù)的 Python 科學(xué)計(jì)算環(huán)境,用 conda 作為自己的包管理工具,同時(shí)具有自己的計(jì)算環(huán)境,類(lèi)似 Virtualenv。
安裝 Anaconda
我之前已經(jīng)安裝過(guò) Anaconda 了,直接從下面進(jìn)行:建立一個(gè) conda 計(jì)算環(huán)境
- 激活環(huán)境,使用 conda 安裝 TensorFlow
安裝成功后,每次使用 TensorFlow 的時(shí)候需要激活 conda 環(huán)境
conda 環(huán)境激活后,你可以測(cè)試是否成功,在終端進(jìn)入 python,輸入下面代碼,沒(méi)有提示錯(cuò)誤,說(shuō)明安裝 TensorFlow 成功:
- 當(dāng)你不用 TensorFlow 的時(shí)候,關(guān)閉環(huán)境:
- 再次使用的時(shí)候再激活:
在 Jupyter notebook 里用 TensorFlow
我在 (tensorflow)$ 直接輸入 jupyter notebook 后,輸入 import tensorflow as tf 是有錯(cuò)誤的,可以參考這里。
6. TensorFlow 基本用法
接下來(lái)按照官方文檔中的具體代碼,來(lái)看一下基本用法。
你需要理解在TensorFlow中,是如何:
- 將計(jì)算流程表示成圖;
- 通過(guò)Sessions來(lái)執(zhí)行圖計(jì)算;
- 將數(shù)據(jù)表示為tensors;
- 使用Variables來(lái)保持狀態(tài)信息;
- 分別使用feeds和fetches來(lái)填充數(shù)據(jù)和抓取任意的操作結(jié)果;
先看個(gè)栗子:
例1,生成三維數(shù)據(jù),然后用一個(gè)平面擬合它:
注意這幾條代碼:
W = tf.Variable(tf.random_uniform([1, 2], -1.0, 1.0))y = tf.matmul(W, x_data) + binit = tf.initialize_all_variables()sess = tf.Session() sess.run(init)sess.run(train) print step, sess.run(W), sess.run(b)接下來(lái)看具體概念:
- TensorFlow 用圖來(lái)表示計(jì)算任務(wù),圖中的節(jié)點(diǎn)被稱(chēng)之為operation,縮寫(xiě)成op。
- 一個(gè)節(jié)點(diǎn)獲得 0 個(gè)或者多個(gè)張量 tensor,執(zhí)行計(jì)算,產(chǎn)生0個(gè)或多個(gè)張量。
- 圖必須在會(huì)話(huà)(Session)里被啟動(dòng),會(huì)話(huà)(Session)將圖的op分發(fā)到CPU或GPU之類(lèi)的設(shè)備上,同時(shí)提供執(zhí)行op的方法,這些方法執(zhí)行后,將產(chǎn)生的張量(tensor)返回。
1. 構(gòu)建圖
例2,計(jì)算矩陣相乘:
默認(rèn)圖有三個(gè)節(jié)點(diǎn), 兩個(gè) constant() op, 和一個(gè) matmul() op. 為了真正進(jìn)行矩陣相乘運(yùn)算, 并得到矩陣乘法的結(jié)果, 你必須在會(huì)話(huà)里啟動(dòng)這個(gè)圖.
2. 張量 Tensor
從向量空間到實(shí)數(shù)域的多重線(xiàn)性映射(multilinear maps)(v是向量空間,v*是對(duì)偶空間)
例如代碼中的 [[3., 3.]],Tensor 可以看作是一個(gè) n 維的數(shù)組或列表。在 TensorFlow 中用 tensor 數(shù)據(jù)結(jié)構(gòu)來(lái)代表所有的數(shù)據(jù), 計(jì)算圖中, 操作間傳遞的數(shù)據(jù)都是 tensor。
3. 在一個(gè)會(huì)話(huà)中啟動(dòng)圖
創(chuàng)建一個(gè) Session 對(duì)象, 如果無(wú)任何創(chuàng)建參數(shù), 會(huì)話(huà)構(gòu)造器將啟動(dòng)默認(rèn)圖。
會(huì)話(huà)負(fù)責(zé)傳遞 op 所需的全部輸入,op 通常是并發(fā)執(zhí)行的。
交互式使用
在 Python API 中,使用一個(gè)會(huì)話(huà) Session 來(lái) 啟動(dòng)圖, 并調(diào)用 Session.run() 方法執(zhí)行操作.
為了便于在 IPython 等交互環(huán)境使用 TensorFlow,需要用 InteractiveSession 代替 Session 類(lèi), 使用 Tensor.eval() 和 Operation.run() 方法代替 Session.run()。
例3,計(jì)算 ‘x’ 減去 ‘a(chǎn)’:
# 進(jìn)入一個(gè)交互式 TensorFlow 會(huì)話(huà). import tensorflow as tf sess = tf.InteractiveSession()x = tf.Variable([1.0, 2.0]) a = tf.constant([3.0, 3.0])# 使用初始化器 initializer op 的 run() 方法初始化 'x' x.initializer.run()# 增加一個(gè)減法 sub op, 從 'x' 減去 'a'. 運(yùn)行減法 op, 輸出結(jié)果 sub = tf.sub(x, a) print sub.eval() # ==> [-2. -1.]變量 Variable
上面用到的張量是常值張量(constant)。
變量 Variable,是維護(hù)圖執(zhí)行過(guò)程中的狀態(tài)信息的. 需要它來(lái)保持和更新參數(shù)值,是需要?jiǎng)討B(tài)調(diào)整的。
下面代碼中有 tf.initialize_all_variables,是預(yù)先對(duì)變量初始化,
Tensorflow 的變量必須先初始化,然后才有值!而常值張量是不需要的。
下面的 assign() 操作和 add() 操作,在調(diào)用 run() 之前, 它并不會(huì)真正執(zhí)行賦值和加和操作。
例4,使用變量實(shí)現(xiàn)一個(gè)簡(jiǎn)單的計(jì)數(shù)器:
# -創(chuàng)建一個(gè)變量, 初始化為標(biāo)量 0. 初始化定義初值 state = tf.Variable(0, name="counter")# 創(chuàng)建一個(gè) op, 其作用是使 state 增加 1 one = tf.constant(1) new_value = tf.add(state, one) update = tf.assign(state, new_value)# 啟動(dòng)圖后, 變量必須先經(jīng)過(guò)`初始化` (init) op 初始化, # 才真正通過(guò)Tensorflow的initialize_all_variables對(duì)這些變量賦初值 init_op = tf.initialize_all_variables()# 啟動(dòng)默認(rèn)圖, 運(yùn)行 op with tf.Session() as sess:# 運(yùn)行 'init' opsess.run(init_op)# 打印 'state' 的初始值# 取回操作的輸出內(nèi)容, 可以在使用 Session 對(duì)象的 run() 調(diào)用 執(zhí)行圖時(shí), # 傳入一些 tensor, 這些 tensor 會(huì)幫助你取回結(jié)果. # 此處只取回了單個(gè)節(jié)點(diǎn) state,# 也可以在運(yùn)行一次 op 時(shí)一起取回多個(gè) tensor: # result = sess.run([mul, intermed])print sess.run(state)# 運(yùn)行 op, 更新 'state', 并打印 'state'for _ in range(3):sess.run(update)print sess.run(state)# 輸出:# 0 # 1 # 2 # 3上面的代碼定義了一個(gè)如下的計(jì)算圖:
Ok,總結(jié)一下,來(lái)一個(gè)清晰的代碼:
過(guò)程就是:建圖->啟動(dòng)圖->運(yùn)行取值
計(jì)算矩陣相乘:
import tensorflow as tf# 建圖 matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]])product = tf.matmul(matrix1, matrix2)# 啟動(dòng)圖 sess = tf.Session()# 取值 result = sess.run(product) print resultsess.close()上面的幾個(gè)代碼介紹了基本用法,通過(guò)觀察,有沒(méi)有覺(jué)得 tf 和 numpy 有點(diǎn)像呢。
TensorFlow和普通的Numpy的對(duì)比
在cs224d的課件中有下面這個(gè)代碼,來(lái)看一下二者之間的區(qū)別:
eval()
在 Python 中定義完 a 后,直接打印就可以看到 a。
In [37]: a = np.zeros((2,2))In [39]: print(a) [[ 0. 0.][ 0. 0.]]``` 但是在 Tensorflow 中需要顯式地輸出(evaluation,也就是說(shuō)借助eval()函數(shù))!In [38]: ta = tf.zeros((2,2))
In [40]: print(ta)
Tensor(“zeros_1:0”, shape=(2, 2), dtype=float32)
In [41]: print(ta.eval())
[[ 0. 0.]
[ 0. 0.]]
“`
通過(guò)幾個(gè)例子了解了基本的用法,feed 在上面的例子中還沒(méi)有寫(xiě)到,下一次就能用到了,其他的可以查詢(xún)這里。
Day 1 宏觀了解了 NLP,Day 2 搞定了工具,下次要直接先進(jìn)入實(shí)戰(zhàn),訓(xùn)練模型,先從 Logistic 和 NN 開(kāi)始,一邊看模型一邊寫(xiě)代碼一邊思考模型原理,這樣理解才會(huì)更深刻!
推薦閱讀
歷史技術(shù)博文鏈接匯總
也許可以找到你想要的
總結(jié)
以上是生活随笔為你收集整理的CS224d-Day 2:TensorFlow 入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RT-Thread 学习文档
- 下一篇: CHM文档编辑制作及电子书的相关问题 -