官术网_书友最值得收藏!

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()操作將會產生錯誤。

主站蜘蛛池模板: 陇西县| 嘉义县| 麟游县| 台山市| 绥宁县| 宿迁市| 昌黎县| 尼玛县| 建湖县| 广宗县| 林周县| 太白县| 清流县| 洪雅县| 庆安县| 宜州市| 涿州市| 蕲春县| 宝鸡市| 清苑县| 桦川县| 武鸣县| 乌鲁木齐县| 津市市| 灵武市| 怀远县| 壶关县| 威海市| 独山县| 广西| 孝义市| 额济纳旗| 上蔡县| 丰城市| 黑山县| 若羌县| 武邑县| 清苑县| 遂宁市| 稻城县| 汉川市|