1

Je souhaite ré-implémenter la boucle d'étape RNN de https://www.tensorflow.org/api_docs/python/tf/contrib/rnn/static_rnn mais cela ne fonctionne pas pour moi. Je reçois "Variable test/basic_lstm_cell/weight existe déjà" sans réutilisation et "Variable test/basic_lstm_cell/weights n'existe pas" lorsque la réutilisation est définie sur True."Les poids variables existent déjà" dans l'exemple de code RNN du tutoriel

import tensorflow as tf 
batch_size = 32 
n_steps = 10 
lstm_size = 10 
n_input = 17 

words = tf.placeholder(tf.float32, [batch_size, n_steps, n_input]) 
words = tf.transpose(words, [1, 0, 2]) 
words = tf.reshape(words, [-1, n_input]) 
words = tf.split(words, n_steps, 0) 

with tf.variable_scope('test', reuse=True): 
    cell = tf.contrib.rnn.BasicLSTMCell(lstm_size) 
    state = cell.zero_state(batch_size, dtype=tf.float32) 
    outputs = [] 
    for input_ in words: 
     output, state = cell(input_, state) 
     outputs.append(output) 

Répondre

1

Regardez the source of the function you are trying to re-implement. Le bit important est que l'indicateur de réutilisation n'est pas défini dans la première itération de la boucle, mais il est défini dans tous les autres. Donc, dans votre cas, une portée qui contient la boucle avec la constante de drapeau pour la portée ne fonctionnera pas, vous devrez faire quelque chose comme

with tf.variable_scope('test') as scope: 
    cell = tf.contrib.rnn.BasicLSTMCell(lstm_size) 
    state = cell.zero_state(batch_size, dtype=tf.float32) 
    outputs = [] 
    for step, input_ in enumerate(words): 
     if step > 0: 
      scope.reuse_variables() 
     output, state = cell(input_, state) 
     outputs.append(output)