Python 在Pytorch中的张量[batch,channel,sequence,H,W]上运行conv2d

Python 在Pytorch中的张量[batch,channel,sequence,H,W]上运行conv2d,python,deep-learning,pytorch,Python,Deep Learning,Pytorch,我正在处理一个视频帧数据,其中我得到的输入数据是张量形式的[batch,channel,frame_sequence,height,weight](为了清晰起见,用[B,C,S,H,W]表示)。因此每个批次基本上由一个连续的帧序列组成。我基本上想做的是在每个帧上运行一个编码器(由几个conv2d组成)[C,H,W]并将其作为[B,C_输出,S,H_输出,W_输出]返回。现在conv2d希望输入为(N,C_in,H_in,W_in)形式。我想知道在不打乱5D张量顺序的情况下,最好的方法是什么。 到

我正在处理一个视频帧数据,其中我得到的输入数据是张量形式的[batch,channel,frame_sequence,height,weight](为了清晰起见,用[B,C,S,H,W]表示)。因此每个批次基本上由一个连续的帧序列组成。我基本上想做的是在每个帧上运行一个编码器(由几个conv2d组成)[C,H,W]并将其作为[B,C_输出,S,H_输出,W_输出]返回。现在conv2d希望输入为(N,C_in,H_in,W_in)形式。我想知道在不打乱5D张量顺序的情况下,最好的方法是什么。 到目前为止,我正在考虑以下想法:

>>> # B,C,seq,h,w
# 4,2, 5,  3,3 

>>> x = Variable(torch.rand(4,2,5,3,3))
>>> x.size() 
#torch.Size([4, 2, 5, 3, 3])
>>> x = x.permute(0,2,1,3,4)
>>> x.size() #expected = 4,5,2,3,3 B,seq,C,h,w
#torch.Size([4, 5, 2, 3, 3])
>>> x = x.contiguous().view(-1,2,3,3)
>>> x.size()
#torch.Size([20, 2, 3, 3])
然后在更新后的x上运行conv2d(编码器)并对其进行整形。但我认为它不会保留张量的原始顺序。那么,我如何才能实现这一目标呢?

你所做的一切都很好。这将保持秩序。你可以通过可视化来验证这一点

我很快构建了这个函数,用于显示存储在4d张量(其中
dim=0
为批处理)或5d张量(其中
dim=0
为批处理,
dim=1
为序列)中的图像:

def自定义显示(张量):
如果张量.dim()==4:
计数=1
对于范围内的i(张量大小(0)):
img=张量[i].numpy()
plt.子图(1,张量大小(0),计数)
img=img/2+0.5#非规范化
img=np.转置(img,(1,2,0))
计数+=1
plt.imshow(img)
打印轴(“关闭”)
如果张量.dim()==5:
计数=1
对于范围内的i(张量大小(0)):
对于范围内的j(张量大小(1)):
img=张量[i][j].numpy()
plt.子图(张量大小(0)、张量大小(1)、计数)
img=img/2+0.5#非规范化
img=np.转置(img,(1,2,0))
plt.imshow(img)
打印轴(“关闭”)
计数+=1
假设我们使用CIFAR-10数据集(由32x32x3大小的图像组成)

对于张量
x

>x.size()
火炬尺寸([4,5,3,32,32])
>>>自定义屏幕显示(x)

执行
x.view(-1,3,32,32)
后:

#x.size()->torch.size([4,5,3,32,32])
>>>x=x.view(-1,3,32,32)
>>>十、尺寸()
火炬尺寸([20,3,32,32])
>>>自定义屏幕显示(x)

如果你回到5d张量视图:

#x.size()->torch.size([20,3,32,32])
>>>x.view(4,5,3,32,32)
>>>十、尺寸()
火炬尺寸([4,5,3,32,32])
>>>自定义屏幕显示(x)

这应该标记为tensorflow吗?这看起来像是一个pytorch问题。我编辑了这个问题以显示正确的标记。