web-dev-qa-db-ja.com

ValueError:変数rnn / multi_rnn_cell / cell_0 / basic_lstm_cell / kernelを共有しようとしています

これはコードです:

X = tf.placeholder(tf.float32, [batch_size, seq_len_1, 1], name='X')
labels = tf.placeholder(tf.float32, [None, alpha_size], name='labels')

rnn_cell = tf.contrib.rnn.BasicLSTMCell(512)
m_rnn_cell = tf.contrib.rnn.MultiRNNCell([rnn_cell] * 3, state_is_Tuple=True)
pre_prediction, state = tf.nn.dynamic_rnn(m_rnn_cell, X, dtype=tf.float32)

これは完全なエラーです:

ValueError:変数rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernelを共有しようとしていますが、指定された形状(1024、2048)と見つかった形状(513、2048)。

テンソルフローのGPUバージョンを使用しています。

V1.2(tensorflow-gpu)にアップグレードしたときに、同様の問題が発生しました。 [rnn_cell]*3を使用する代わりに、ループで3つのrnn_cells(stacked_rnn)を作成し(変数が共有されないように)、MultiRNNCellstacked_rnnを指定しました。離れて。それが正しい方法かどうかはわかりません。

stacked_rnn = []
for iiLyr in range(3):
    stacked_rnn.append(tf.nn.rnn_cell.LSTMCell(num_units=512, state_is_Tuple=True))
MultiLyr_cell = tf.nn.rnn_cell.MultiRNNCell(cells=stacked_rnn, state_is_Tuple=True)
30
Maosi Chen

公式のTensorFlowチュートリアルでは、複数のLSTMネットワーク定義のこの方法を推奨しています。

def lstm_cell():
  return tf.contrib.rnn.BasicLSTMCell(lstm_size)
stacked_lstm = tf.contrib.rnn.MultiRNNCell(
    [lstm_cell() for _ in range(number_of_layers)])

ここで見つけることができます: https://www.tensorflow.org/tutorials/recurrent

実際には、Wasi AhmadとMaosi Chenが上記で提案したアプローチとほとんど同じですが、多分もう少しエレガントな形になります。

14
Dmitry Malov

3つのレイヤーのそれぞれのRNNセルが同じ入力および出力形状を共有しているためだと思います。

レイヤー1では、バッチごとのタイムスタンプごとに、入力ディメンションは513 = 1(xディメンション)+ 512(非表示レイヤーのディメンション)です。

レイヤー2および3では、入力ディメンションは1024 = 512(前のレイヤーからの出力)+ 512(前のタイムスタンプからの出力)です。

MultiRNNCellを積み重ねる方法は、おそらく3つのセルが同じ入力および出力形状を共有することを意味します。

2つの異なるタイプのセルを宣言してMultiRNNCellを積み重ね、入力形状を共有しないようにします

rnn_cell1 = tf.contrib.rnn.BasicLSTMCell(512)
run_cell2 = tf.contrib.rnn.BasicLSTMCell(512)
stack_rnn = [rnn_cell1]
for i in range(1, 3):
    stack_rnn.append(rnn_cell2)
m_rnn_cell = tf.contrib.rnn.MultiRNNCell(stack_rnn, state_is_Tuple = True)

そうすれば、このバグなしでデータをトレーニングできます。私の推測が正しいかどうかはわかりませんが、私にとってはうまくいきます。それがあなたのために働くことを願っています。

5
Jack Lv