3D卷积学习笔记

2D维卷积核与三维卷积核有什么区别?

卷积神经网络中二维卷积核与三维卷积核有什么区别? - 知乎

车牌识别用到了3d卷积:

LPRNet_Pytorch/LPRNet.py at master · sirius-ai/LPRNet_Pytorch · GitHub

3d卷积详解:

3D卷积详解 - 知乎

f = nn.Conv3d(16, 33, 3, stride=2)
f = nn.Conv3d(2, 3, (2, 3, 3), stride=(1, 1, 1), padding=(0, 0, 0))
i = torch.Tensor(np.array(range(0,200)).reshape(1,2,4,5,5))
a = torch.Tensor(range(0,108)).reshape(3,2,2,3,3)

f.weight = torch.nn.Parameter(a)
output = f(i) #1x3x3x3x3



y01221 = torch.sum(a[1,:,:,:,:]*i[0,:,2:4,2:5,1:4])
g01221 = output[0,1,2,2,1]#1x3x3x3x3

从以上代码中可以看出:

  1. 输入i的维度为(1,2,4,5,5),表示batch=1,feature=2,depth=4,h=5,w=5。
  2. 滤波器f的维度为(3,2,2,3,3)表示:
  • 维度的第一个数字3由Conv3d的第二个参数决定,表示有3个(2,3,3)的滤波器,
  • 维度的第二个数字2由Conv3d的第一个参数决定,必须和输入i的feature维度相同,这里和Conv2D表示相同的含义,例如在2d中,卷积的尺寸是3x3,输入feature维度为5,那么就默认卷积的维度为(5,3,3),因为需要和输入的feature维度对应。
  • 剩下3个参数具有相同的含义,只不过维度不相同,分别为在depth维度一次扫描2格,在h维度一次扫描3格,在w维度一次扫描3格。

y01221 = torch.sum(a[1,:,:,:,:]*i[0,:,2:4,2:5,1:4])
g01221 = output[0,1,2,2,1]#1x3x3x3x3

根据输出 output[0,1,2,2,1]反推是输入的那一部分和滤波器反应,output.size[1]=1,说明这个是第2个3D滤波器,因此a的第一个参数填1来取出第2个3D滤波器的值。接下来要取出输入的值,由output.size(2)=2可以知道,该3D滤波器在depth维度滑到第3次停下(是这样滑动的:第一次滑动取出0:2,第二次1:3,第三次2:4),并且要取出所有feature维度的值,也就是concatenate((i[0,0,2:4,2:5,1:4],i[0,1,2:4,2:5,1:4]),0)=i[0,:,2:4,2:5,1:4].在h维度和w维度也是相同操作,h维度滑到第3次停下(2:5),w维度滑到第2次停下(1:4,因为一次滑动5格)。

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/123675306