Keras中的LSTM实现如何工作

时间:2018-02-10 16:35:18

标签: python machine-learning keras lstm recurrent-neural-network

我正在查看recurrent.py中代码LSTMCellhttps://github.com/keras-team/keras/blob/master/keras/layers/recurrent.py)的代码

该类是否计算单个时间步的隐藏和进位状态?

我在哪里可以找到处理未展开网络的代码,即从时间步长到时间步长?

我试图计算每个时间步的每个门的输出为一个例子。到目前为止,我可以从训练有素的网络中提取权重,偏差并通过遵循1828到1858行的代码来计算激活。特别是:

i = self.recurrent_activation(x_i + K.dot(h_tm1_i,
                                          self.recurrent_kernel_i))
f = self.recurrent_activation(x_f + K.dot(h_tm1_f,
                                          self.recurrent_kernel_f))
c = f * c_tm1 + i * self.activation(x_c + K.dot(h_tm1_c,
                                                self.recurrent_kernel_c))
o = self.recurrent_activation(x_o + K.dot(h_tm1_o,
                                          self.recurrent_kernel_o))

我的输入有形状:输入(seq_length,nb_dim)。因此,为了正确计算每个门的输出,我应该做类似的事情:

for step in range(seq_length):
  input_step = input[step, :]
  x_i = np.dot(input_step, kernel_i) + bias_i
  i = recurrent_activation(x_i + np.dot(h_tm1_i, recurrent_kernel_i)
  <<< repeat for other gates >>>
  <<<compute cell hidden state/carry state>>>

1 个答案:

答案 0 :(得分:2)

  

我在哪里可以找到处理未展开网络的代码,即从时间步长到时间步长?

此逻辑由keras.backend.rnn函数(recurrent.py)完成:

last_output, outputs, states = K.rnn(step,
                                     inputs,
                                     initial_state,
                                     constants=constants,
                                     go_backwards=self.go_backwards,
                                     mask=mask,
                                     unroll=self.unroll,
                                     input_length=timesteps)

step基本上是一个单元格的调用......

def step(inputs, states):
  return self.cell.call(inputs, states, **kwargs)

...如果LSTM单元格计算ifco门,如问题中所述,并评估输出和来自他们的州宣传。

如果你正在使用张量流后端,你可以找到在keras/backend/tensorflow_backend.py中迭代输入序列的实际循环。