1. 程式人生 > >TensorFlow學習筆記(1)-基礎筆記

TensorFlow學習筆記(1)-基礎筆記

文章目錄

1. 計算圖的概念

  TensorFlow 程式通常被組織成一個構建階段和一個執行階段。 在構建階段, op 的執行步驟 被描述成一個圖。在執行階段, 使用會話執行執行圖中的 op。
  TensorFlow的名字中已經說明了它最為重要的兩個特點:Tensor和Flow。其中Tensor意思是張量,可以被簡單的理解為多維陣列或者矩陣。Flow就是“流”的意思,直觀的表達了張量之間通過計算相互轉化的過程。
  下面的程式顯示了TensorFlow程式的構建階段和執行階段,其中執行階段在一個Session(會話)中被執行。

import tensorflow as tf
# 構建階段
a = tf.constant([1.0, 2.0], name='a')
b = tf.constant([3.0, 4.0], name='b')
op_add = a + b

# 執行階段
with tf.Session() as sess:
    print(sess.run(op_add))

輸出:[4. 6.]

  可以看到,我們首先定義了兩個常量,然後操作是將著兩個常量相加,然後在Session中通過run()來執行這個操作。這裡值得注意的是,我們使用了with關鍵字。with是一種上下文管理協議,它把流程中的try

,except,和finally關鍵字和資源分配釋放的相關程式碼都省去了,直接簡化為try-except-finally處理流程。這麼說可能不好理解,如果我們不使用with關鍵字,則我們的執行過程將表示為:

# 啟動一個會話
sess = tf.Session()
# 執行操作
result = sess.run(op_add)
print(result)
# 關閉會話
sess.close()

  可以看到,不使用with關鍵字,我們將在使用後關閉會話這條語句。如果直接把操作放在with下邊,我們就不用關心資源的分配與釋放問題了。
  在實現上, TensorFlow 將圖形定義轉換成分散式執行的操作, 以充分利用可用的計算資源(如 CPU 或 GPU). 一般你不需要顯式指定使用 CPU 還是 GPU, TensorFlow 能自動檢測. 如果檢測到 GPU, TensorFlow 會盡可能地利用找到的第一個 GPU 來執行操作.
  如果機器上有超過一個可用的 GPU, 除第一個外的其它 GPU 預設是不參與計算的. 為了讓 TensorFlow 使用這些 GPU, 你必須將 op 明確指派給它們執行. with…Device 語句用來指派特定的 CPU 或 GPU 執行操作:

with tf.Session() as sess:
  with tf.device("/gpu:1"):
    a = tf.constant([1.0, 2.0], name='a')
    b = tf.constant([3.0, 4.0], name='b')
    op_add = a + b
    print(sess.run(op_add))

裝置用字串進行標識. 目前支援的裝置包括:
“/cpu:0”: 機器的 CPU.
“/gpu:0”: 機器的第一個 GPU, 如果有的話.
“/gpu:1”: 機器的第二個 GPU, 以此類推.

2. 常量與變數

  在TensorFlow中,常量用tf.constant()來定義,變數用tf.Variable()來定義。這些常量、變數就是我們所說的張量。一個張量中主要包含三個部分:name(名字), shape(維度),type(型別)。我們在定義常量或者變數的時候,最好指定資料型別,型別不匹配會報錯。用dtype=''來設定,主要的資料型別有14種:

實數:tf.float32, tf.float64
整數:tf.int8, tf.int16, tf.int32, tf.int64, tf.uint128
布林型:tf.bool
複數:tf.complex64, tf.complex128

  在tensorflow中,變數在操作前必須初始化,而常量則不用。

import tensorflow as tf

# 構建階段-設定變數
a = tf.Variable([1.0, 2.0], name='a')
b = tf.Variable([3.0, 4.0], name='b')
op_init = tf.global_variables_initializer()  # 初始化操作
op_add = a + b   						     # 執行操作

# 執行階段
with tf.Session() as sess:
	sess.run(op_init)        # 初始化所有變數
    print(sess.run(op_add))

3. 互動式使用

  tensorflow中呼叫會話 Session 來啟動圖, 並呼叫 Session.run() 方法執行操作。為了便於使用諸如 IPython 之類的 Python 互動環境, 可以使用 InteractiveSession 代替 Session 類, 對於張量(主要指的是變數)可以使用 Tensor.eval() ,對於執行操作可以使用 Operation.run() 方法,代替 Session.run()。這樣可以避免使用一個變數來持有會話。

import tensorflow as tf
sess = tf.InteractiveSession()

a = tf.Variable([1, 2], name='a', dtype=tf.int32)  # 定義變數
b = tf.constant([3, 4], name='b', dtype=tf.int32)  # 定義常量
op_add = a + b   # 定義操作

# 初始化變數
a.initializer.run()
# 執行操作
print(op_add.eval())

4. Fetch & Feed

  為了取回操作的輸出內容, 可以在使用 Session 物件的 run() 呼叫 執行圖時, 傳入一些 tensor, 這些 tensor 會幫助你取回結果。

import tensorflow as tf

# 構建階段-設定變數
a = tf.Variable([1.0, 2.0], name='a')
b = tf.Variable([3.0, 4.0], name='b')
op_init = tf.global_variables_initializer()  # 初始化操作
op_add = a + b   						     # 執行操作
op_sub = a - b

# 執行階段
with tf.Session() as sess:
    sess.run(op_init)
    print(sess.run([op_add, op_sub]))

一個run中可以傳入多個操作(Tensor)。
  上述示例在計算圖中引入了 tensor, 以常量或變數的形式儲存. TensorFlow 還提供了 feed 機制, 該機制 可以臨時替代圖中的任意操作中的 tensor 可以對圖中任何操作提交補丁, 直接插入一個 tensor。feed使用一個 tensor 值臨時替換一個操作的輸出結果. 你可以提供 feed 資料作為 run() 呼叫的引數. feed 只在呼叫它的方法內有效, 方法結束, feed 就會消失.。最常見的用例是將某些特殊的操作指定為 “feed” 操作, 標記的方法是使用 tf.placeholder() 為這些操作建立佔位符。

import tensorflow as tf

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)]

先用tf.placeholder宣告,再在run中的feed_dict傳入真實的值。這種方法可以實現一系列的迭代過程。

參考資料:

TensorFlow基本用法