簡體   English   中英

Tensorflow:函數中定義的摘要無法在Tensorboard中訪問

[英]Tensorflow: Summaries defined in function not accessible in tensorboard

我有一個圖和一組自定義函數,它們根據輸入列表定義多層RNN,該輸入列表將指定每層中的單元數。 例如:

def BuildLayers(....):
    # takes inputs, list of layer sizes, mask information, etc
    #
    # invokes BuildLayer(...) several times
    #
    # returns RNN output and states of last layer

BuildLayer循環瀏覽更詳細的函數,該函數生成並返回各個圖層:

def BuildLayer(....):
    # Takes individual layer size, output of previous layer, etc
    #
    # handles bookkeeping of RNNCells, wrappers, reshaping, etc
    # **Important!  Defines scope for each layer**
    #
    # returns RNN output and states of last layer

最終這將在定義圖形並在會話中運行的函數中調用:

def Experiment(parameters):
    tf.reset_default_graph()
    graph = tf.Graph()
    with graph.as_default():    
        #
        # Placeholders
        # BuildLayers(...)
        # Loss function definitions
        # optimizer definitions
    with tf.Session(graph=graph) as session:
        #
        # Loop through epochs:
            # etc

即,如果圖層大小參數為[16,32,16],我們將得到一個RNN,該RNN在layer1中具有16個單元的單元格, 范圍為layer1 ,在layer 2中32單元的范圍,適當范圍,以及layer中的16個單元3,作用域等

這似乎工作正常,對張量板中的圖形進行隨意檢查看起來正確,節點看起來正確,事物訓練等。

問題:如何向該函數定義添加直方圖摘要,例如內核權重和偏差的直方圖摘要? 我這樣做很幼稚,例如:

def buildLayer(numUnits, numLayer, input, lengths):
    name = 'layer' "{0:0=2d}".format(numLayer)
    with tf.variable_scope(name):
        cellfw = tf.contrib.rnn.GRUCell(numUnits, activation = tf.nn.tanh)       
        cellbw = tf.contrib.rnn.GRUCell(numUnits, activation = tf.nn.tanh)           
        outputs,  state  = tf.nn.bidirectional_dynamic_rnn(cell_fw = cellfw, cell_bw = cellbw, inputs = input, dtype=tf.float32, sequence_length = lengths)
        outputs             = tf.concat([outputs[0], outputs[1]], axis=2)

        FwKernel     = tf.get_default_graph().get_tensor_by_name(name + '/bidirectional_rnn/fw/gru_cell/gates/kernel:0')
        FwKernel_sum = tf.summary.histogram("FwKernel", FwKernel, 'rnn')
        return outputs, state

然后,在圖形定義的末尾,假設這些摘要將被捕獲到

merged = tf.summary.merge_all()

聲明。 不是。 我對此行為感到困惑。 我可以在張量板上對圖形進行視覺檢查時看到直方圖摘要定義-它們在那里。 但是它們似乎並沒有合並,因此在張量圖中從來都無法像直方圖一樣訪問它們。

我如何獲得在函數中定義的摘要,以最好通過合並而不在多余的行李之類的函數調用中傳遞,從而顯示在張量板上?

我發現避免這種情況的最痛苦的方法是通過每個函數傳遞單個列表(即“摘要”),並在BuildLayers函數內,用所有所需的直方圖摘要附加或擴展該列表。

然后,在主圖定義中,而不是merge_all

merged = tf.summary.merge_all()

而是使用合並並將列表作為參數傳遞

merged = tf.summary.merge(summaries)  

這具有實際上不是merge_all的缺點,這意味着,如果您定義了其他匯總(通常是損失函數的標量匯總,至少),則必須手動將其追加到匯總列表中或攜帶兩個合並對象或類似的東西,錯過了merge_all的自我宣傳點。

我將其留在這里作為我自己問題的答案,因為它可能會對某人有所幫助,但由於我希望被別人展示出更好的方法,因此將不接受。

最有可能的問題是,摘要是在with graph.as_default():上下文的環境中創建的。 然后將匯總操作添加到該圖的_collections["SUMMARIES"]列表中。 但是,當您調用merge_all()您將不再處於該上下文中(將graph設置為默認值)。 因此, merge_all()在導入tensorflow時創建的默認圖中尋找摘要,該圖表可能為空。

要解決此問題,只需在with graph.as_default():上下文中調用merge_all() with graph.as_default():

以下是一些相關的代碼鏈接: https : //github.com/tensorflow/tensorflow/blob/92e6c3e4f5c1cabfda1e61547a6a1b268ef95fa5/tensorflow/python/summary/summary.py#L293

https://github.com/tensorflow/tensorflow/blob/92e6c3e4f5c1cabfda1e61547a6a1b268ef95fa5/tensorflow/python/framework/ops.py#L5649

暫無
暫無

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

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