我正在阅读使用 Scikit-Learn 和 TensorFlow 进行机器学习实践的第 14 章。它说:
这对我来说毫无意义。在 OutputProjectionWrapper
的情况下,我们需要在每个时间步执行 2 个操作:
当然,当我们在顶部使用普通的
BasicRNNCell
+ 密集层时,我们只需要在每个时间步(第一个)上做一个操作,但是我们需要将每个输出张量通过我们的密集层进行管道传输。所以我们需要在这两种情况下执行相同数量的操作。另外,我无法理解以下部分:
在这两种情况下,我们不是只有一个全连接层吗?据我了解
OutputProjectionWrapper
在每个时间步上使用相同的共享层。我什至不知道它如何为每个时间步创建不同的层,因为 OutputProjectionWrapper
没有关于我们将使用的时间步数量的信息。如果有人能解释这些方法之间的区别,我将不胜感激。
UPD 这是问题的伪代码。我错过了什么吗?
# 2 time steps, x1 and x2 - inputs, h1 and h2 - hidden states, y1 and y2 - outputs.
# OutputProjectionWrapper
h1 = calc_hidden(x1, 0)
y1 = dense(h1)
h2 = calc_hidden(x2, h1)
y2 = dense(h2)
# BasicRNNCell + dense layer on top of all time steps
h1 = calc_hidden(x1, 0)
y1 = h1
h2 = calc_hidden(x2, h1)
y2 = h2
y1 = dense(y1)
y2 = dense(y2)
UPD 2 我创建了两个小代码片段(一个带有
OutputProjectionWrapper
,另一个带有 BasicRNNCell
和 tf.layers.dense
在顶部)- 两者都创建了 14 个具有相同形状的变量。所以这些方法之间绝对没有内存差异。 最佳答案
我的猜测是,由于矩阵乘法优化,将 1 层应用于形状 (x, n) 的张量比将同一层应用于形状 (x) 的张量 n 次要快。
关于tensorflow - OutputProjectionWrapper 与 RNN 之上的全连接层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55301120/