【发布时间】: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] 不同。
问题:
- 为了让mini-batch和一个一个一样,正常的使用方式是什么?
- 是否有给定的 pytorch api?
- 如果没有,如何实现?
【问题讨论】:
-
不幸的是,在 pytorch 中使用填充序列和卷积非常痛苦。我通常通过编写自己的必要操作(mean、std、var、...)的掩码实现来解决这些问题,这对于正确的批范数计算也很有用。但是为 1D convs 使用 pack padding seqence 会非常好。
标签: deep-learning nlp time-series conv-neural-network pytorch