1. 程式人生 > >[翻譯] TensorFlow Programmer's Guide之Frequently Asked Questions(問得頻率最多的幾個問題)

[翻譯] TensorFlow Programmer's Guide之Frequently Asked Questions(問得頻率最多的幾個問題)

_for file 語言 ons docs locking 內存數據 code mage

目錄:

  1. 特點和兼容性(Features and Compatibility)
  2. 建立一個TensorFlow圖(Building a TensorFlow graph)
  3. 運行一個TensorFlow計算圖(Running a TensorFlow computation)
  4. 變量(Variables)
  5. 張量的形狀(Tensor shapes)
  6. TensorBoard
  7. TensorFlow擴展(Extending TensorFlow)
  8. 其他(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.evaltf.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.ReaderBasetf.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(問得頻率最多的幾個問題)