张量流BasicLSTMCell中的num_units是什么?
lstm
neural-network
recurrent-neural-network
tensorflow
5
0

在MNIST LSTM示例中,我不理解“隐藏层”的含义。当您表示一段时间后展开的RNN时,它是虚构层吗?

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

我知道我应该详细阅读colah的博客以了解这一点,但是在此之前,我只想获取一些代码来处理我拥有的样本时间序列数据。

参考资料:
Stack Overflow
收藏
评论
共 7 个回答
高赞 时间 活跃

这篇精彩的文章

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

也可以在那里查看图片

在此处输入图片说明

收藏
评论

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

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

隐藏单元

资料来源: 了解LSTM


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

在此处输入图片说明

收藏
评论

当LSTM随时间传播时,它会保留两条信息:

hidden状态; hidden状态这是LSTM使用其(forget, input, and output)门随时间推移以及上一个时间步长输出所累积的内存。

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

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

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

收藏
评论

隐藏单元的数量直接表示神经网络的学习能力-它反映了学习参数的数量。值128可能是任意或经验选择的。您可以实验性地更改该值,然后重新运行程序以查看它如何影响训练精度(您可以通过减少很多隐藏单元来获得优于90%的测试精度)。使用更多的单元将使其更有可能完美地记住完整的训练集(尽管这将花费更长的时间,并且存在过度拟合的风险)。

关键要理解的一点是, X是数据数组 (如今通常称为张量 ),这在著名的Colah的博客文章中有点微妙(发现“每一行都包含一个完整的向量” ),但这并不意味着为量值。例如,在显示tanh函数的地方,这意味着该函数在整个数组中广播 (隐式的for循环),而不是每个时间步仅执行一次。

这样, 隐藏单元表示网络内的有形存储,这主要体现在权重数组的大小上。而且,由于LSTM实际上确实有一部分自己的内部存储空间与学习的模型参数分开,因此它必须知道有多少个单位-最终需要与权重的大小一致。在最简单的情况下,RNN没有内部存储-因此,它甚至不需要预先知道要应用多少“隐藏单位”。


  • 很好地回答类似的问题在这里
  • 您可以在TensorFlow中查看BasicLSTMCell 的源代码 ,以确切了解其用法。

旁注: 此表示法在统计和机器学习以及其他使用通用公式处理大量数据的字段中非常常见(另一个示例是3D图形)。对于希望看到自己的for循环显式写出代码的人来说,这需要一点时间来适应。

收藏
评论

我认为使用“ num_hidden”一词会使TF用户感到困惑。实际上,它与展开的LSTM单元无关,而只是张量的尺寸,它是从时间步长张量转换为LSTM单元并馈入LSTM单元的。

收藏
评论

由于我在合并来自不同来源的信息时遇到一些问题,因此创建了下图,该图显示了博客文章( 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体系结构_新

收藏
评论

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

如您所说,您应该阅读Colah的博客文章以了解LSTM,但是这里有些提示。


如果您有形状为[T, 10]的输入x ,则将向LSTM提供从t=0t=T-1的值的序列,每个值的大小为10

在每个时间步[10, n_hidden] ,您都将输入与形状为[10, n_hidden]的矩阵相乘,从而获得n_hidden向量。

您的LSTM在每个时间步t都得到:

  • 前一个隐藏状态h_{t-1} ,大小为n_hidden (在t=0 ,前一个状态为[0., 0., ...]
  • 输入,转换为大小n_hidden
  • 它将总结这些输入并产生下一隐藏状态h_t大小的n_hidden

从Colah的博客文章中: LSTM


如果您只想让代码正常工作,只需保持n_hidden = 128 ,就可以了。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号