在LSTM单元电路中实际上是num_unit是什么?

时间:2018-03-11 21:33:00

标签: python tensorflow deep-learning lstm rnn

我非常努力地到处搜索,但是我无法在TensorFlow中找到creation of database failed Error: database "jeff" does not exist 实际上是什么。我试图将我的问题与this question联系起来,但我无法在那里得到明确的解释。

在TensorFlow中,在创建基于LSTM的RNN时,我们使用以下命令

num_units

正如Colah's blog所说,这是一个基本的LSTM单元格:

enter image description here

现在,假设我的数据是:

cell = rnn.BasicLSTMCell(num_units=5, state_is_tuple=True)

我的意见是:

idx2char = ['h', 'i', 'e', 'l', 'o']

# Teach hello: hihell -> ihello
x_data = [[0, 1, 0, 2, 3, 3]]   # hihell
x_one_hot = [[[1, 0, 0, 0, 0],   # h 0
              [0, 1, 0, 0, 0],   # i 1
              [1, 0, 0, 0, 0],   # h 0
              [0, 0, 1, 0, 0],   # e 2
              [0, 0, 0, 1, 0],   # l 3
              [0, 0, 0, 1, 0]]]  # l 3

y_data = [[1, 0, 2, 3, 3, 4]]    # ihello

形状x_one_hot = [[[1, 0, 0, 0, 0], # h 0 [0, 1, 0, 0, 0], # i 1 [1, 0, 0, 0, 0], # h 0 [0, 0, 1, 0, 0], # e 2 [0, 0, 0, 1, 0], # l 3 [0, 0, 0, 1, 0]]] # l 3

this blog中,我们有以下图片

enter image description here

据我所知,[6,5]将展开BasicLSTMCell个时间步骤,其中t是我的行数(如果我错了,请纠正我!)。例如,在下图中,LSTM将展开t个时间步。

enter image description here

在Colah的博客中,它已经写了

  

每一行都带有一个完整的载体

所以,让我们看看我的t = 28输入矩阵将如何通过这个基于LSTM的RNN。

enter image description here

如果我的上图是正确的,那么[6,5](我们在LSTM单元格中定义)究竟是什么?它是LSTM细胞的参数吗?

如果num_units是单个LSTM单元格的参数,那么它应该是这样的:

enter image description here

enter image description here

如果上图是正确的,那么LSTM单元格的以下示意图中的那些5 num_unit在哪里(根据Colah的博客)?

enter image description here

如果你能用一个数字给出答案,那将非常有帮助!您可以编辑或创建新的白板图here

1 个答案:

答案 0 :(得分:1)

你的理解是完全正确的。然而,不幸的是,Tensorflow术语和文献之间存在不一致。为了理解,您需要深入了解Tensorflow实现代码。

Tensorflow宇宙中的单元在Colah的宇宙中称为LSTM层(即展开版本)。这就是为什么你总是定义一个单元格,而不是Tensorflow架构中的一个层。例如,

cell=rnn.BasicLSTMCell(num_units=5,state_is_tuple=True)

检查此处的代码。

https://github.com/tensorflow/tensorflow/blob/ef96faaf02be54b7eb5945244c881126a4d38761/tensorflow/python/ops/rnn_cell.py#L90

  

该包装中细胞的定义不同于文献中使用的定义。在文献中,单元格指的是具有单个标量输出的对象。此包中的定义是指这些单元的水平数组。

因此,为了理解Tensorflow中的num_units,最好设想一个展开的LSTM,如下所示。

enter image description here

在展开的版本中,您有一个输入 X_t ,这是一个张量。指定形状的输入时

  

[batch_size时,time_steps,n_input]

到Tensorflow,它知道从 time_steps 参数中展开多少次。

因此,如果您在TensorFlow中将 X_t 作为一维数组,则在Colahs展开版本中,每个LSTM单元格 x_t 将成为标量值(请注意大写情况X (矢量/数组)和小例x(标量) - 也在Colah的数字中)

如果您在Tensorflow中将 X_t 作为2D数组,那么在Colahs展开版本中,每个LSTM单元格 x_t 将变为一维数组/向量(如您的情况)这里)等等。

现在,这是最重要的问题。

Tensorflow如何知道输出/隐藏维度是什么** Z_t / H_t

(请注意H_t和Z_t之间的区别 - 我通常喜欢将它们分开,因为H_t返回到输入(循环)并且 Z_t 是输出 - 未在图中显示)

它与 X_t 的尺寸相同吗?

。它可以是任何不同的形状。您需要将其指定为Tensorflow。这是 num_units - 输出大小

在代码中查看:

https://github.com/tensorflow/tensorflow/blob/ef96faaf02be54b7eb5945244c881126a4d38761/tensorflow/python/ops/rnn_cell.py#L298-L300

    @property
    def output_size(self):
        return self._num_units

Tensorflow使用Colahs Universe中定义的LSTM单元的实现,如下文所述:

https://arxiv.org/pdf/1409.2329.pdf