OutputProjectionWrapper

OutputProjectionWrapper

我正在阅读使用 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,另一个带有 BasicRNNCelltf.layers.dense 在顶部)- 两者都创建了 14 个具有相同形状的变量。所以这些方法之间绝对没有内存差异。

    最佳答案

    我的猜测是,由于矩阵乘法优化,将 1 层应用于形状 (x, n) 的张量比将同一层应用于形状 (x) 的张量 n 次要快。

    关于tensorflow - OutputProjectionWrapper 与 RNN 之上的全连接层,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55301120/

    10-12 21:39