2017-02-28 108 views
0

我在執行一個RNN,反之到我發現其例子最小化僅在最後步驟中的爲輸出成本如何在TensorFlow上乘以單張量的張量列表?

x = tf.placeholder ("float", [features_dimension, None, n_timesteps]) 
y = tf.placeholder ("float", [labels_dimension, None, n_timesteps]) 

# Define weights 
weights = {'out': tf.Variable (tf.random_normal ([N_HIDDEN, labels_dimension]))} 
biases = {'out': tf.Variable (tf.random_normal ([labels_dimension]))} 

def RNN (x, weights, biases): 
    # Prepare data shape to match `rnn` function requirements 
    # Current data input shape: (features_dimension, BATCH_SIZE, n_timesteps) 
    # Required shape: `n_timesteps` tensors list of shape (BATCH_SIZE, features_dimension) 
    # We make a division of the data to split it in individual vectors that 
    # will be fed for each timestep 

    # Permuting features_dimension and n_timesteps 
    # Shape will be (n_timesteps, BATCH_SIZE, features_dimension) 
    x = tf.transpose (x, [2, 1, 0]) 
    # Reshaping to (BATCH_SIZE*n_timesteps, features_dimension) (we are removing the depth dimension with this) 
    x = tf.reshape(x, [BATCH_SIZE*n_timesteps, features_dimension]) 
    # Split the previous 2D tensor to get a list of `n_timesteps` tensors of 
    # shape (batch_size, features_dimension). 
    x = tf.split (x, n_timesteps, 0) 

    # Define a lstm cell with tensorflow 
    lstm_cell = rnn.BasicLSTMCell (N_HIDDEN, forget_bias=1.0) 
    # Get lstm cell output 
    outputs, states = rnn.static_rnn (lstm_cell, x, dtype=tf.float32) 
    # Linear activation; outputs contains the array of outputs for all the 
    # timesteps 
    pred = tf.matmul (outputs, weights['out']) + biases['out'] 

然而,對象outputsTensorn_timesteps元素的列表,所以pred = tf.matmul (outputs, weights['out']) + biases['out']拋出錯誤

ValueError: Shape must be rank 2 but is rank 3 for 'MatMul' (op: 'MatMul') with input shapes: [100,128,16], [16,1].

。我怎樣才能做這個乘法?

回答

1

的解決方案是tf.stack張量的列表轉換成三維張量,然後使用tf.map_fn沿着維度0上的每個2D張量應用乘法運算:

# Transform the list into a 3D tensor with dimensions (n_timesteps, batch_size, N_HIDDEN) 
    outputs = tf.stack(outputs) 

    def pred_fn(current_output): 
     return tf.matmul(current_output, weights['out']) + biases['out'] 
    # Use tf.map_fn to apply pred_fn to each tensor in outputs, along dimension 0 (timestep dimension) 
    pred = tf.map_fn(pred_fn, outputs)