2016-10-25 9 views
2

テンソルフローでRNNとLSTMをコーディングする方法を学びました。私はこのブログの記事で、オンラインでの例を見つけテンソルフローにおけるRNNとLSTMの実装

以下

http://r2rt.com/recurrent-neural-networks-in-tensorflow-ii.html

はスニペットIがchar-RNN世代のために、最終的に使用するトラブルLSTMネットワークの理解を持っています

x = tf.placeholder(tf.int32, [batch_size, num_steps], name='input_placeholder') 
    y = tf.placeholder(tf.int32, [batch_size, num_steps], name='labels_placeholder') 

    embeddings = tf.get_variable('embedding_matrix', [num_classes, state_size]) 
    rnn_inputs = [tf.squeeze(i) for i in tf.split(1, 
          num_steps, tf.nn.embedding_lookup(embeddings, x))] 

は別のセクションですここで、重みが定義されている場所

with tf.variable_scope('softmax'): 
     W = tf.get_variable('W', [state_size, num_classes]) 
     b = tf.get_variable('b', [num_classes], initializer=tf.constant_initializer(0.0)) 
logits = [tf.matmul(rnn_output, W) + b for rnn_output in rnn_outputs] 

y_as_list = [tf.squeeze(i, squeeze_dims=[1]) for i in tf.split(1, num_steps, y)] 

xは、供給されるデータであり、yはラベルのセットです。 lstm方程式では、一連のゲートがあり、x(t)は系列で乗算され、prev_hidden_​​stateには重みのセットが乗算され、バイアスが加えられ、非リニア性が適用されます。

は、ここで私は一つだけ重み行列は、それは両方のXに対する 作品(t)とが同様prev_hidden_​​stateことを意味して定義されているこの場合

  • を有する疑問です。私はそれが 重み行列で乗算する必要があります知っているが、なぜ最初の次元のnum_classesは、我々は1 の寸法を削除スクイズを使用しますが、なぜされているrnn_inputsについて
  • ですが、私はあることをしたいと思う埋め込み行列の場合
  • ワンホットエンコーディングで。私たちは、離散(BATCH_SIZE X 1) ベクターに 寸法(BATCH_SIZE X num_steps)のXをアンロールし、ネットワークを介してこれらの値を渡すと、この 右

答えて

0

あるれることを理解スプリットからまた

  • どうなさいました。

    この場合、x(t)とprev_hidden_​​stateの両方で動作することを意味する重み行列は1つだけ定義されます。

    tf.nn.rnn_cell.LSTMCellと呼ぶと、より多くの重みがあります。これらは、RNNセルの内部重みです。テンソルフローは、セルを呼び出すときに暗黙的にそれを作成しました。

    明示的に定義した重み行列は、非表示状態から語彙空間への変換です。

    再帰部分を考慮した暗黙の重みを表示し、前の隠れ状態と現在の入力を取り、新しい隠れ状態を出力することができます。私が知っている埋め込み行列についてhttp://colah.github.io/posts/2015-08-Understanding-LSTMs/

    :。そして、多分あなたは、このチュートリアルを使用すると、高い語彙空間に隠れ状態(すなわちstate_size = 200)を変換定義された重み行列(すなわちvocab_size = 2000

    詳細については見ることができますそれは重み行列で乗算されなければならないが、なぜ一次元num_classes

    vocab_sizeためnum_classesアカウントであり、埋め込みマトリックスは、(この例ではstate_sizeに等しい)必要な埋め込みサイズに語彙を変換します。

    rnn_inputsについては、1の次元を削除するsqueezeを使用していますが、なぜワンホットエンコーディングでそれをしたいのですか?

    tf.nn.rnn(batch_size, 1, input_size)の代わりに(batch_size, input_size)という入力を受け取るため、余分なサイズを取り除く必要があります。

    また、私は、ディメンションのx(batch_size X num_steps)をdiscrete(batch_size X 1)ベクタに展開してから、これらの値をネットワーク経由で渡していることを理解していますか?

    さらに正確には、埋め込み後です。 (batch_size, num_steps, state_size)はの要素のリストになり、それぞれのサイズは(batch_size, 1, state_size)です。

    1. サイズ(vocab_size, state_size)を行う、state_size次元ベクトル(行列の列)として各ワードを埋め込む埋め込みマトリックス:

      流れは次のように進みます。

    2. xプレースホルダで指定されたインデックスを取得し、rnn入力を取得します。サイズは(batch_size, num_steps, state_size)です。
    3. tf.splittf.nn.rnnための所望の入力フォーマットを形成する、(batch_size, state_size)それらをsqeeze (batch_size, 1, state_size)
    4. tf.squeezeへの入力を分割します。

    テンソルフローメソッドに問題がある場合は、テンソルフローAPIでそれらを検索して、より詳細な紹介を得ることができます。

  • 関連する問題