在Tensorflow中LSTM内核中保存的权重的顺序

时间:2018-01-11 17:22:23

标签: python tensorflow lstm recurrent-neural-network

我查看了Tensorflow中LSTMCell的已保存权重。 它有一个大内核和偏置权重。

内核的维度是

(input_size + hidden_size)*(hidden_size*4)

根据我的理解,这是将4个输入封装到隐藏层仿射变换以及4个隐藏到隐藏层变换。

所以应该有4个大小的矩阵

input_size*hidden_size

和4的大小

hidden_size*hidden_size

有人可以告诉我或指向TF保存这些代码的代码,因此我可以将内核矩阵分解为更小的矩阵。

2 个答案:

答案 0 :(得分:3)

权重按照其他答案中的说明进行组合,但顺序为: 其中c是上下文,h是历史记录。

input_c,      input_h
new_input_c,  new_input_h
forget_c,     forget_h
output_c,     output_h

相关代码为here

if self._state_is_tuple:
  c, h = state
else:
  c, h = array_ops.split(value=state, num_or_size_splits=2, axis=one)

gate_inputs = math_ops.matmul(
    array_ops.concat([inputs, h], 1), self._kernel)
gate_inputs = nn_ops.bias_add(gate_inputs, self._bias)

# i = input_gate, j = new_input, f = forget_gate, o = output_gate
i, j, f, o = array_ops.split(
    value=gate_inputs, num_or_size_splits=4, axis=one)

答案 1 :(得分:2)

在tensorflow 1.5中,LSTM变量在LSTMCell.build方法中定义。源代码可以在rnn_cell_impl.py

中找到
self._kernel = self.add_variable(
    _WEIGHTS_VARIABLE_NAME,
    shape=[input_depth + h_depth, 4 * self._num_units],
    initializer=self._initializer,
    partitioner=maybe_partitioner)
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]变量,而不是8个不同的矩阵,并且所有这些变量都是同时成倍增加的。

门是这样定义的:

i, j, f, o = array_ops.split(value=gate_inputs, num_or_size_splits=4, axis=one)