在 PyTorch 中创建序列数据编码器时是否可以避免编码填充?

问题描述 投票:0回答:1

我正在尝试制作一个观察历史编码器,我的目标是建立一个模型,该模型将维度[时间、批次、特征]的可变长度序列作为输入(其中序列被填充以适应固定的时间长度)并输出维度为 [Batch, New_Features] 的变量。我担心的是,当我使用 FC 层进行降维时,他们会考虑填充数据。有什么办法可以避免这种情况吗?或者这是我不需要担心的事情,因为填充自然会成为独特编码的一部分?

python deep-learning pytorch reinforcement-learning autoencoder
1个回答
0
投票

最简单的方法是在池表示时屏蔽填充元素。

例如,假设您有一个形状为

(bs, sl, n)
的输入(带填充)和一个形状为
(bs, sl)
的二进制填充掩码,其中
1
用于非填充项目,
0
用于填充项目。你可以做这样的事情:

x = ... # (bs, sl, n)
padding_mask = ... # (bs, sl)

embeddings = model(x) # output of size (bs, sl, n)

mean_embeddings = ((embeddings * padding_mask.unsqueeze(-1)).sum(1)) / torch.clamp(padding_mask.sum(-1).unsqueeze(-1), min=1e-9)

当我们计算

mean_embeddings
时,我们将
embeddings
中的所有非填充元素相加,然后除以每个序列中非填充元素的总数。这将创建大小为
(bs, n)
的均值池输出,而不在池计算中包括填充元素。

© www.soinside.com 2019 - 2024. All rights reserved.