1、torch.nn.Conv3d函数参数:
其中kernel_size、padding以及dilation可以是1X3的tuple,与2D卷积不用
self.conv3d = nn.Conv3d(1, 64, kernel_size=(3, 3, 3), padding=(1, 1, 1))
torch框架中的原始参数定义如下:
def __init__(
self,
in_channels: int,
out_channels: int,
kernel_size: _size_3_t, # 1X3的tuple
stride: _size_3_t = 1, # 可以是1X3的tuple,也可以是一个int
padding: _size_3_t = 0, # 可以是1X3的tuple,也可以是一个int
dilation: _size_3_t = 1, # 可以是1X3的tuple,也可以是一个int
groups: int = 1,
bias: bool = True,
padding_mode: str = 'zeros'
)
2、3D卷积的输入输出
(3D conv一般用于对视频帧处理,提取时间维度上的信息)
输入的tensor维度应该是**[B, C ,D, H, W]**:
其中B、C、H、W与2D卷积所输入的一致
1、B:batch_size 每次送入训练的样本数
2、C:channel 通道数,这里我的理解是,若视频帧只取Y通道,C就是1(对于刚输入网络而言)
3、D:深度(D这个维度上含有视频帧时间维度上的信息),这里假设我们对5帧视频进行同时处理(D=5),要获取时间上的信息,那么这里的D应该就是帧数的叠加。
如果每一帧的维度是[B,C,H,W]=[8,1,64,64],那么5帧的输入可以通过torch.stack([5帧列表],dim=2)语句来堆叠成[B,C,D,H,W]=[8,1,5,64,64],这样3d卷积就可以在连续帧之间获取时间维的信息。
每一帧的维度[8,1,32,32]
5帧堆叠在一起[8,1,5,32,32]
实现语句:
torch.stack(frame_[:], dim=2) # 将张量的序列沿dim维取一个新的维度连接起来
(这里的深度5不用与卷积核的深度3对应相等)
我在思考能不能这么认为:(如果把5帧堆叠来经过3D卷积获取时间维度上的信息,5帧一起第一次送进去网络,应该把他看成一个整体,所以他的通道数C应该是1。)
3D卷积的输出在HW不变的情况下(计算好padding),只改变Channel.