Для тензорного потока 1.8, кажется, мне не нужно писать код для повторного использования переменной в RNNCell - PullRequest
0 голосов
/ 30 мая 2018

Я следовал учебному пособию по языковому моделированию: https://www.tensorflow.org/tutorials/recurrent и прочитал соответствующий код: https://github.com/tensorflow/models/blob/master/tutorials/rnn/ptb/ptb_word_lm.py.

Я обнаружил, что автор закодирован следующим образом из 237-й строки:

outputs = []
with tf.variable_scope("RNN"):
  for time_step in range(self.num_steps):
    if time_step > 0: tf.get_variable_scope().reuse_variables()
    (cell_output, state) = cell(inputs[:, time_step, :], state)
    outputs.append(cell_output)
output = tf.reshape(tf.concat(outputs, 1), [-1, config.hidden_size])
return output, state

Я знаю, что переменные в RNNCell (или любой другой ячейке) создаются при вызове метода __call__, и переменные должны использоваться совместно после первого временного шага.Но в моем эксперименте я удалил строку:

    if time_step > 0: tf.get_variable_scope().reuse_variables()

и напечатал tf.all_variables():

enter image description here

Кажется, я немне не нужно писать код для повторного использования переменной, я ошибаюсь?

(я также делаю этот эксперимент в тензорном потоке r0.12 (ответный код: https://github.com/tensorflow/tensorflow/blob/r0.12/tensorflow/models/rnn/ptb/ptb_word_lm.py),, если я удалю эту строку, это вызоветa

ValueError: переменная модель / RNN / MultiRNNCell / Cell0 / BasicLSTMCell / Linear / Matrix уже существует, запрещено.)

Кроме того, если я создаю несколько RNNCell объектовЯ думаю, что в одной и той же области переменных все они имеют одни и те же переменные, но на практике каждый объект создает свои собственные переменные. Я действительно запутался.

...