1

私はリカレントニューラルネットワークを作成するためにtensorflowを使用しようとしています。私のコードは次のようなものです:Tensorflow RNNの入力サイズ

import tensorflow as tf 

rnn_cell = tf.nn.rnn_cell.GRUCell(3) 

inputs = [tf.constant([[0, 1]], dtype=tf.float32), tf.constant([[2, 3]], dtype=tf.float32)] 

outputs, end = tf.nn.rnn(rnn_cell, inputs, dtype=tf.float32) 

すべてがうまくいきます。しかし、私はむしろ実際に何が起こっているのか混乱しています。出力寸法は常にRNNセルの隠された状態のサイズXバッチサイズです - どのように彼らは、入力サイズの完全に独立することができますか?

私の理解が正しければ、入力が各ステップでRNNの隠された状態に連結し、次いで(他の操作の中で)重み行列が乗算されます。これはrnn_cellが作成されているため、入力がさえ宣言される前に、重み行列の寸法は、不可能で入力サイズに依存する必要があることを意味します!

答えて

0

tensorflowのGRUの実装についての質問にanswerを見た後、私は何が起こっている実現してきました。私の直感に反して、GRUCellコンストラクタは重みやバイアス変数をまったく作成しません。代わりに、独自の変数スコープを作成し、実際に呼び出されたときにオンデマンドで変数をインスタンス化します。 Tensorflowの可変スコープメカニズムにより、変数は一度しか作成されず、その後のGRU呼び出しで共有されます。

私は、なぜこのように混乱しているこの実装に進むことにしたのか分かりません。私にはむしろ、追加の暗黙のスコープメカニズムに頼るよりも、GRUCell自体の中tensorflow変数をカプセル化するために、Pythonのオブジェクトレベルの変数のスコープを使用することがより適切であるように思われます。

関連する問題