2017-02-28 11 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

溶液は、3Dテンソルにtf.stackにテンソルのリストであり、その後次元0に沿って各2Dテンソルに乗算演算を適用するtf.map_fnを使用:

# 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) 
関連する問題