2

Tensorflow で RNN を実装しようとしています。RNN セルを使用して練習する代わりに、独自の関数を作成しています。

問題はシーケンスのタグ付けです。入力サイズは [32, 48, 900] で、32 はバッチ サイズ、48 はタイム ステップ、900 はワンホット エンコードされたベクトルである語彙サイズです。出力は [32, 48, 145] で、最初の 2 つの次元は入力と同じですが、最後の次元は出力語彙サイズ (ワンホット) です。基本的に、これは NLP タグ付けの問題です。

次のエラーが表示されます:

InvalidArgumentError (トレースバックについては上記を参照): ロジットとラベルは同じサイズでなければなりません: logits_size=[48,145] labels_size=[1536,145]

実際の labels_size は [32, 48, 145] ですが、制御なしで最初の 2 つのディメンションをマージします。参考までに 32*48 = 1536

バッチ サイズ 1 で RNN を実行すると、期待どおりに正常に動作します。問題を解決する方法がわかりませんでした。コードの最後の行で問題が発生しています。

コードの関連部分を貼り付けました:

    inputs = tf.placeholder(shape=[None, self.seq_length, self.vocab_size], dtype=tf.float32, name="inputs")
    targets = tf.placeholder(shape=[None, self.seq_length, self.output_vocab_size], dtype=tf.float32, name="targets")
    init_state = tf.placeholder(shape=[1, self.hidden_size], dtype=tf.float32, name="state")

    initializer = tf.random_normal_initializer(stddev=0.1)

    with tf.variable_scope("RNN") as scope:
        hs_t = init_state
        ys = []
        for t, xs_t in enumerate(tf.split(inputs[0], self.seq_length, axis=0)):
            if t > 0: scope.reuse_variables()
            Wxh = tf.get_variable("Wxh", [self.vocab_size, self.hidden_size], initializer=initializer)
            Whh = tf.get_variable("Whh", [self.hidden_size, self.hidden_size], initializer=initializer)
            Why = tf.get_variable("Why", [self.hidden_size, self.output_vocab_size], initializer=initializer)
            bh = tf.get_variable("bh", [self.hidden_size], initializer=initializer)
            by = tf.get_variable("by", [self.output_vocab_size], initializer=initializer)

            hs_t = tf.tanh(tf.matmul(xs_t, Wxh) + tf.matmul(hs_t, Whh) + bh)
            ys_t = tf.matmul(hs_t, Why) + by
            ys.append(ys_t)

    hprev = hs_t
    output_softmax = tf.nn.softmax(ys)  # Get softmax for sampling

    #outputs = tf.concat(ys, axis=0)
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=targets, logits=ys))
4

1 に答える 1