2017-02-06 45 views
1

輸入的形狀是[batch_size, maxstep, 50, 50]。我想在每一步使用某個cnn,使其成爲[batch_size, maxstep, 5 * 5 * 32]。乍一看,我認爲我應該使用while_loopTensorflow中的可變長度輸入

但是很難建立這個圖,「maxstep」和「batch_size」都是可變的,所以如何迭代這個張量呢?

這是我的錯誤代碼:

x = tf.placeholder(tf.float32, [2, None, None, 50, 50]) 
source = list() 
target = list() 

W_conv, B_conv = weight_and_bias('conv', [5, 5, 1, 32]) 

for e in x[0]: 
    e_tmp = tf.reshape(e, [-1, 50, 50 ,1]) 
    h_conv = tf.nn.relu(conv2d(e_tmp, W_conv) + B_conv) 
    h_pool = max_pool_2x2(h_conv) 
    h_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 32]) 
    source.append(e_tmp) 

for e in x[1]: 
    e_tmp = tf.reshape(e, [-1, 50, 50 ,1]) 
    h_conv = tf.nn.relu(conv2d(e_tmp, W_conv) + B_conv) 
    h_pool = max_pool_2x2(h_conv) 
    h_flat = tf.reshape(h_pool2, [-1, 5 * 5 * 32]) 
    target.append(e_tmp) 

source = np.array(source) 
target = np.array(target) 
+0

大多數這些操作接受一個批處理維度,並有效地在該批處理上執行操作(比迭代快得多)。是否有理由不能將前兩個維度合併爲一個批量維度(帶有重塑),然後通常調用操作系統? –

+0

@AllenLavoie你的意思是結合「batch_size」和「maxstep」?實際上,這是一個順序問題,在cnn操作之後,我仍然需要將形狀爲[[batch_size,maxstep,5 * 5 * 32]]的批處理饋送到dynamic_rnn。所以如果將前兩個維度結合起來,順序信息將會丟失。 – Sraw

+0

卷積完成後,你不能重新將它重新整理成[batch_size,maxstep,...],然後做任何你需要的順序處理? –

回答

0

隨着AllenLavoie的幫助下,我終於解決了這個問題。

首先我將輸入的形狀[batch_size, variable_step_len, 50, 50]填充爲[batch_size, max_step_len, 50, 50],然後將其重新整形爲[batch_size*max_step_len, 50, 50]

第二我運行cnn並重塑它。