了解Tensorflow BasicLSTMCell内核和偏置形状

pro*_*_93 4 machine-learning deep-learning lstm tensorflow rnn

我想更好地理解Tensorflow的BasicLSTMCell Kernel和Bias的形状。

@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))
Run Code Online (Sandbox Code Playgroud)

为什么内核的形状为[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
  • 变量名称:Variable_1:0 Shape:(2,)Parameters:2
  • 变量名称:rnn / basic_lstm_cell /内核: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']
Run Code Online (Sandbox Code Playgroud)

xdu*_*ch0 5

首先,关于总结input_depthh_depth:RNNs一般遵循等式喜欢h_t = W*h_t-1 + V*x_t来计算状态h的时间t。也就是说,我们将矩阵乘法应用于最后一个状态当前输入,然后将两者相加。实际上,这等效于连接h_t-1x_t(简称为c),“堆叠”两个矩阵W以及V(简称为S)和计算S*c
现在我们只有一个矩阵乘法,而不是两个;我认为这可以更有效地并行化,因此出于性能原因可以这样做。由于h_t-1具有大小h_depthx具有大小,因此input_depth我们需要为级联向量添加二维c

第二,关于门的因子4是正确的。这基本上与上面的相同:我们不对输入和每个门进行四个单独的矩阵乘法,而是执行一个乘法,从而得到一个大矢量,该向量是输入,并将所有四个门值串联在一起。然后,我们可以将此向量分为四个部分。在LSTM单元源代码中,这发生在627-633行中