运行 Pytorch 中张量 [batch, channel, sequence, H,W] 上的 conv2d
Running conv2d on tensor [batch, channel, sequence, H,W] in Pytorch
我正在处理一个视频帧数据,我在其中获取输入数据作为 [batch,channel,frame_sequence,height,weight] 形式的张量(用 [B,C,S 表示) ,H,W] 为了清楚起见。所以每个批次基本上由连续的帧序列组成。我基本上想做的是 运行 每个帧上的编码器(由几个 conv2d 组成),即每个 [C,H, W] 并将其返回为 [B,C_output,S,H_output,W_output]。现在 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 custom_imshow(tensor):
if tensor.dim() == 4:
count = 1
for i in range(tensor.size(0)):
img = tensor[i].numpy()
plt.subplot(1, tensor.size(0), count)
img = img / 2 + 0.5 # unnormalize
img = np.transpose(img, (1, 2, 0))
count += 1
plt.imshow(img)
plt.axis('off')
if tensor.dim() == 5:
count = 1
for i in range(tensor.size(0)):
for j in range(tensor.size(1)):
img = tensor[i][j].numpy()
plt.subplot(tensor.size(0), tensor.size(1), count)
img = img / 2 + 0.5 # unnormalize
img = np.transpose(img, (1, 2, 0))
plt.imshow(img)
plt.axis('off')
count +=1
假设我们使用 CIFAR-10 数据集(由 32x32x3 大小的图像组成)。
对于张量 x
:
>>> x.size()
torch.Size([4, 5, 3, 32, 32])
>>> custom_imshow(x)
完成后 x.view(-1, 3, 32, 32)
:
# x.size() -> torch.Size([4, 5, 3, 32, 32])
>>> x = x.view(-1, 3, 32, 32)
>>> x.size()
torch.Size([20, 3, 32, 32])
>>> custom_imshow(x)
如果你回到 5d 张量视图:
# x.size() -> torch.Size([20, 3, 32, 32])
>>> x.view(4, 5, 3, 32, 32)
>>> x.size()
torch.Size([4, 5, 3, 32, 32])
>>> custom_imshow(x)
我正在处理一个视频帧数据,我在其中获取输入数据作为 [batch,channel,frame_sequence,height,weight] 形式的张量(用 [B,C,S 表示) ,H,W] 为了清楚起见。所以每个批次基本上由连续的帧序列组成。我基本上想做的是 运行 每个帧上的编码器(由几个 conv2d 组成),即每个 [C,H, W] 并将其返回为 [B,C_output,S,H_output,W_output]。现在 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 custom_imshow(tensor):
if tensor.dim() == 4:
count = 1
for i in range(tensor.size(0)):
img = tensor[i].numpy()
plt.subplot(1, tensor.size(0), count)
img = img / 2 + 0.5 # unnormalize
img = np.transpose(img, (1, 2, 0))
count += 1
plt.imshow(img)
plt.axis('off')
if tensor.dim() == 5:
count = 1
for i in range(tensor.size(0)):
for j in range(tensor.size(1)):
img = tensor[i][j].numpy()
plt.subplot(tensor.size(0), tensor.size(1), count)
img = img / 2 + 0.5 # unnormalize
img = np.transpose(img, (1, 2, 0))
plt.imshow(img)
plt.axis('off')
count +=1
假设我们使用 CIFAR-10 数据集(由 32x32x3 大小的图像组成)。
对于张量 x
:
>>> x.size()
torch.Size([4, 5, 3, 32, 32])
>>> custom_imshow(x)
完成后 x.view(-1, 3, 32, 32)
:
# x.size() -> torch.Size([4, 5, 3, 32, 32])
>>> x = x.view(-1, 3, 32, 32)
>>> x.size()
torch.Size([20, 3, 32, 32])
>>> custom_imshow(x)
如果你回到 5d 张量视图:
# x.size() -> torch.Size([20, 3, 32, 32])
>>> x.view(4, 5, 3, 32, 32)
>>> x.size()
torch.Size([4, 5, 3, 32, 32])
>>> custom_imshow(x)