|
|
1
46
我也偶然发现了这个问题,下面是我的发现。 在训练rnn(lstm或gru或vanilla rnn)时,很难对可变长度序列进行批处理。例如:如果8号批量中的序列长度为[4,6,8,5,4,3,7,8],则将填充所有序列,这将导致8个序列长度为8。你最终会做64次计算(8x8),但是你只需要做45次计算。此外,如果你想用双向RNN做一些有趣的事情,那么只需通过填充就很难进行批量计算,最终可能会比需要做更多的计算。
相反,pytorch允许我们打包序列,内部打包序列是两个列表的元组。一个包含序列元素。元素被时间步交错(参见下面的示例)和其他包含
我可能在某些方面不清楚,所以让我知道,我可以补充更多的解释。 下面是一个代码示例:
|
|
|
2
13
加上Umang的回答,我发现这一点很重要。
返回的元组中的第一个项
但这里最重要的是第二项(批大小)表示批中每个序列步骤的元素数,而不是传递给
例如,给定的数据
|
|
|
3
9
上面的答案回答了这个问题
为什么?
很好。我只想添加一个示例,以便更好地理解
举个例子
首先,我们创建一批2个不同序列长度的序列,如下所示。我们这批共有7种元素。
我们垫
然后,我们打包
现在,我们通过元组
将此工作与标准方法进行比较
让我们看看区别:
以上结果表明
|
|
4
5
这里有一些
视觉解释
1个
这可能有助于为
假设我们有
现在,我们想把这些序列传递给一些递归神经网络体系结构。为此,我们必须填充所有序列(通常是
所以,数据准备工作现在应该已经完成了,对吧?不是真的..因为仍然存在一个紧迫的问题,主要是与实际需要的计算相比,我们需要做多少计算。
为了便于理解,我们还假设我们将把上面的矩阵相乘
因此,我们必须
即使是这个玩具的例子也能省很多钱。现在你可以想象可以节省多少计算量(成本,能量,时间,碳排放等)。
功能性
由于使用
然后,数据张量(即扁平序列)可以传递给目标函数,如用于损失计算的交叉熵。 一 图像学分 @sgrvinod |
|
|
5
1
我用了如下的填充顺序。
其中,文本长度是填充前单个序列的长度,序列根据给定批次内长度的递减顺序排序。 你可以看看一个例子 here 是的。 我们做包装,使RNN没有看到不必要的填充指数,同时处理序列,这将影响整体性能。 |
|
|
Jingyang Wang · 一维numpy阵列的张量幂 1 年前 |
|
|
enryu · Pytorch增加尺寸 1 年前 |
|
|
mxcx · 将torch.all应用于除第一个维度外的所有维度 2 年前 |
|
|
xposure · Tensorflow:训练神经网络时损失没有改善 7 年前 |
|
|
Tom · 如何重塑keras中的张量? 7 年前 |