Когда вы вызываете tf.contrib.rnn.BasicRNNCell
, скажем,
cell = tf.contrib.rnn.BasicRNNCell(num_units=100)
, его веса (в тензорном потоке это называется kernel
) и смещение не будет создано.На данный момент cell
знает только количество нейронов, которые он собирается создать, и как активировать их потом.(Логически, вам нужно указать cell
размер ввода, чтобы создать переменную веса.)
Тогда вы, вероятно, сделаете:
rnn = tf.nn.dynamic_rnn(cell, rnn_inputs, dtype=tf.float32)
Во время tf.nn.dynamic_rnn
, 2 важные вещипроизойдет последовательно:
cell.build
будет вызван.Так как ввод указан, cell
создаст его весовые коэффициенты (ядро) и смещение.После этого вы можете получить к ним доступ, используя cell._kernel
и cell._bias
.Соответствующие узлы будут добавлены к графу вычислений тензорного потока, но еще не связаны с другими узлами. Будет вызван
cell.call
.Узлы веса и смещения, созданные в 1, связаны с некоторыми новыми узлами для получения результата RNN.
Таким образом, буквально вам не нужно указывать команде, как все делать точно.Что вам нужно сделать, так это использовать API TensorFlow надлежащим образом, и большинство деталей реализации будут очень хорошо проработаны.