Aad*_*Ura 6 python deep-learning lstm tensorflow rnn
我非常努力地到处搜索,但我找不到num_unitsTensorFlow 中的实际内容。我试图将我的问题与这个问题联系起来,但我无法在那里得到明确的解释。
在 TensorFlow 中,在创建基于 LSTM 的 RNN 时,我们使用以下命令
cell = rnn.BasicLSTMCell(num_units=5, state_is_tuple=True)
Run Code Online (Sandbox Code Playgroud)
正如Colah 的博客所说,这是一个基本的 LSTM 单元:
现在,假设我的数据是:
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
Run Code Online (Sandbox Code Playgroud)
我的输入是:
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
Run Code Online (Sandbox Code Playgroud)
这是形状[6,5]。
在这个博客中,我们有以下图片
据我所知,BasicLSTMCell将展开t时间步长,t我的行数在哪里(如果我错了,请纠正我!)。例如,在下图中,LSTM 展开了t = 28时间步长。
在可乐的博客中,它写道
每条线携带一个完整的向量
那么,让我们看看我的[6,5]输入矩阵将如何通过这个基于 LSTM 的 RNN。
如果我的上图是正确的,那么究竟是什么num_units(我们在 LSTM 单元中定义的)?它是 LSTM 单元的参数吗?
如果num_unit是单个 LSTM 单元的参数,那么它应该是这样的:
如果上图是正确的,那么num_units下面的 LSTM 单元示意图中的那 5 个在哪里(根据 Colah 的博客)?
如果你能用数字给出你的答案,那将非常有帮助!您可以在此处编辑或创建新的白板图。
你的理解是非常正确的。然而,不幸的是,Tensorflow 术语和文献之间存在不一致。为了理解,您需要深入研究 Tensorflow 实现代码。
Tensorflow 宇宙中的单元在Colah 宇宙中称为 LSTM 层(即展开版本)。这就是为什么您总是在 Tensorflow 架构中定义单个单元,而不是层。例如,
cell=rnn.BasicLSTMCell(num_units=5,state_is_tuple=True)
Run Code Online (Sandbox Code Playgroud)
检查这里的代码。
该包中单元格的定义与文献中使用的定义不同。在文献中,单元指的是具有单个标量输出的对象。该包中的定义是指此类单元的水平阵列。
因此,为了理解 Tensorflow 中的 num_units,最好想象一个展开的 LSTM,如下所示。
在展开版本中,您有一个输入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都会变成 1D 数组/向量(如您的情况所示),依此类推。
现在最重要的问题来了。
Tensorflow 如何知道输出/隐藏维度 ** Z_t/H_t 是多少?
(请注意 H_t 和 Z_t 之间的区别 - 我通常更喜欢将它们分开,因为 H_t 返回输入(循环)而Z_t是输出 - 图中未显示)
它的尺寸与X_t相同吗?
不,它可以是任何不同的形状。您需要将其指定给 Tensorflow。这就是num_units - 输出大小
在代码中检查这里:
@property
def output_size(self):
return self._num_units
Run Code Online (Sandbox Code Playgroud)
Tensorflow 使用以下论文中 Colahs Universe 中定义的 LSTM 单元的实现:
https://arxiv.org/pdf/1409.2329.pdf
| 归档时间: |
|
| 查看次数: |
2363 次 |
| 最近记录: |