【发布时间】:2021-02-14 17:49:26
【问题描述】:
如果我有:
eg6 = torch.tensor([
[ 1., 7., 13., 19.],
[ 2., 8., 14., 20.],
[ 3., 9., 15., 21.],
[ 4., 10., 16., 22.],
[ 5., 11., 17., 23.],
[ 6., 12., 18., 24.]])
batch1 = eg6
batch2 = -eg6
x = torch.cat((batch1,batch2)).view(2,6,4)
然后我想把它分成重叠的块,就像一个滑动窗口函数,并让这些块可以批处理。例如,只看第一个维度,我想要1,2,3、3,4,5、5,6(或5,6,0)。
似乎unfold() 可以满足我的要求。由于某种原因,它转置了最后两个维度,但这很容易修复。将其从形状[2,3,3,4] 更改为[6,3,4] 需要内存副本,但我认为这是不可避免的?
SZ=3
x2 = x.unfold(1,SZ,2).transpose(2,3).reshape(-1,SZ,4)
当x 的形状为[2,7,4] 时,这非常有效。但是只有 6 行,它会丢弃最后一行。
是否有可以告诉unfold() 使用所有数据的版本,最好是使用填充字符?
或者我需要在调用unfold() 之前填充x 吗?最好的方法是什么?我想知道“pad”是否是错误的词,因为我只找到想要在两端放置填充字符的函数,并考虑到卷积。
旁白:看the source of unfold,奇怪的转置似乎是故意而明确的?!出于这个原因,以及不受欢迎的斩波行为,它让我认为我的问题的正确答案可能是编写一个新的低级函数。但这对我来说太费力了,至少在今天……(我认为还需要编写用于向后传递的第二个函数。)
【问题讨论】:
标签: pytorch