gpt4 book ai didi

tensorflow - OutputProjectionWrapper 与 RNN 之上的全连接层

转载 作者:行者123 更新时间:2023-11-30 08:38:13 26 4
gpt4 key购买 nike

我正在阅读《使用 Scikit-Learn 和 TensorFlow 进行机器学习实践》的第 14 章。它说:

Although using an OutputProjectionWrapper is the simplest solution to reduce the dimensionality of the RNN’s output sequences down to just one value per time step (per instance), it is not the most efficient. There is a trickier but more efficient solution: you can reshape the RNN outputs, then apply a single fully connected layer with the appropriate output size. [...] This can provide a significant speed boost since there is just one fully connected layer instead of one per time step.

这对我来说毫无意义。对于 OutputProjectionWrapper,我们需要每个时间步执行 2 个操作:

  1. 根据之前的隐藏状态和输入计算新的隐藏状态。
  2. 通过将密集层应用于计算的隐藏状态来计算输出。

当然,当我们使用普通的BasicRNNCell+顶部的密集层时,我们只需要在每个时间步上执行一个操作(第一个操作),但是我们需要对每个输出张量进行管道传输穿过我们的致密层。因此,我们需要在这两种情况下执行相同数量的操作。

另外,我无法理解以下部分:

This can provide a significant speed boost since there is just one fully connected layer instead of one per time step.

在这两种情况下我们不是只有一个全连接层吗?据我了解 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。顶部密集) - 两者都创建了 14 个具有相同形状的变量。因此,这些方法之间绝对不存在内存差异。

最佳答案

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com