6

回帰のためのおもちゃのLSTMモデルを構築したいと思います。 This素敵なチュートリアルは初級者にとってはすでに複雑すぎる。TensorFlow dynamic_rnn回帰:ValueErrorの次元の不一致

長さがtime_stepsの配列が与えられた場合、次の値を予測します。私は次のことを得る私たちはpred = lstm_model(x, weights, biases)でLSTMモデルをインスタンス化

# Network Parameters 
time_steps = 3 
num_neurons= 64 #(arbitrary) 
n_features = 1 

# tf Graph input 
x = tf.placeholder("float", [None, time_steps, n_features]) 
y = tf.placeholder("float", [None, 1]) 

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

#LSTM model 
def lstm_model(X, weights, biases, learning_rate=0.01, optimizer='Adagrad'): 

    # Prepare data shape to match `rnn` function requirements 
    # Current data input shape: (batch_size, time_steps, n_features) 
    # Required shape: 'time_steps' tensors list of shape (batch_size, n_features) 
    # Permuting batch_size and time_steps 
    input dimension: Tensor("Placeholder_:0", shape=(?, 3, 1), dtype=float32) 

    X = tf.transpose(X, [1, 0, 2]) 
    transposed dimension: Tensor("transpose_41:0", shape=(3, ?, 1), dtype=float32) 

    # Reshaping to (time_steps*batch_size, n_features) 
    X = tf.reshape(X, [-1, n_features]) 
    reshaped dimension: Tensor("Reshape_:0", shape=(?, 1), dtype=float32) 

    # Split to get a list of 'time_steps' tensors of shape (batch_size, n_features) 
    X = tf.split(0, time_steps, X) 
    splitted dimension: [<tf.Tensor 'split_:0' shape=(?, 1) dtype=float32>, <tf.Tensor 'split_:1' shape=(?, 1) dtype=float32>, <tf.Tensor 'split_:2' shape=(?, 1) dtype=float32>] 

    # LSTM cell 
    cell = tf.nn.rnn_cell.LSTMCell(num_neurons) #Or GRUCell(num_neurons) 

    output, state = tf.nn.dynamic_rnn(cell=cell, inputs=X, dtype=tf.float32) 

    output = tf.transpose(output, [1, 0, 2]) 
    last = tf.gather(output, int(output.get_shape()[0]) - 1) 


    return tf.matmul(last, weights['out']) + biases['out'] 

:私は、次のモデルを定義

array([ 4., 5., ... 

time_steps=3検討し、シーケンス:

array([ 
    [[ 1.], 
    [ 2.], 
    [ 3.]], 

    [[ 2.], 
    [ 3.], 
    [ 4.]], 
    ... 

目標値はする必要があります:

---> output, state = tf.nn.dynamic_rnn(cell=cell, inputs=X, dtype=tf.float32) 
ValueError: Dimension must be 2 but is 3 for 'transpose_42' (op: 'Transpose') with input shapes: [?,1], [3] 

1)問題が何か知っていますか?

2)LSTM出力に重みを掛けて回帰が得られますか?

+0

エラーの完全なスタックトレースを共有できますか?エラーメッセージから、いくつかの 'tf.transpose()' opが2-Dテンソルに適用されているように見えますが、次元置換(2番目の引数)は3つの値を持っています。私はそれが[この行](https://github.com/tensorflow/tensorflow/blob/dc7293fe0f8084af1f608a5f0d4e93acd9f597f6/tensorflow/python/ops/rnn.py#L488)から来ていると思います。問題は 'tf.nn .dynamic_rnn() 'は、すべてのタイムステップが単一のテンソルでまとめられていることを期待しています。 'tf.split()'を削除して元の 'X'値を' tf.nn.dynamic_rnn() 'に渡してみてください。 – mrry

+0

@mrry dynamic_rdd()の入力ディメンションは(batch_size、time_steps、n_features)である必要があります。したがって、私がそこで行う「前処理」のステップは必要ありません。 – mastro

+0

右。私はこれが悪いエラーメッセージだと思う。 'time_steps'2次元テンソルのリストを渡していますが、正しい入力は単一の3次元テンソルです(そして最初の次元は' time_steps'ではなく 'batch_size'でなければならないので、転置は必要ではありませんいずれか)。 – mrry

答えて

8

コメントで説明したように、tf.nn.dynamic_rnn(cell, inputs, ...)機能は寸法がX num_featuresbatch_size X num_timestepsとしてデフォルトによって解釈され、そのinputs引数として三次元テンソル*のリストを期待。 time_major=Trueを渡した場合は、num_timesteps x batch_size x num_featuresと解釈されます)。したがって、元のプレースホルダで行った前処理は不要で、の値を直接tf.nn.dynamic_rnn()に渡すことができます。 *


技術的には、リストに加えて、複雑なネストされた構造を受け入れることができますが、リーフ要素は、三次元テンソルでなければなりません。これを調査**

**tf.nn.dynamic_rnn()の実装にバグが上がっ。原理的には、入力には少なくとも2つのディメンションがあれば十分ですが、time_major=Falseパスは、入力をタイムメジャー形式に転置したときに正確に3つのディメンションを持つとみなし、このバグが誤ってあなたのプログラムに現れた原因。私たちはそれを解決するために取り組んでいます。

+0

Xで前処理を行い、そのまま渡すと、エラーがスローされます。 ValueError:値がサポートされていません。 @ outputs、_、_ = tf.nn.bidirectional_dynamic_rnn(lstm_fw_cell_m、lstm_bw_cell_m、x、dtype = tf.float32) – neel

関連する問題