我正在尝试实现一个层来执行本文中描述的 (2+1)D 卷积:https ://arxiv.org/pdf/1711.11248.pdf
基本思想如下:假设我有一个 3D 卷积层,它接受一个输入渠道,并执行3D 张量上的 3D 卷积表示2D 帧被接管时间步长。
该方法不是在张量上进行 3D 卷积,而是将 3D 卷积替换为 2D 卷积,然后沿时间轴进行 1D 卷积。特别是,如果你想表演具有大小内核的 3D 卷积, 你改为执行具有大小过滤器的 2D 卷积其次是沿时间轴大小的一维卷积.
下面是这种层的tensorflow实现:https ://github.com/facebookresearch/R2Plus1D/blob/master/lib/models/video_model.py
但是,我在 pytorch 中实现这种类型的层时遇到了麻烦。这就是我现在所拥有的,我显然做错了什么。如果有人能指出我将如何进行此类卷积的正确方向,我将不胜感激。我正在设置中间通道维度在这个片段中到 20:
class hybrid3d(nn.Module):
def __init__(self, n_classes):
super(hybrid3d, self).__init__()
t, d, d = 3, 3, 3
self.conv1_1 = nn.Conv2d(3, 20, kernel_size=(1, d, d), stride=[1,1,1] , padding=[0,0,0])
self.relu1_1 = nn.PReLU()
self.conv1_2 = nn.Conv1d(20, 12, kernel_size=(t, 1, 1), stride=[1,1,1], padding=[0,0,0])
self.relu1_2 = nn.PReLU()
def forward(self, x):
x = self.relu1_1(self.conv1_1(x))
x = self.relu1_2(self.conv1_2(x))
return x