Ответ 1
"_2"
в "BasicLSTMCell_2"
относится к области имен, в которой был создан op outpts[2]
. Каждый раз, когда вы создаете новую область имен (tf.name_scope()
) или область видимости переменной (tf.variable_scope()
) уникальный уникальный суффикс добавляется в текущую область имен на основе данной строки, возможно, с дополнительным суффиксом, чтобы сделать ее уникальной. Вызов rnn.rnn(...)
имеет следующий псевдокод (упрощенное и использующее общедоступные методы API для ясности):
outputs = []
with tf.variable_scope("RNN"):
for timestep, input_t in enumerate(inputs):
if timestep > 0:
tf.get_variable_scope().reuse_variables()
with tf.variable_scope("BasicLSTMCell"):
outputs.append(...)
return outputs
Если вы посмотрите на имена тензоров в outpts
, вы увидите, что они следующие:
>>> print [o.name for o in outpts]
[u'RNN/BasicLSTMCell/mul_2:0',
u'RNN/BasicLSTMCell_1/mul_2:0',
u'RNN/BasicLSTMCell_2/mul_2:0',
u'RNN/BasicLSTMCell_3/mul_2:0',
u'RNN/BasicLSTMCell_4/mul_2:0']
Когда вы вводите новую область имен (путем ввода with tf.name_scope("..."):
или with tf.variable_scope("..."):
), TensorFlow создает новое уникальное имя для области. При первом вводе области "BasicLSTMCell"
TensorFlow использует это имя дословно, потому что ранее оно не использовалось (в области "RNN/"
). В следующий раз TensorFlow добавит "_1"
к области, чтобы сделать ее уникальной, и так далее до "RNN/BasicLSTMCell_4"
.
Основное различие между областями переменных и областями имен заключается в том, что область переменной также имеет набор привязок name-to-tf.Variable
, Вызывая tf.get_variable_scope().reuse_variables()
, мы рекомендуем TensorFlow повторно использовать, а не создавать переменные для области "RNN/"
(и ее дочерних элементов) после timestep 0. Это гарантирует правильное распределение весов между несколькими ячейками RNN.