TensorFlow基礎知識

1 綜述

TensorFlow的編程系統中:

  1. 使用張量(tensor)來表示數據
  2. 使用圖(graph)來表示計算任務。 圖中的節點被稱之為 op (operation 的縮寫). 一個 op 獲得 0 個或多個 Tensor, 執行計算, 產生 0 個或多個 Tensor. 每個 Tensor 是一個類型化的多維數組。
  3. 使用會話(Session)的上下文(context)中執行圖
  4. 通過變量(Variable)維護狀態
  5. 使用 feedfetch 賦值和獲取數據.

2 張量(Tensor)

張量就是多維數組(列表),用“階”表示張量的維度。

  • 0階張量稱作標量(scalar),表示一個單獨的數;舉例 S=123
  • 1階張量稱作向量(vector),表示一個一維數組;舉例 V=[1,2,3]
  • 2階張量稱作矩陣(matrix),表示一個二維數組,它可以有 i 行 j 列個元素,每個元素可
    以用行號和列號共同索引到;
    舉例 m=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]

判斷張量是幾階的,就通過張量右邊的方括號數,0 個是 0 階,n 個是 n 階。例如 t=[ [ [... ] ] ]為 3 階。

代碼演示:

import tensorflow as tf
a=tf.constant([1.0,2.0])
b=tf.constant([3.0,4.0])
result=a+b
print(result)

輸出的結果為:

Tensor("add:0", shape=(2,), dtype=float32)

解釋:

  • add :節點名
  • shape :維度信息,括號里只有一個數“2“,表示維度是1且一個維度里有兩個元素
  • dtpye :數據類型

另:

c=tf.constant([1.0,2.0])  #Tensor("Const_2:0", shape=(2,), dtype=float32) 是個向量,有兩個元素
d=tf.constant([[1.0,2.0]])  #Tensor("Const_3:0", shape=(1, 2), dtype=float32) 1行2列矩陣
e=tf.constant([[1.0],[2.0]])  #Tensor("Const_4:0", shape=(2, 1), dtype=float32) 2行1列矩陣

2 計算圖

計算圖(Graph):搭建神經網絡的計算過程,是承載一個或多個計算節點的一張圖,只搭建網絡,不運算。

計算圖

x1、x2 表示輸入,w1、w2 分別是 x1 到 y 和 x2 到 y 的權重,y=x1w1+x2w2。

我們實現上述計算圖:

import tensorflow as tf #引入模塊
x = tf.constant([[1.0, 2.0]]) #定義一個 2 階張量等于[[1.0,2.0]]
w = tf.constant([[3.0], [4.0]]) #定義一個 2 階張量等于[[3.0],[4.0]]
y = tf.matmul(x, w) #實現 xw 矩陣乘法
print y #打印出結果

可以打印出這樣一句話:

Tensor(“matmul:0”, shape(1,1), dtype=float32),

從這里我們可以看出,print 的結果顯示 y 是一個張量,只搭建承載計算過程的
計算圖,并沒有運算,如果我們想得到運算結果就要用到“會話 Session()”了。

3 會話

會話(Session):執行計算圖中的節點運算。

我們用 with 結構實現,語法如下:

with tf.Session() as sess:
    print(sess.run(y))

【舉例】

我們執行 Session()會話可得到矩陣相乘結果:

import tensorflow as tf #引入模塊
x = tf.constant([[1.0, 2.0]]) #定義一個 2 階張量等于[[1.0,2.0]]
w = tf.constant([[3.0], [4.0]]) #定義一個 2 階張量等于[[3.0],[4.0]]
y = tf.matmul(x, w) #實現 xw 矩陣乘法
print y #打印出結果
with tf.Session() as sess:
    print(sess.run(y)) #執行會話并打印出執行后的結果

可以打印出這樣的結果:

Tensor(“matmul:0”, shape(1,1), dtype=float32)
[[11.]]

我們可以看到,運行 Session()會話前只打印出 y 是個張量的提示,運行 Session()
會話后打印出了 y 的結果 1.0 * 3.0 + 2.0 * 4.0 = 11.0。

4 變量

4.1 變量創建

變量的創建使用一個張量作為初始值傳入構造函數Variable(),初始值是常量或是隨機值。

注意,所有這些操作符都需要你指定張量的shape。那個形狀自動成為變量的shape。變量的shape通常是固定的,但TensorFlow提供了高級的機制來重新調整其行列數

# 創建一個變量, 初始化為標量 0.
state = tf.Variable(0, name="counter")

# 權重和偏置
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")

常用的生成隨機數/數組的函數有:

tf.random_normal()   #生成正態分布隨機數
tf.truncated_normal() #生成去掉過大偏離點的正態分布隨機數
tf.random_uniform()  #生成均勻分布隨機數
tf.zeros         #表示生成全 0 數組
tf.ones       #表示生成全 1 數組
tf.fill     #表示生成全定值數組
tf.constant #表示生成直接給定值的數組

具體可以查看:http://www.tensorfly.cn/tfdoc/api_docs/python/constant_op.html

4.2 變量初始化

變量的初始化必須在模型的其它操作運行之前完成

最簡單的方法就是添加一個給所有變量初始化的操作,并在使用模型之前首先運行那個操作。

4.2.1 tf.initialize_all_variables()

使用tf.initialize_all_variables()添加一個操作對變量做初始化。記得在完全構建好模型并加載之后再運行那個操作。

# Create two variables.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
biases = tf.Variable(tf.zeros([200]), name="biases")
...
# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()

# Later, when launching the model
with tf.Session() as sess:
  # Run the init operation.
  sess.run(init_op)
  ...
  # Use the model
  ...

4.2.2 initialized_value()

。由于tf.initialize_all_variables()是并行地初始化所有變量,有時候會需要用另一個變量的初始化值給當前變量初始化。

用其它變量的值初始化一個新的變量時,使用其它變量的initialized_value()屬性。你可以直接把已初始化的值作為新變量的初始值,或者把它當做tensor計算得到一個值賦予新變量。

# Create a variable with a random value.
weights = tf.Variable(tf.random_normal([784, 200], stddev=0.35),
                      name="weights")
# Create another variable with the same value as 'weights'.
w2 = tf.Variable(weights.initialized_value(), name="w2")
# Create another variable with twice the value of 'weights'
w_twice = tf.Variable(weights.initialized_value() * 0.2, name="w_twice")

4.3 保存和加載

4.3.1 保存變量

最簡單的保存和恢復模型的方法是使用tf.train.Saver對象。構造器給graph的所有變量,或是定義在列表里的變量,添加save和restore ops。saver對象提供了方法來運行這些ops,定義檢查點文件的讀寫路徑。

變量存儲在二進制文件里,主要包含從變量名到tensor值的映射關系。

當你創建一個Saver對象時,你可以選擇性地為檢查點文件中的變量定義變量名。默認情況下,將使用每個變量Variable.name屬性的值。

保存變量時,用tf.train.Saver()創建一個Saver來管理模型中的所有變量。

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add an op to initialize the variables.
init_op = tf.initialize_all_variables()

# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, initialize the variables, do some work, save the
# variables to disk.
with tf.Session() as sess:
  sess.run(init_op)
  # Do some work with the model.
  ..
  # Save the variables to disk.
  save_path = saver.save(sess, "/tmp/model.ckpt")
  print "Model saved in file: ", save_path

4.3.2 恢復變量

用同一個Saver對象來恢復變量。注意,當你從文件中恢復變量時,不需要事先對它們做初始化。

# Create some variables.
v1 = tf.Variable(..., name="v1")
v2 = tf.Variable(..., name="v2")
...
# Add ops to save and restore all the variables.
saver = tf.train.Saver()

# Later, launch the model, use the saver to restore variables from disk, and
# do some work with the model.
with tf.Session() as sess:
  # Restore variables from disk.
  saver.restore(sess, "/tmp/model.ckpt")
  print "Model restored."
  # Do some work with the model
  ...

5 Fetch和Feed

5.1 Fetch

為了取回操作的輸出內容, 可以在使用 Session 對象的 run() 調用 執行圖時, 傳入一些 tensor, 這些 tensor 會幫助你取回結果,也就是Fetch操作。

示例代碼:

# 創建一個變量, 初始化為標量 0.
state = tf.Variable(0, name="counter")

# 創建一個 op, 其作用是使 state 增加 1

one = tf.constant(1)
new_value = tf.add(state, one)
update = tf.assign(state, new_value)

# 啟動圖后, 變量必須先經過`初始化` (init) op 初始化,
# 首先必須增加一個`初始化` op 到圖中.
init_op = tf.initialize_all_variables()

# 啟動圖, 運行 op
with tf.Session() as sess:
  # 運行 'init' op
  sess.run(init_op)
  # 打印 'state' 的初始值
  print sess.run(state)
  # 運行 op, 更新 'state', 并打印 'state'
  for _ in range(3):
    sess.run(update)
    print sess.run(state)

# 輸出:

# 0
# 1
# 2
# 3

在之前的例子里, 我們只取回了單個節點 state, 但是你也可以取回多個 tensor:

input1 = tf.constant(3.0)
input2 = tf.constant(2.0)
input3 = tf.constant(5.0)
intermed = tf.add(input2, input3)
mul = tf.mul(input1, intermed)

with tf.Session():
  result = sess.run([mul, intermed])
  print result

# 輸出:
# [array([ 21.], dtype=float32), array([ 7.], dtype=float32)]

需要獲取的多個 tensor 值,在 op 的一次運行中一起獲得(而不是逐個去獲取 tensor)。

5.2 Feed

上述示例在計算圖中引入了 tensor, 以常量或變量的形式存儲. TensorFlow 還提供了 feed 機制, 該機制 可以臨時替代圖中的任意操作中的 tensor 可以對圖中任何操作提交補丁, 直接插入一個tensor.

feed 使用一個 tensor 值臨時替換一個操作的輸出結果. 你可以提供 feed 數據作為 run() 調用的參數. feed 只在調用它的方法內有效, 方法結束, feed 就會消失. 最常見的用例是將某些特殊的操作指定為 "feed" 操作, 標記的方法是使用 tf.placeholder() 為這些操作創建占位符.

input1 = tf.placeholder(tf.types.float32)
input2 = tf.placeholder(tf.types.float32)
output = tf.mul(input1, input2)

with tf.Session() as sess:
  print sess.run([output], feed_dict={input1:[7.], input2:[2.]})

# 輸出:
# [array([ 14.], dtype=float32)]

參考:

  1. http://www.tensorfly.cn/tfdoc/get_started/basic_usage.html
  2. https://www.tensorflow.org/

本文由博客一文多發平臺 OpenWrite 發布!

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,572評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,071評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,409評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,569評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,360評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,895評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,979評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,123評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,643評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,559評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,742評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,250評論 5 356
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,981評論 3 346
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,363評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,622評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,354評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,707評論 2 370

推薦閱讀更多精彩內容