【nn.Conv3d】三维卷积参数量与运算量

3d卷积过程举例

输入:一个长度为7帧的RGB视频,单帧通道数为3,视频的宽高为60×40,1个视频故bs=1 –>> (1, 3, 7, 60, 40)
3d卷积:nn.Conv3d(3, 5, (4, 7, 7), stride=1, padding=0)
3代表输入特征图通道数,5代表输出特征图通道数,4和7分别代表3d卷积的通道数和宽高。(此外stride和padding也可以设定为 (a,b,b) 的形式,但为了简化说明仅设定空间维度的卷积步长为1,时间维度卷积步长默认为1)
输出:(1, 5, 4, 54, 34),帧数维度增加为4,通道数增加为5,宽高为54和34

3d卷积过程对应下图

3d卷积中参数量为:7×7×4×3×5 = 2940(下面2945为5个偏置)
3d卷积中原算量(乘法次数)为:7×7×4×3×34×54×4×5 = 21,591,360

卷积参数量计算:

import torch
import torch.nn as nn
from torch import autograd
from torchsummary import summary


class NET(nn.Module):
    def __init__(self):
        super(NET, self).__init__()
        self.conv3d_1 = nn.Conv3d(3, 5, (4, 7, 7), stride=1, padding=0)
    def forward(self, x):
        out = self.conv3d_1(x)
        return out


model = NET()
input = autograd.Variable(torch.randn(1, 3, 7, 60, 40))
output = model(input)

print(output.size())

summary(model, (3, 7, 60, 40), batch_size=1, device="cpu")

最终输出:

torch.Size([1, 5, 4, 54, 34])
----------------------------------------------------------------
        Layer (type)               Output Shape         Param #
================================================================
            Conv3d-1          [1, 5, 4, 54, 34]           2,945
================================================================
Total params: 2,945
Trainable params: 2,945
Non-trainable params: 0
----------------------------------------------------------------
Input size (MB): 0.19
Forward/backward pass size (MB): 0.28
Params size (MB): 0.01
Estimated Total Size (MB): 0.48
----------------------------------------------------------------

我的理解和我想说的:

conv2d对应的卷积核其实是三维的,因为卷积核自身尺寸的宽高即两个维度,待卷积特征图的深度方向也是一个维度,所以相当于有c_out个k×k×c_in的“三维”卷积在特征图输入特征图中滑动。但是滑动仅限于平面两个方向。
conv3d的卷积核按理来说应该是四维,但我理解不了那么高的维度空间,重点是卷积核可移动的维度多了一个时间维度。

以上仅是个人理解可能和论坛中其他资料有出入,欢迎大家批评指正。

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年8月8日
下一篇 2023年8月8日

相关推荐