我查看了Tensorflow中LSTMCell
的已保存权重。
它有一个大内核和偏置权重。
内核的维度是
(input_size + hidden_size)*(hidden_size*4)
根据我的理解,这是将4个输入封装到隐藏层仿射变换以及4个隐藏到隐藏层变换。
所以应该有4个大小的矩阵
input_size*hidden_size
和4的大小
hidden_size*hidden_size
有人可以告诉我或指向TF保存这些代码的代码,因此我可以将内核矩阵分解为更小的矩阵。
答案 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)