簡體   English   中英

TensorFlow 函數內的打印語句

[英]Print statement inside TensorFlow function

我是 TensorFlow 的新手,我正在嘗試在一個函數中打印向量的形狀,該函數將從 TensorFlow 會話中調用。

問題是這一行(顯示為注釋掉)僅在最初定義此函數模板時執行(而不是在 TensorFlow 會話期間的每次迭代時)。 如何添加打印語句,以便在每次 TensorFlow 迭代時調用它?

def Q(X):
    # f_debug.write('Q(X) :: X.shape :: ' + str(X.shape) + '\n')

    h = tf.nn.relu(tf.matmul(X, Q_W1) + Q_b1)
    z = tf.matmul(h, Q_W2) + Q_b2
    return z

這是一個需要注意的重要點,也是 TF 中常見的混淆。 該函數不會在會話中被 tensorflow 調用,除了 tf.py_func 之外,沒有 python 函數會tf.py_func ,這可能是您問題的解決方法。

Tensorflow 調用您的函數Q只是為了獲取符號操作,然后將這些操作添加到依賴關系圖中。 在會話期間,依賴圖是執行計算所依賴的全部。 即使您正在使用tf.whiletf.cond或其他控制流操作。 這些都不會在會話期間調用 python,它們只是按照您定義的方式循環依賴圖中的元素。

一般來說,除了使用 Tensorflow Debugger(根本不難配置)之外,沒有什么好的方法可以停止 tensorflow 中間圖執行的執行。 但是作為一種解決方法,您可能會定義一個tf.py_func python 函數。 這個函數將一個張量編組到一個 python 對象中,並在會話執行期間調用 python(它效率不高,但在某些情況下很方便)。

您可能需要使用with tf.control_dependencies(...):來強制您的tf.py_func操作運行(因為如果它里面只有一個打印語句,它就沒有任何依賴項)。

免責聲明:我沒有以這種方式使用tf.py_func也不是為了這個目的而構建的。

這是 TensorFlow 1 的具體解釋。 我確信 TF 2 中的 Eager Execution 改變了其中的一些事情。 請參閱tf.print 的文檔

我在 py_func 函數中使用常規的print()語句沒有任何運氣。 可以使用tf.print在 TF 圖(py_func 或其他)的執行“內部”執行打印語句。 我只熟悉它在 TF 1 中的使用,但它的工作原理是創建一個新的打印操作並將其添加到 TF 圖中:

def Q(X):
    # Note that at least sometimes, X.shape can be resolved before the
    # graph is executed, so you may only need this for the *value* of X

    # Create a new print op
    printop = tf.print('Q:', X)

    # Force printop to be added to the graph by setting it as a 
    # dependency for at least one operation that will be run
    with tf.control_dependencies([printop]):
        h = tf.nn.relu(tf.matmul(X, Q_W1) + Q_b1)
        z = tf.matmul(h, Q_W2) + Q_b2
        return z

遇到了一些情況,如我所希望這並不工作(我相信,由於多線程)。 如果您找不到圖表的節點來附加printop操作,這也可能會很棘手——例如,如果您試圖在函數的最后一行打印某些內容。

但這似乎對我來說大部分時間都有效。

tf.print() 上的文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM