- TensorFlow神經網絡到深度學習
- 張德豐編著
- 1607字
- 2021-05-19 18:18:30
1.3 TensorFlow基本使用
TensorFlow是一個編程系統,使用圖來表示計算任務。圖中的節點被稱為op (operation的縮寫),一個op獲得0個或多個Tensor,執行計算產生0個或多個Tensor。每個Tensor是一個類型化的多維數組。例如,用戶可以將一個小組圖像集表示為一個四維數組,這四個維度分別是[batch,height,width,channels]。
一個TensorFlow圖描述了計算的過程。為了進行計算,圖必須在會話里被啟動。會話將圖的op分發到CPU或GPU等設備上,同時提供執行op的方法。這些方法執行后,將產生的Tensor返回。在Python語言中,返回的Tensor是numpy ndarray對象;在C 和C++語言中,返回的Tensor是TensorFlow::Tensor 實例。
我們使用TensorFlow,必須明白TensorFlow:
·使用圖(graph)來表示計算任務;
·在被稱為會話(Session)的上下文(context)中執行圖;
·使用Tensor表示數據;
·通過變量(Variable)維護狀態;
·使用feed和fetch可以為任意的操作(arbitrary operation)賦值或者從中獲取數據。
1.3.1 計算圖
TensorFlow程序通常被組織成一個構建階段和一個執行階段。在構建階段,op的執行步驟被描述成一個圖;在執行階段,使用會話執行圖中的op。
例如,通常在構建階段創建一個圖來表示和訓練神經網絡,然后在執行階段反復執行圖中的訓練op。
TensorFlow支持C、C++、Python 編程語言。目前,TensorFlow的Python庫更加容易被使用,它提供了大量的輔助函數來簡化構建圖的工作,這些函數尚未被C和C++編程語言支持。
C、C++、Python這三種編程語言的會話庫是一致的。
1.3.2 構建圖
構建圖需要先創建源op(source op)。源op不需要任何輸入,如常量(constant),源op的輸出被傳遞給其他op進行運算。
Python庫中,op構造器的返回值代表被構造出的op的輸出,這些返回值可以傳遞給其他op構造器作為輸入。
TensorFlow庫有一個默認圖(default graph),op構造器可以為其增加節點,這個默認圖對許多程序來說已經足夠用了。以下代碼用于構建圖:

默認圖中現在有三個節點,分別為兩個constant()節點和一個matmul()節點。為了真正進行矩陣相乘運算,并得到矩陣乘法的結果,用戶必須在會話里啟動這個圖。
1.3.3 在一個會話中啟動圖
構造階段完成后才能啟動圖,啟動圖需要先創建一個Session對象,如果無任何創建參數,會話構造器將啟動默認圖。

輸出如下:

Session對象在使用完后需要關閉以釋放資源,除了調用close,也可以使用with代碼塊來自動完成關閉動作。

在實現上,TensorFlow將圖形定義轉換成分布式執行的操作,以充分利用可用的計算資源(如CPU或GPU)。一般用戶不需要顯式指定使用的是CPU還是GPU,TensorFlow能自動檢測。如果檢測到GPU,TensorFlow就會盡可能地利用找到的第一個GPU來執行操作。
如果計算機上有超過一個可用的GPU,那么除第一個以外的其他GPU默認是不參與計算的。為了讓TensorFlow使用這些GPU,用戶必須將op明確指派給它們執行。with...device語句用來指派特定的CPU或GPU執行操作:

設備用字符串進行標識,目前支持的設備包括:
·"/cpu:0":計算機的CPU;
·"/gpu:0":計算機的第一個GPU,若有的話;
·"/gpu:1":計算機的第二個GPU,以此類推。
1.3.4 交互式使用
1.3.3節中的示例使用一個會話Session來啟動圖,并調用Session.run()方法來執行操作。
為了便于使用IPython的Python交互環境,可以使用InteractiveSession代替 Session類,使用Tensor.eval()和Operation.run()方法代替Session.run()。這樣可以避免使用一個變量來持有會話。

運行程序,輸出如下:

TensorFlow程序使用Tensor數據結構來代表所有的數據,在計算圖中,操作之間傳遞的數據都是Tensor。用戶可以把TensorFlow的Tensor看作是一個n維的數組或列表。一個Tensor包含一個靜態類型rank和一個shape。
1.3.5 Fetch
為了取回操作的輸出內容,可以在使用Session對象的run()調用執行圖時,傳入一些Tensor,這些Tensor會幫助用戶取回結果。在之前的例子中,我們只取回了單個節點state,但是用戶也可以取回多個Tensor:

運行程序,輸出如下:

在op的一次運行中一起獲得需要獲取的多個Tensor值(不是逐個去獲取Tensor值)。
1.3.6 Feed
1.3.5節在計算圖中引入了Tensor,以常量或變量的形式存儲。TensorFlow還提供了Feed機制,該機制可以臨時替代圖中的任意操作,Tensor可以對圖中任何操作提交補丁,直接插入一個Tensor。
Feed使用一個Tensor值臨時替換一個操作的輸出結果。用戶可以提供Feed數據作為run() 調用的參數。Feed只在調用它的方法內有效,方法結束,Feed就會消失。最常見的用例是將某些特殊的操作指定為Feed操作,標記的方法是使用tf.placeholder()為這些操作創建占位符。

運行程序,輸出如下:

如果沒有正確提供Feed,tf.placeholder()操作將會產生錯誤。