2017-06-15 14 views
0

當我用在TensoFlow中構造Graph時獲取圖層形狀?

concat = tf.concat([query_rep, title_rep, cos_similarity], axis=1) 
    print(concat.shape[1].value) 
    # query_rep + title_rep + cos_similarity 
    hidden_size = concat.shape[1] 

我發現我不能得到CONCAT形狀,它將返回None。我必須專門爲hidden_size賦值,例如hidden_size=201。我怎樣才能自動獲取形狀?

另外,對於我的CNN網絡,我想填充每批中的輸入序列而不是整個數據集。所以我必須做出max_len a placeholder,但後來我發現placeholder不能作爲另一個placeholder的參數。例如以下代碼不起作用

self.max_len = tf.placeholder(int32) 
    self.query_holder = tf.placeholder(tf.int32, shape=[None, self.max_len]) 

該怎麼做到的?

回答

1

有形狀的兩個「種」:該靜態形狀可以在編譯時來推斷和動態形狀僅在運行期間是已知的。爲了讓靜態的形狀,你可以調用my_tensor.get_shape()在張量,訪問動感的外形,你可以打電話tf.shape(my_tensor)。如果get_shape()返回None那麼只能動態地知道形狀。如果您有關於形狀的其他信息,則可以使用my_tensor.set_shape()設置形狀。

關於第二個問題,你爲什麼不使用

self.query_holder = tf.placeholder(tf.int32, shape=[None, None]) 

這樣兩個尺寸是可變的。

+0

第二個解決方案看起來不錯!謝謝,但第一個,'tf.shape(my_tensor)'仍然不能得到形狀,並返回錯誤信息'ValueError異常:initial_value必須指定的形狀:張量(「random_normal:0?」,形狀=(?) ,dtype = float32)'並且不能使用這個形狀創建一個新圖層的參數'h_W = tf.Variable(tf.random_normal(shape = [hidden_​​size,hidden_​​size],stddev = 0.1),name ='h_W')' – danche

+0

是的,這是正常的。當你創建一個變量時,必須在編譯時知道該形狀,所以如果該動態形狀具有未知值(如你的那樣),則不能使用另一個張量的動態形狀作爲新變量的形狀。你必須事先知道'hidden_​​size',你通常會這樣做,因爲這是你的架構的設計選擇。 – kaufmanu