TensorFlow中MultiRNNCell的state_size是什么?

时间:2016-04-20 02:41:50

标签: tensorflow

使用以下BasicLSTM单元格的配置:

...
num_layers = 2 
num_steps = 10 
hidden_size = 200    
...

我使用2个隐藏图层模型:

lstm_cell = rnn_cell.BasicLSTMCell(hidden_size, forget_bias=0.0) 
cell = rnn_cell.MultiRNNCell([lstm_cell] * 2)

什么是cell.state_size

我得到了30 x 800,但我无法理解它是怎么回事?

PS:请参阅https://github.com/tensorflow/tensorflow/blob/97f585d506cccc57dc98f234f4d5fcd824dd3c03/tensorflow/python/ops/rnn_cell.py#L353

中的源代码

似乎将statesize作为2 * unitsize返回。但为什么州的规模应该是单位面积的两倍呢?

3 个答案:

答案 0 :(得分:10)

对于单个BasicLSTMCell,状态是(c=200, h=200)的元组,在您的情况下。 c是200个单位(神经元)的单元状态,h是200个单位的隐藏状态。

要理解这一点,请考虑一个香草RNN细胞。它只有一个隐藏状态从一次性步骤传递到下一个步骤。这是TensorFlow中实现的BasicRNNCell的情况。如果你tf.nn.rnn_cell.BasicRNNCell(200),它的状态是h = 200的单个整数。

LSTM为纵向存储器添加了一个额外的单元层,其大小与隐藏层相同,因此LSTM的整体状态为2x200 = 400.

this paper的介绍部分可能会有所帮助。

不得不说TensorFlow的文档对于初学者来说有点过于简洁。

答案 1 :(得分:6)

要计算LSTM步骤,您需要应用四个函数,每个函数都使用维hidden_size

  • 输入门
  • 输出门
  • 忘记门
  • 隐藏状态

所以你需要hidden_size * 4 = 200 * 4 = 800

30来自您的批量大小,因为您每批处理30个样本。

这就是你的细胞记忆消耗(30, 800)

请参阅Colah's blog post更详细地解释这些操作。

答案 2 :(得分:2)

看看这个 http://deeplearning.net/tutorial/lstm.html

lstm有两个输出,C_t(state)和h_t(hidden),它们以状态返回。输出o_t是(h_(t-1),C_t,x_t)的函数,它是用于分类的输出 output_t,[C_t,h_t] = tf.rnn.rnn(...)