tensorflow BasicLSTMCell中的num_units是什么?

Sub*_*rat 47 neural-network lstm tensorflow recurrent-neural-network

在MNIST LSTM示例中,我不明白"隐藏层"的含义.是否随着时间的推移代表展开的RNN时会形成虚构层?

为什么num_units = 128在大多数情况下?

我知道我应该详细阅读colah的博客来理解这一点,但在此之前,我只是希望得到一些代码来处理我所拥有的时间序列数据.

nob*_*bar 39

隐藏单元的数量直接表示神经网络的学习能力 - 它反映了学习参数的数量.该值128可能是任意或经验选择的.您可以通过实验改变值并重新运行程序,看看它是如何影响训练精度(你可以得到更好的超过90%的测试精度很多更少的隐藏单元).使用更多单位使得更有可能完美地记住完整的训练集(尽管需要更长时间,并且存在过度拟合的风险).

要理解的关键是,在着名的Colah博客文章中有点微妙(发现"每条线都带有一个完整的向量"),这X是一个数据数组(现在通常被称为张量) - 它并不意味着一个值.例如,在显示tanh函数的情况下,意味着暗示函数在整个数组中广播(隐式for循环) - 而不是每个时间步骤简单地执行一次.

因此,隐藏单元表示网络内的有形存储,其主要表现在权重阵列的大小中.而且因为LSTM实际上确实有一些与学习模型参数分开的内部存储,它必须知道有多少单位 - 最终需要与权重的大小一致.在最简单的情况下,RNN没有内部存储 - 因此它甚至不需要事先知道它应用了多少"隐藏单元".


  • 这里对类似问题的答案很好.
  • 您可以在TensorFlow中查看BasicLSTMCell 的源代码,以确切了解它的使用方法.

旁注:这种表示法在统计学和机器学习中很常见,而其他领域使用通用公式处理大批量数据(3D图形是另一个例子).对于那些希望for明确地看到他们的循环写出来的人来说,需要一些习惯.


Arr*_*val 35

这篇精彩的文章

num_units 可以解释为来自前馈神经网络的隐藏层的类比.前馈神经网络的隐藏层中的节点数量等于网络的每个时间步长的LSTM小区中的LSTM单元的num_units数量.

看那里的图像!

在此输入图像描述

  • @Biranchi,LSTM单元内部是LSTM单元.在引用的文章中,每个LSTM单元中的每个"num_units"接收图像的某一行的一个像素.图像的大小为28x28像素.在这个例子中,他们使用了28个`num_units``和28个LSTM单元.基本上每个单元格都在图像的给定行上工作. (4认同)

Oli*_*rot 28

这个论点n_hiddenBasicLSTMCell是LSTM隐藏单元的数量.

正如你所说,你应该真正阅读Colah的博客文章,了解LSTM,但这里有点提醒.


如果你有一个输入x形状的[T, 10],你将喂LSTM与值序列从t=0t=T-1,各尺寸的10.

在每个时间步,您将输入与形状矩阵相乘[10, n_hidden],并得到一个n_hidden向量.

你的LSTM在每个时间步都获得t:

  • 上一个隐藏状态h_{t-1},大小n_hidden(at t=0,之前的状态是[0., 0., ...])
  • 输入,转换为大小 n_hidden
  • 它将对这些输入求和并产生下一个隐藏h_t的大小状态n_hidden

来自Colah的博文: LSTM


如果您只想让代码正常工作,请继续使用n_hidden = 128,您就可以了.

  • "输入,转换为大小n_hidden"完全酷,如你所说,用矩阵乘法.但是在我提到的mnist代码示例中,他似乎是在批量处理所有向量值:x = tf.transpose(x,[1,0,2])...,得到28 x 128 x 28形.我不明白. (2认同)

小智 8

LSTM在通过时间传播时保留两条信息:

一个hidden州; 这是LSTM使用其(forget, input, and output)门通过时间累积的内存,以及之前的时间步输出.

Tensorflow num_units是LSTM隐藏状态的大小(如果不使用投影,也是输出的大小).

为了使名称num_units更直观,您可以将其视为LSTM单元格中隐藏单元的数量或单元格中的内存单元数.

看看这个很棒的帖子,以便更清晰


kma*_*o23 7

这个术语num_unitsnum_hidden_units有时nhid在实现中使用变量名称表示,意味着 LSTM 单元的输入是维度向量nhid(或者对于批处理实现,它是形状batch_sizex的矩阵nhid)。因此,输出(来自 LSTM 单元)也将具有相同的维度,因为 RNN/LSTM/GRU 单元不会改变输入向量或矩阵的维度。

如前所述,该术语是从前馈神经网络 (FFN) 文献中借用的,在 RNN 的上下文中使用时会引起混淆。但是,这个想法是,即使是 RNN 也可以在每个时间步被视为FFN。在这个视图中,隐藏层确实包含num_hidden如下图所示的单元:

rnn-隐藏单元

资料来源:了解 LSTM


更具体地说,在下面的示例中,num_hidden_unitsornhid将是3,因为隐藏状态(中间层)的大小是一个3D 向量

在此处输入图片说明


P. *_* Li 6

我认为TF用户使用术语"num_hidden"会让人感到困惑.实际上它与展开的LSTM细胞无关,它只是张量的维度,它从时间步输入张量转换为LSTM细胞并送入LSTM细胞.


Hen*_*ski 5

由于我在合并来自不同来源的信息时遇到一些问题,因此创建了下图,该图显示了博客文章(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)和(https://jasdeep06.github.io/posts/Understanding-LSTM-in-Tensorflow-MNIST/),我认为图形很有帮助,但在解释number_units时出错。

几个LSTM单元形成一个LSTM层。如下图所示。由于您主要处理的是非常广泛的数据,因此不可能将所有内容都整合到模型中。因此,数据被分成小批,然后依次处理,直到读入包含最后一部分的批。在图的下部,您可以看到输入(深灰色),在该输入中读取了批从批次1到批次batch_size的一个接一个。上面的LSTM单元1到LSTM单元time_step的单元代表所描述的LSTM模型的单元(http://colah.github.io/posts/2015-08-Understanding-LSTMs/)。像元数等于固定时间步数。例如,如果您使用总共150个字符的文本序列,则可以将其分为3(batch_size),并且每批的长度为50(time_steps的数目,因此是LSTM单元的数目)。如果随后对每个字符进行一次编码,则每个元素(输入的深灰色框)将代表一个向量,该向量具有词汇表的长度(特征数量)。这些向量将流入各自细胞中的神经元网络(细胞中的绿色元素),并将其尺寸更改为隐藏单元数(number_units)的长度。)。因此,输入具有维度(batch_size x time_step x功能)。长时存储器(单元状态)和短时存储器(隐藏状态)具有相同的尺寸(batch_size x number_units)。由细胞产生的浅灰色块具有不同的维数,因为神经网络(绿色元素)中的转换是借助隐藏单位(batch_size x time_step x number_units)进行的。可以从任何单元返回输出,但是大多数情况下只有最后一个块(黑色边框)中的信息才是相关的(并非在所有问题中都是如此),因为它包含了先前时间步长中的所有信息。

LSTM体系结构_新