2016-06-17 40 views
3

我有下面的表達,這是給我的問題。我已經將batch_size定義爲batch_size = tf.shape(input_tensor)[0],它根據模型輸入張量的大小動態確定批量的大小。我在代碼的其他地方沒有問題地使用它。我感到困惑的是,當我運行下面這行代碼時,它說形狀是(?,?)我期望它是(?,128),因爲它知道第二個維度。爲什麼tensorflow不能確定這個表達式的形狀?

print(tf.zeros((batch_size, 128)).get_shape()) 

我想知道形狀,因爲我正在嘗試執行以下操作並且出現錯誤。

rnn_input = tf.reduce_sum(w * decoder_input, 1) 
    last_out = decoder_outputs[t - 1] if t else tf.zeros((batch_size, 128)) 
    rnn_input = tf.concat(1, (rnn_input, last_out)) 

此代碼需要在第一個時間步將last_out設置爲零。

以下是錯誤ValueError: Linear expects shape[1] of arguments: [[None, None], [None, 1024]]

我在做類似的事情,當我決定爲我的RNNs初始狀態向量。

state = tf.zeros((batch_size, decoder_multi_rnn.state_size), tf.float32) 

我也得到(?,?)當我嘗試打印狀態的大小,但它並沒有真正引發任何異常,當我嘗試使用它。

+0

您的打印內容是否與Session()一樣是sess:'(或類似的)表達式?你有沒有嘗試過類似'print(tf.zeros((batch_size.eval(),128))。get_shape())'? – mathetes

+0

我不在會議中。我不認爲我想這樣做,因爲那麼模型會被固定的批量大小卡住。 – chasep255

回答

1

(編輯:我重寫一個答案,我寫的是不達標的點之前)

的快速解決您的問題是使用set_shape()更新張量的靜態(推斷)的形狀:

input_tensor = tf.placeholder(tf.float32, [None, 32]) 
batch_size = tf.shape(input_tensor)[0] 

res = tf.zeros((batch_size, 128)) 
print res.get_shape() # prints (?, ?) WHEREAS one could expect (?, 128) 

res.set_shape([None, 128]) 
print res.get_shape() # prints (?, 128) 

至於爲什麼TensorFlow失去對第二尺寸128的信息,我真的不知道。

也許@Yaroslav將能夠回答。

編輯: 不正確的行爲被糾正之後this issue

+0

我想問題是我已經定義了我的輸入張量。 'input_tensor = tf.placeholder(tf.float32,(None,TIME_STEPS,128),'input_tensor')' – chasep255

+0

問題在於我只想要匹配第一個維度。其他維度會有所不同。 – chasep255

1

您正在混合靜態形狀和動態形狀。靜態形狀是你在tensor.get_shape(tensor)期間獲得的,這是努力獲得形狀的最佳嘗試,而動態形狀來自sess.run(tf.shape(tensor))並且它始終被定義。

更確切地說,tf.shape(tensor)在圖形中創建一個op,它將在run調用中產生形狀張量。如果你做aop=tf.shape(tensor)[0],通過_SliceHelper有一些魔法,它增加了額外的操作,可以在run調用中提取形狀張量的第一個元素。

這意味着myval=tf.zeros((aop, 128))具有運行aop獲得的尺寸,這意味着,直到您發出run通話myval第一個維度是不確定的。 IE,您的運行調用可能看起來像sess.run(myval, feed_dict={aop:2},其中feed_dict優先於aop,因此靜態形狀推斷報告該維度的?

+0

真正的問題是爲什麼靜態(推斷)形狀**忘記**關於第二維(128)? (?,?)當它應該是(?,128) –

+0

我猜問題是存儲'state_size',我不能再現'?'失敗,如果我只是放一些整數 –

+0

請查看我的答案以獲取可重複的代碼。 –

相關問題