2017-09-24 18 views
0

ここでチュートリアルに基づいて単純なRNNをテンソルフローで作成しようとしています。https://danijar.com/introduction-to-recurrent-networks-in-tensorflow/ (GRUではなく単純なRNNセルを使用していますが、ドロップアウトは使用していません)。Tensorflow RNNセルの重みが異なる

シーケンス内の異なるRNNセルに別々の重みが割り当てられているように見えるので、私は混乱します。私は次のコード

import tensorflow as tf 

seq_length = 3 
n_h = 100 # Number of hidden units 
n_x = 26 # Size of input layer 
n_y = 26 # Size of output layer 

inputs = tf.placeholder(tf.float32, [None, seq_length, n_x]) 

cells = [] 
for _ in range(seq_length): 
    cell = tf.contrib.rnn.BasicRNNCell(n_h) 
    cells.append(cell) 
multi_rnn_cell = tf.contrib.rnn.MultiRNNCell(cells) 

initial_state = tf.placeholder(tf.float32, [None, n_h]) 

outputs_h, output_final_state = tf.nn.dynamic_rnn(multi_rnn_cell, inputs, dtype=tf.float32) 

sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 

print('Trainable variables:') 
for v in tf.trainable_variables(): 
    print(v) 

を実行した場合、私は、Python 3でこれを実行すると、私は次のような出力が得られます。

Trainable variables: 
<tf.Variable 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell/kernel:0' shape=(126, 100) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_0/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell/kernel:0' shape=(200, 100) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_1/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_2/basic_rnn_cell/kernel:0' shape=(200, 100) dtype=float32_ref> 
<tf.Variable 'rnn/multi_rnn_cell/cell_2/basic_rnn_cell/bias:0' shape=(100,) dtype=float32_ref> 

まず、これは私が欲しいものではありません - RNNは持っている必要があります入力から隠れ、隠れから隠れたまでの各ウェイトの同じウェイト!

第二に、私は本当に理解していませんなぜ私はこれらのすべての別々の変数を取得します。私がsource code for rnn cellsを見ると、_linearという名前のBasicRNNCellが呼び出され、という名前の変数(グローバルには"kernel"に設定されています)があるかどうか調べ、もしそうなら、それを使用する必要があります。 "kernel""rnn/multi_rnn_cell/cell_0/basic_rnn_cell/kernel:0"にどのように装飾されるのか分かりません。

誰かが私が間違っていることを説明できれば、とても感謝しています。

答えて

2

リカレントニューラルネットワークのレイヤ数と、このRNNがバックプロパゲーションスルーアルゴリズムによって展開されてシーケンスの長さを処理する時間数を区別するように注意してください。あなたのコードで

  • MultiCellRNNがRNN 3層を作成するの世話をしている(あなたがそこに三つの層を作成している、とMultiCellRNNはそれらに対処しやすいようにする唯一のラッパーです) tf.nn.dynamic_rnnは、シーケンスの長さに関連してこの3つのレイヤードネットワークを何回も展開しています
+0

私は今理解しています!ありがとうございます - それはあなたがそれを指摘したので、はっきりと明白です。 –

関連する問題