https://www.cnblogs.com/lovychen/p/9368390.html 这一篇讲解了RNN、LSTM的结构(计算公式链接) 两个注意地方: 1)[H,X] * W后和B维度不同, 如何相加
tensorflow代码中,用的这个 nn_ops.bias_add(gate_inputs, self._bias),这个函数的计算方法是,让每个 batch 的输出值,都加上这个 B; 所以维度不同可以相加:【batch_size,Hidden_size】,【Hidden_size】
2)class BasicRNNCell(LayerRNNCell)或者class BasicLSTMCell(LayerRNNCell)是一个batch,一个时刻的计算,若计算所有时刻,则循环执行以下代码,num_step(句长)次; tensorflow 已经封装好了,不需要我们写;
上一篇写tf.nn.rnn_cell.MultiRNNCell的时候,我没留意到tf.nn.rnn_cell.LSTMCell的输入是什么。
我只学到了tf.nn.rnn_cell.LSTMCell是一层循环神经网络,然后我们可以将多层网络放到一个列表里作为tf.nn.rnn_cell.MultiRNNCell的参数。所以我只注意到tf.nn.rnn_cell.MultiRNNCell起到容器的作用。
"""Run one step of LSTM. Args: inputs: input Tensor, 2D, batch x num_units. A `2-D, [batch x output_dim]`, Tensor representing the output of the LSTM after reading `inputs` when previous state was `state`. """学东西和看代码要仔细
可以发现它缺少了时序的维度,就是循环的time step。 下面先看看tf.nn.rnn_cell.LSTMCell的参数:链接 这篇讲得非常清晰,学习就是要互相借鉴。 参数num_units是隐藏状态的特征维数
为了实现时序维度,tf.nn.dynamic_rnn 函数是tensorflow封装的用来实现递归神经网络的函数。
reference1)解释了tf.nn.dynamic_rnn的返回值及处理。
reference2)解释了tf.nn.dynamic_rnn的参数。含代码例子。
cell:LSTM、GRU等的记忆单元。cell参数代表一个LSTM或GRU的记忆单元,也就是一个cell。例如,cell = tf.nn.rnn_cell.LSTMCell((num_units)
这里可以是tf.nn.rnn_cell.MultiRNNCell。
其中 h t h_t ht与outputs中对应的最后一个时刻(即最后一个cell)的输出相等。
sequence_length:是一个list,假设你输入了三句话,且三句话的长度分别是5,10,25,那么sequence_length=[5,10,25]。
这篇没有讲到initial_state参数,网上也难查,应用到在看情况。 3reference)有一点涉及
rnn_cell = tf.nn.rnn_cell.BasicRNNCell(hidden_size) initial_state = rnn_cell.zero_state(batch_size, dtype=tf.float32) initial_state是初始隐藏状态h0: shape=(batch_size, multi_cell.state_size)
不难理解: https://blog.csdn.net/qq_35203425/article/details/81332807 https://zhuanlan.zhihu.com/p/101343700
输入和输出的维度有点不同。 https://zhuanlan.zhihu.com/p/101560470
tf.nn.rnn_cell.LSTMCell参数中 forget_bias: 在训练开始时,为了减小遗忘尺度,遗忘门的偏置默认初始化为1.0,当从已经训练好的CudnnLSTM的checkpoints文件恢复时,这个值必须手动设置为0.