[翻譯] TensorFlow Programmer's Guide之Frequently Asked Questions(問得頻率最多的幾個問題)
目錄:
- 特點和兼容性(Features and Compatibility)
- 建立一個TensorFlow圖(Building a TensorFlow graph)
- 運行一個TensorFlow計算圖(Running a TensorFlow computation)
- 變量(Variables)
- 張量的形狀(Tensor shapes)
- TensorBoard
- TensorFlow擴展(Extending TensorFlow)
- 其他(Miscellaneous)
特點和兼容性
1) 可以在多個計算機上分布式訓練麽?
可以!TensorFlow從版本0.8開始就支持分布式計算了。TensorFlow現在在一個或多個計算機上支持多個設備(CPUs或者GPUs)。
2) TensorFlow支持Python3麽?
0.6.0版本後的TensorFlow,支持Python3.3+。
建立一個TensorFlow圖(graph)
可以查看建立圖的API文檔(https://www.tensorflow.org/versions/master/api_guides/python/framework)。
1) 為什麽 c = tf.matmul(a, b)不會立即執行矩陣乘法?
在TensorFlow的Python API中,a,b和c都是tf.Tensor
對象。一個Tensor對象是一個運算操作結果的符號句柄(a symbolic handle to the result of an operation),但是實際上並沒有保存運算操作結果的值。反而,TensorFlow鼓勵用戶去建立一個復雜的表達式(比如整個神經網絡和它的梯度)來作為一個數據流的圖。然後你可以將整個數據流的圖(或者其中的一個子圖)給一個TensorFlow的tf.Session
2) 設備是怎麽命名的?
對CPU設備來說,支持的設備名字是"/device:CPU:0"或"/cpu:0",對GPU來說,是"/device:GPU:i"
(或者 "/gpu:i"
),其中i表示第i個GPU設備。
3) 我如何將一個運算操作在指定的設備上運行?
將一組運算操作放置在指定設備上,可以將這些運算操作創建在 with tf.device(name):
下。TensorFlow如何將運算操作綁定在設備的詳細情況可以查看文檔 using GPUs with TensorFlow。CIFAR-10 tutorial 是如何使用多GPU的一個例子。
運行一個TensorFlow計算圖
1) feeding和placeholder之間是怎麽處理的?
Feeding是TensorFlow Session API中的一種機制,它可以允許你在運行時給一個或者多個tensor替換不同的值。tf.Session.run
中feed_dict的參數一個映射tf.Tensor
對象到numpy數組(或者其他一些類型)的字典,作為這些tensor每執行一步時的值。
一般地,你有某些特定的tensor,比如說輸出,需要不停地提供數據。tf.placeholder
操作符允許你定義一個必須被fed的tensor,其中你可以選擇是否限制這些tensor的形狀。可以查看 beginners‘ MNIST tutorial ,這是一個介紹placeholders和feeding如何為一個神經網絡提供訓練數據的例子。
2) Session.run() and Tensor.eval()的區別是什麽?
如果t是一個tf.Tensor
對象,tf.Tensor.eval
是tf.Session.run
的速寫方法。下面兩個代碼是等價的:
# Using `Session.run()`. sess = tf.Session() c = tf.constant(5.0) print(sess.run(c)) # Using `Tensor.eval()`. c = tf.constant(5.0) with tf.Session(): print(c.eval())
在第二個例子中,session是一個上下文管理器( context manager),在with tf.Session():生命周期裏面,默認的都是該session的。這個上下文管理器對一些簡單的應用(如單元測試)有更簡潔的代碼。如果你的代碼同時處理多個圖(graph)和session,那麽最好還是使用Session.run()來使程序變得更明確。
3) Session有生命周期麽?中間過程產生的tensor呢?
Session可以擁有資源,比如說 tf.Variable
, tf.QueueBase
,和tf.ReaderBase
,這些資源占用了大量的內存空間。當session被關閉時(通過 tf.Session.close
調用),這些資源(還有其對應的內存)將被釋放。
作為調用Session.run()
產生一部分中間tensor,會在調用該語句結束的時候或者之前被釋放。
4) 運行時是否將計算圖執行的部分並行化?
在多個不同的維度上,TensorFlow運行時並行化圖形的執行:
(1) 單個運算操作有並行實現,使用一個CPU的多個核心,或者一個GPU的多個線程
(2) 在TensorFlow計算圖中獨立的節點可以在不同的設備上並行運行,因此可以使訓練時使用多個GPU加速。可以查看這個例子: CIFAR-10 training using multiple GPUs。
(3)
Session API允許多個並行的步驟(比如並行調用 tf.Session.run
)。這可以使運行時獲得更高的吞吐量,如果單個步驟沒有使用完你計算機上所有的資源的話。
5) TensorFlow支持什麽語言調用?
TensorFlow被設計支持多種不同的語言調用。目前,Python是支持最好的語言。C++、Java和Go也支持執行和構造計算圖。
TensorFlow也有一個基於C語言的API,來支持更多其他語言。
6) TensorFlow會充分利用計算機上所有可用的設備(CPU和GPU)麽?
TensorFlow支持多CPU和GPU。TensorFlow如何將運算操作分配到設備上的細節可用去看文檔 using GPUs with TensorFlow; CIFAR-10 tutorial是一個使用多GPU模型的例子。
註意:TensorFlow僅僅支持計算能力大於3.5的GPU設備。
7) 當使用一個reader 或者一個queue時,Session.run()為什麽會暫停/終止?
tf.ReaderBase
和 tf.QueueBase
兩個類提供了特殊的操作,會使系統阻塞,直到可以使用輸入(或者有界列隊中有空余空間)。這些操作允許你建立更為精細的輸出管道( input pipelines),當然另一方面會使TensorFlow計算變得更加復雜。可以查看 using QueueRunner
objects to drive queues and readers 來獲取更多如何使用它們的知識。
變量(Variables)
有關變量的知識可以查看 the API documentation for variables.。
1) 變量的生命周期是什麽?
當你在一個會話(session)中運行tf.Variable.initializer
操作時,一個變量將會被創建;當那個session被關閉時,該變量將被銷毀。
2) 當變量同時被訪問時,它們是怎麽運作的?
變量允許並行讀取和寫入操作。當一個變量被並行地更新時,如果這時候讀取這個變量,那麽讀取的值可能會改變。默認的情況下,對一個變量並行分配操作是允許在沒有互斥鎖的情況下運行。當操作一個變量時,為了可以對tf.Variable.assign
傳遞use_locking=True來獲取一個鎖。
張量的形狀(Tensor shapes)
也可以查看tf.TensorShape
。
1) 在Python中我們如何確定tensor的形狀?
在TensorFlow中,一個tensor同時擁有一個靜態(inferred)的形狀和一個動態(true)的形狀。靜態的形狀可以使用tf.Tensor.get_shape
方法讀取,這個讀取的形狀是創建tensor操作中推斷出來的,可能是部分正確的。如果靜態的形狀沒有完全被定義,那麽一個Tensor類型的t的動態的形狀可以使用 tf.shape(t)
獲得。
2) x.set_shape()和x=tf.reshape(x)之間的區別是什麽?
tf.Tensor.set_shape
方法更新一個Tensor對象的靜態形狀,這一般用於當不能被直接推斷出來時,提供額外的形狀信息。這個並不會改變tensor的動態形狀。
_, image_data = tf.TFRecordReader(...).read(...) image = tf.image.decode_png(image_data, channels=3) # The height and width dimensions of `image` are data dependent, and # cannot be computed without executing the op. print(image.shape) ==> TensorShape([Dimension(None), Dimension(None), Dimension(3)]) # We know that each image in this dataset is 28 x 28 pixels. image.set_shape([28, 28, 3]) print(image.shape) ==> TensorShape([Dimension(28), Dimension(28), Dimension(3)])
tf.reshape
操作創建了一個新的、動態形狀不同的tensor。
# tensor ‘t‘ is [1, 2, 3, 4, 5, 6, 7, 8, 9] # tensor ‘t‘ has shape [9] reshape(t, [3, 3]) ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # tensor ‘t‘ is [[[1, 1], [2, 2]], # [[3, 3], [4, 4]]] # tensor ‘t‘ has shape [2, 2, 2] reshape(t, [2, 4]) ==> [[1, 1, 2, 2], [3, 3, 4, 4]]
3) 如何建立一個batch size可變的計算圖?
建立一個batch size可變的計算圖一般都是很有用的,比如相同的代碼可以用於(mini-)batch training,single-instance inference。最後結果的計算圖可以保存為一個protocol buffer( saved as a protocol buffer),導入進另外一個程序中( imported into another program)。
當建立一個可以大小的計算圖時,最重要的事情是記住不要將batch size編碼為Python的常量,而是要使用一個Tensor來表示它。下面兩個說明可能是有用的:
(1) 使用batch_size = tf.shape(input)[0]
從一個稱為input的Tensor提取batch的維度,並且保存為名字叫batch_size的Tensor 。
(2) 使用tf.reduce_mean
而不是tf.reduce_sum(...) / batch_size。
TensorBoard
1) 如何可視化TensorFlow計算圖?
查看教程graph visualization tutorial。
2) 把數據送到TensorBoard的最簡單的方式是什麽?
將summary ops加入到你的TensorFlow graph中,然後將這些summaries寫到一個log目錄下。接下來就可以使用如下命名啟動TensorBoard:
python tensorflow/tensorboard/tensorboard.py --logdir=path/to/log-directory
更多細節,可以查看 Summaries and TensorBoard tutorial。
3) 每次啟動啟動TensorBoard,就會彈出一個網絡安全警告
你可以通過flag --host=localhost,來改變TensorBoard瀏覽器中的地址為localhost,而不是‘0.0.0.0’。
TensorFlow擴展(Extending TensorFlow)
1) 我的數據是自定義的格式,我如何使用TensorFlow讀取該數據?
有3種主要的方法來處理自定義格式的數據。
最簡單的方式是再Python中寫一個解析代碼,將該數據轉換為一個numpy array。然後使用 tf.contrib.data.Dataset.from_tensor_slices
從內存數據中創建一個輸入管道(pipeline)。
2) 如果你的數據在內存中不合適(原話是:If your data doesn‘t fit in memory),那麽嘗試在Dataset pipeline中做解析。從一個合適的file reader開始,比如tf.contrib.data.TextLineDataset
。然後通過映射(mapping)合適的操作轉換數據集。更傾向於使用已經定義好的TensorFlow Operations,比如tf.decode_raw
, tf.decode_csv
, tf.parse_example
, or tf.image.decode_png
。
3) 如果你的數據在使用TensorFlow自帶函數不容易解析的情況下,可以考慮線下將其轉換為可以容易解析的數據,比如${tf.python_io.TFRecordWriter$TFRecord
} 格式。
還有一個更加有效的解析數據的方法就是增加一個用C++寫的新的op,一個可以解析你數據的op。可以參考 guide to handling new data formats。
其他
1) TensorFlow的編碼風格是什麽?
TensorFlow Python API遵守 PEP8編碼風格。我們對類使用CamelCase風格,對函數、方法、屬性(functions, methods, and properties)使用snake_case風格。我們也遵守 Google Python style guide。
TensorFlow C++代碼遵守Google C++ style guide。
原文鏈接:https://www.tensorflow.org/versions/master/programmers_guide/faq
[翻譯] TensorFlow Programmer's Guide之Frequently Asked Questions(問得頻率最多的幾個問題)