2017-07-28 82 views
6

我想繪製tensorboard直方圖中tf.layers.dense的權重,但它不顯示在參數中,我該怎麼做?如何在tf.layers.dense中獲取權重?

+1

歡迎來到Stackoverflow!請花些時間閱讀[幫助頁面](http://stackoverflow.com/help),尤其是名爲[「我可以問些什麼話題?」](http://stackoverflow.com/help/討論話題)和[「我應該避免問什麼類型的問題?」](http://stackoverflow.com/help/dont-ask)。請參閱[tour](http://stackoverflow.com/tour)並閱讀[如何提出良好問題](http://stackoverflow.com/help/how-to-ask)。最後,請學習如何創建[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Markus

回答

11

的權重將作爲一個名爲kernel變量,所以你可以使用

x = tf.dense(...) 
weights = tf.get_default_graph().get_tensor_by_name(
    os.path.split(x.name)[0] + '/kernel:0')) 

您可以通過您所使用的任何其他圖形明顯替代tf.get_default_graph()

+0

太棒了!它解決了我的問題。感謝 – user8381550

+3

並得到偏見只使用 'bias = tf。get_default_graph()。get_tensor_by_name( os.path.split(x.name)[0] +'/ bias:0')' – collector

+0

似乎應該被標記爲已解決。 –

2

最新tensorflow層API創建所有變量使用tf.get_variable調用。這確保瞭如果您想再次使用該變量,則可以使用tf.get_variable函數並提供您希望獲取的變量的名稱。

對於tf.layers.dense,變量創建爲:layer_name/kernel。所以,你可以這樣得到變量:

weights = tf.get_variable("layer_name/kernel") # do not specify 
# the shape here or it will confuse tensorflow into creating a new one. 

[編輯]:Tensorflow新版本現在有兩個功能和麪向對象的接口層API。如果您只需要圖層用於計算目的,那麼使用功能API是一個不錯的選擇。函數名稱以小寫字母開頭 - >tf.layers.dense(...)。圖層對象可以使用大寫的第一個字母來創建,例如 - >tf.layers.Dense(...)。一旦你有了這個圖層對象的句柄,你可以使用它的所有功能。爲了獲得權重,只需使用obj.trainable_weights這將返回該層範圍內找到的所有可訓練變量的列表。

2

我遇到了這個問題,並解決了它。 tf.layers.dense的名字不必與內核名稱的前綴相同。我的張量是「dense_2/xxx」,但它的內核是「dense_1/kernel:0」。爲確保tf.get_variable正常工作,最好在tf.layers.dense函數中設置name=xxx以使兩個名稱擁有相同的前綴。它的作用如下:

l=tf.layers.dense(input_tf_xxx,300,name='ip1') 
with tf.variable_scope('ip1', reuse=True): 
    w = tf.get_variable('kernel') 

順便說一下,我的tf版本是1.3。

0

我在張量流中瘋了。訓練結束後

sess.run(x.kernel)

,我得到的權重:

我運行此。

來自描述的屬性here

我在說我瘋了,因爲它似乎有一百萬個稍微不同的方式來做tf中的某些事情,並且將教程分解。