【问题标题】:Pytorch: how to mask flexible size of input for average pooling?Pytorch:如何屏蔽平均池化的灵活输入大小?
【发布时间】:2019-11-11 21:29:00
【问题描述】:

背景:我想将卷积和平均池化应用于序列分类任务。

问题:没有输入掩码,mini-batch 和 one-by-one 的计算会有所不同。 例如:

# Two sequences.
s1 = torch.range(start=1, end=6).view(-1, 1)
s2 = torch.range(start=1, end=3).view(-1, 1)

##########################################
# one-by-one

# Convolutions.
kernels = torch.ones(1, 1, 2)
h1 = F.conv1d(s1.view(1, 1, -1), kernels) #h1=[[[3, 5, 7, 9, 11]]]
h2 = F.conv1d(s2.view(1, 1, -1), kernels) #h2=[[[3, 5]]]

# Average pooling.
h1 = h1.mean(-1) #h1=[[7]]
h2 = h2.mean(-1) #h2=[[4]]

##########################################
# mini-batch
s = torch.nn.utils.rnn.pad_sequence([s1, s2], batch_first=True)
s = s.permute(0, 2, 1)
h = torch.mean(F.conv1d(s, kernels), dim=-1) #h=[[7], [2.2]]

如您所见,h[h1, h2] 不同。

问题

  1. 为了让mini-batch和一个一个一样,正常的使用方式是什么?
  2. 是否有给定的 pytorch api?
  3. 如果没有,如何实现?

【问题讨论】:

  • 不幸的是,在 pytorch 中使用填充序列和卷积非常痛苦。我通常通过编写自己的必要操作(mean、std、var、...)的掩码实现来解决这些问题,这对于正确的批范数计算也很有用。但是为 1D convs 使用 pack padding seqence 会非常好。

标签: deep-learning nlp time-series conv-neural-network pytorch


【解决方案1】:

理想情况下,当 pytorch 卷积和池化操作将支持打包序列时,这将不再是问题,但 afaik 还不是这种情况。

所以,你必须自己处理这个问题。有两个问题需要处理:

  • 在右边界,带填充的卷积可能会比不带填充的卷积提供更多的输出
  • 您的 mean() 操作将考虑填充

一种可能的解决方案是计算一个掩码张量,该张量用 0 掩码所有超出“正常”输出范围的卷积输出,当您在没有填充的情况下逐个处理序列时将获得这些输出。因此,您可以将此掩码与卷积的实际输出相乘以将所有掩码输出设置为零,最后实现您自己的 mean() 运算符,该运算符对未掩码的时间步数进行求和和除。

这不是很容易做到 ;-) 可能还有其他我不知道的解决方案。

【讨论】:

    猜你喜欢
    • 2017-01-23
    • 1970-01-01
    • 2012-04-09
    • 2020-04-21
    • 2015-02-20
    • 2020-04-12
    • 2020-02-10
    • 1970-01-01
    • 2018-04-05
    相关资源
    最近更新 更多