参考 ————
图例讲解
https://blog.csdn.net/u014518506/article/details/80445283
理解:cell其实只有一个 ; sequence length其实就是这个cell更新多少次;LSTM的参数总数其实从全连接层的角度来看就可以
源码分析
https://www.cnblogs.com/yuetz/p/6563377.html
concat = _linear([inputs, h], 4 * self._num_units, True, scope=scope) # i = input_gate, j = new_input, f = forget_gate, o = output_gate i, j, f, o = array_ops.split(value=concat, num_or_size_splits=4, axis=1) new_c = (c * sigmoid(f + self._forget_bias) + sigmoid(i) * self._activation(j)) new_h = self._activation(new_c) * sigmoid(o)
理解哪里是输入门、输出门、遗忘门
state_is_tuple=True的时候,state是元组形式,state=(c,h)。如果是False,那么state是一个由c和h拼接起来的张量,state=tf.concat(1,[c,h])。在运行时,则返回2值,一个是h,还有一个state。
**如何理解batch在lstm或者rnn里面的运算过程?不是只有一个cell吗!
-- 其实就是batch最开始用于反向传播过程中的原因,每一个batch进入的时候的一个cell会copy成batchsize个,这样就有batchsize个一样的cell,然后在下个timestep时刻,将batchsize个cell的梯度更新的情况统一起来(例如sum操作),作为新的cell的值,那么下一个timestep的初始cell值也都是一样的
https://blog.csdn.net/jcsyl_mshot/article/details/80712110 详细讲了一个timestep中的loss计算和反向传播