Понимание формы ядра и смещения Tensorflow BasicLSTMCell

Я хочу лучше понять форму ядра BasicLSTMCell и смещения Tensorflow.

@tf_export("nn.rnn_cell.BasicLSTMCell")
class BasicLSTMCell(LayerRNNCell):

input_depth = inputs_shape[1].value
h_depth = self._num_units
self._kernel = self.add_variable(
    _WEIGHTS_VARIABLE_NAME,
    shape=[input_depth + h_depth, 4 * self._num_units])
self._bias = self.add_variable(
    _BIAS_VARIABLE_NAME,
    shape=[4 * self._num_units],
    initializer=init_ops.zeros_initializer(dtype=self.dtype))

Почему ядро ​​имеет форму = [input_depth + h_depth, 4 * self._num_units]) и смещение формы = [4 * self._num_units]? Может быть, фактор 4 проистекает из гейта забытия, блока ввода, логического элемента и логического элемента? И в чем причина суммирования input_depth и h_depth?

Дополнительная информация о моей сети LSTM:

num_input = 12, временные шаги = 820, num_hidden = 64, num_classes = 2.

С помощью tf.trainables_variables () я получаю следующую информацию:

  • Имя переменной: переменная: 0 Форма: (64, 2) Параметры: 128
  • Имя переменной: Переменная_1: 0 Форма: (2,) Параметры: 2
  • Имя переменной: rnn /basic_lstm_cell /kernel: 0 Форма: (76, 256) Параметры: 19456
  • Имя переменной: rnn /basic_lstm_cell /bias: 0 Форма: (256,) Параметры: 256

Следующий код определяет мою сеть LSTM.

def RNN(x, weights, biases):

    x = tf.unstack(x, timesteps, 1)
    lstm_cell = rnn.BasicLSTMCell(num_hidden)
    outputs, states = rnn.static_rnn(lstm_cell, x, dtype=tf.float32)

    return tf.matmul(outputs[-1], weights['out']) + biases['out']
4 голоса | спросил proe_93 22 AM000000110000004331 2018, 11:56:43

1 ответ


0
Сначала о суммировании ---- +: = 0 =: + ---- и ---- +: = 1 =: + ---- : RNN обычно следуют уравнениям, подобным ---- +: = 2 =: + ---- для вычисления состояния ---- +: = 3 =: + ---- во время ---- +: = 4 =: + ---- .То есть мы применяем матричное умножение к последнему состоянию и текущему входу и добавляем два.Это на самом деле эквивалентно объединению ---- +: = 5 =: + ---- и ---- +: = 6 =: + ---- (давайте просто назовем это ---- +: = 7=: + ---- ), "укладка" двух матриц ---- +: = 8 =: + ---- и ---- +: = 9 =: + ---- (давайте просто назовемэто ---- +: = 10 =: + ---- ) и вычисления ---- +: = 11 =: + ---- .Теперь у нас есть только одно умножение матриц вместо двух;Я считаю, что это может быть распараллелено более эффективно, так что это делается из соображений производительности.Поскольку ---- +: = 12 =: + ---- имеет размер ---- +: = 13 =: + ---- и ---- +: = 14 =: + ---- имеетразмер ---- +: = 15 =: + ---- нам нужно добавить две размерности для связанного вектора ---- +: = 16 =: + ---- .Во-вторых, вы правы насчет фактора 4, исходящего из ворот.По сути, это то же самое, что и выше: вместо выполнения четырех отдельных матричных умножений для входа и каждого из затворов, мы выполняем одно умножение, в результате которого получается большой вектор, который является входным, и все четыре значения логических элементов сцепляются.Тогда мы можем просто разделить этот вектор на четыре части.В исходном коде ячейки LSTM это происходит в строках 627-633 .
ответил xdurch0 22 PM00000010000000631 2018, 13:49:06

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132