2017-09-04 137 views
1

My圖表定義是這樣的:如何在Tensorflow中重命名op的輸入張量名稱?除去輟學層之前

fc6/BiasAdd : BiasAdd ([u'fc6/Conv2D', u'fc6/biases/read']) 
fc6/Relu : Relu ([u'fc6/BiasAdd']) 
dropout/keep_prob : Const ([]) 
dropout/Shape : Shape ([u'fc6/Relu']) 
dropout/random_uniform/min : Const ([]) 
dropout/random_uniform/max : Const ([]) 
dropout/random_uniform/RandomUniform : RandomUniform ([u'dropout/Shape']) 
dropout/random_uniform/sub : Sub ([u'dropout/random_uniform/max', u'dropout/random_uniform/min']) 
dropout/random_uniform/mul : Mul ([u'dropout/random_uniform/RandomUniform', u'dropout/random_uniform/sub']) 
dropout/random_uniform : Add ([u'dropout/random_uniform/mul', u'dropout/random_uniform/min']) 
dropout/add : Add ([u'dropout/keep_prob', u'dropout/random_uniform']) 
dropout/Floor : Floor ([u'dropout/add']) 
dropout/Inv : Inv ([u'dropout/keep_prob']) 
dropout/mul : Mul ([u'fc6/Relu', u'dropout/Inv']) 
dropout/mul_1 : Mul ([u'dropout/mul', u'dropout/Floor']) 
fc7/weights : Const ([]) 
fc7/weights/read : Identity ([u'fc7/weights']) 
fc7/Conv2D : Conv2D ([u'dropout/mul_1', u'fc7/weights/read']) 

格式node.name : node.type node.input

消除輟學層後,我必須找出我如何可以改變一個特定層的輸入張名。消除輟學層之後的圖如下所示:

fc6/BiasAdd : BiasAdd ([u'fc6/Conv2D', u'fc6/biases/read']) 
fc6/Relu : Relu ([u'fc6/BiasAdd']) 
fc7/weights : Const ([]) 
fc7/weights/read : Identity ([u'fc7/weights']) 
fc7/Conv2D : Conv2D ([u'dropout/mul_1', u'fc7/weights/read']) 

但是,正如你可以看到fc7/Conv2D操作仍預計dropout/mul_1作爲輸入。正因爲如此,我得到這個錯誤:

ValueError異常:graph_def是節點u'fc7/Conv2D無效「:輸入張量輟學/ MUL_1:0'graph_def找不到..

我想將期望的節點輸入張量名稱 - 操作改爲fc6/BiasAdd,以使網絡有效。有沒有辦法做到這一點?

回答

2

有沒有這樣做的直接方式。一般來說,計算圖可以用新的操作增加,但是現有的節點不能被修改。有三種可能的路徑可以遵循:

  • 最簡單的事情是離開輟學層,因爲它是,並且簡單地(使用tf.placeholder_with_default例如)通過恆定keep_prob或1。你仍然會有一些小的開銷(我認爲,我不知道實現dropout是否繞過操作的概率爲1),但它可能不會被察覺。
  • 在另一個tf.Graph對象中創建沒有丟失圖層的圖形副本,然後將變量值從第一個會話中的變量值複製到新會話中的會話中(例如使用load())。
  • 實際上編輯圖形。雖然不是它的主要用途,但可以在一定程度上編輯圖表。爲此目的,型號tf.contrib.graph_editor實施了許多操作。就你而言,你可能正在尋找類似tf.contrib.graph_editor.swap_inputs的東西。這裏的缺點是這些操作必須「離線」完成,即沒有使用圖形的活動會話。這意味着變量值原則上不會被保存。您可以選擇checkpoint the model,手動將變量值保存到NumPy數組中,並在修改圖表後將其恢復,或者,如果您完成了培訓並且只打算使用您的模型進行推理,則還可以使用freeze the graph。無論如何,你必須照顧它。
+0

感謝您的回答,但無論我嘗試(第一種方法)概率保持在0.5,你能給我一個快速的例子嗎?僅供參考我只能提供可以加載和讀取的.ckpt和.pb文件(模型的),而不是圖形本身的定義。 PS:第三種方法似乎也很好(任何例子?)。 –

+0

@KonstantinosMonachopoulos噢,如果是這樣的話,我會看到兩件事情你可以做:1)加載圖形並像往常一樣恢復,當你調用'run'時手動提供'keep_prob'(比如'feed_dict = {' dropout/keep_prob:0':1,...})2)加載'tf.GraphDef'對象,然後使用[圖形編輯器](https://www.tensorflow.org/api_guides/python/contrib.graph_editor )根據需要重新路由,然後_then_恢復檢查點。 – jdehesa

+0

非常感謝,在推理過程中將probs設置爲1給出了一個解決方案,但是我更願意完全刪除丟失,以確保沒有什麼會在我使用量化圖進行推理時破壞我的輸出(我的輸出是混亂的這種情況下,我試圖找出原因)。我會嘗試圖形編輯器,在那裏找到一個潛在的解決方案。再一次,謝謝你,任何額外的信息將不勝感激。 –

相關問題