bugfix> python > 投稿

LSTM RNNの実装では、次のコード行を使用しました。

self.batch_size = tf.shape(x)[0]

ここで、xはデータセットapiから取得したテンソルでした。 xを印刷すると、次の出力が得られました。

Tensor("IteratorGetNext:0", shape=(?, 2, 1024), dtype=float32)

私のコードの残りの部分は

   targets = tf.one_hot(y,num_classes)
    cell = tf.contrib.rnn.BasicLSTMCell
    cells = [cell(num_units=n) for n in num_units]
    stacked_rnn_cell = tf.contrib.rnn.MultiRNNCell(cells, state_is_tuple=True)
    initial_state = stacked_rnn_cell.zero_state(self.batch_size, tf.float32)

...
    output, state = tf.nn.dynamic_rnn(
        stacked_rnn_cell, prev_output, initial_state = initial_state, dtype = tf.float32, 
        sequence_length = [1024]*self.batch_size)
    logits = tf.contrib.layers.fully_connected(output[-1],24)
    xent = tf.nn.softmax_cross_entropy_with_logits_v2(labels = targets, logits = logits)
    self.loss = tf.reduce_mean(xent)
    self.opt = tf.train.GradientDescentOptimizer(0.01).\
        minimize(self.loss,global_step=global_step)
    self.metric_loss,self.update_loss = tf.metrics.mean(self.loss)
    self.summary = tf.summary.scalar('Loss',self.update_loss)

エラーが発生しました:

InvalidArgumentError (see above for traceback): ConcatOp : Dimensions of inputs should match: shape[0] = [1024,2] vs. shape[1] = [1,128]

1024はバッチサイズ、2は入力サイズ、128は状態サイズです。

最初の行を次のように変更した場合

self.batch_size = 1024

または他の定数、それは訓練します。プレースホルダーでこれを処理するのではなく、データサンプルから値を推測するだけで、一般的に使用できます。何か案は?

回答 1 件
  • 解決策を見つけました!問題の行は

    output, state = tf.nn.dynamic_rnn(
        stacked_rnn_cell, prev_output, initial_state = initial_state, dtype = tf.float32, 
        sequence_length = [1024]*self.batch_size)
    
    

    変更する場合:

    output, state = tf.nn.dynamic_rnn(
        stacked_rnn_cell, polar, initial_state = initial_state, dtype = tf.float32, 
        sequence_length = tf.tile([1024],[self.batch_size]))
    
    

    期待どおりに動作するようです。

あなたの答え