with recurrent neural network machine learning graves example celda tensorflow deep-learning lstm

tensorflow - recurrent - ValueError: Intentando compartir la variable rnn/multi_rnn_cell/cell_0/basic_lstm_cell/kernel



rnn tensorflow (3)

Encontré un problema similar cuando actualicé a v1.2 (tensorflow-gpu). En lugar de usar [rnn_cell]*3 , creé 3 rnn_cells (stacked_rnn) por un bucle (para que no compartan las variables) y alimente MultiRNNCell con stacked_rnn y el problema desaparece. No estoy seguro de que sea la forma correcta de hacerlo.

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)

Este es el código:

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)

Esto es error completo:

ValueError: Intentando compartir la variable rnn / multi_rnn_cell / cell_0 / basic_lstm_cell / kernel, pero especificó la forma (1024, 2048) y la forma encontrada (513, 2048).

Estoy usando una versión GPU de tensorflow.


Supongo que es porque sus celdas RNN en cada una de sus 3 capas comparten la misma forma de entrada y salida.

En la capa 1, la dimensión de entrada es 513 = 1 (su dimensión x) + 512 (dimensión de la capa oculta) para cada marca de tiempo por lote.

En las capas 2 y 3, la dimensión de entrada es 1024 = 512 (salida de la capa anterior) + 512 (salida de la marca de tiempo anterior).

La forma en que apila su MultiRNNCell probablemente implica que 3 celdas comparten la misma forma de entrada y salida.

Apilo MultiRNNCell declarando dos tipos de celdas separadas para evitar que compartan la forma de entrada

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)

Entonces puedo entrenar mis datos sin este error. No estoy seguro de si mi suposición es correcta, pero funciona para mí. Espero que funcione para ti.


Un tutorial oficial de TensorFlow recomienda esta forma de definición de múltiples redes 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)])

Lo puedes encontrar aquí: https://www.tensorflow.org/tutorials/recurrent

En realidad, es casi el mismo enfoque que Wasi Ahmad y Maosi Chen sugirieron anteriormente, pero quizás en una forma un poco más elegante.