2017-02-28 168 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)