Pytorch 如何在标准3通道图像上使用3D卷积?

Pytorch 如何在标准3通道图像上使用3D卷积?,pytorch,Pytorch,我尝试在cifar10数据集上使用3d conv(只是为了好玩)。我看到文档,我们通常输入的是5d张量(N,C,D,H,W)。我真的必须传递5维数据吗 我之所以怀疑,是因为三维卷积仅仅意味着我的conv会在三维/三维方向上移动。所以从技术上讲,我可以有3d,4d,5d,甚至100d张量,然后只要它至少是一个3d张量,所有这些都可以工作。这不对吗 我很快就试过了,但确实出现了一个错误: import torch ​ ​ def conv3d_example(): N,C,H,W = 1,3

我尝试在cifar10数据集上使用3d conv(只是为了好玩)。我看到文档,我们通常输入的是5d张量(N,C,D,H,W)。我真的必须传递5维数据吗

我之所以怀疑,是因为三维卷积仅仅意味着我的conv会在三维/三维方向上移动。所以从技术上讲,我可以有3d,4d,5d,甚至100d张量,然后只要它至少是一个3d张量,所有这些都可以工作。这不对吗

我很快就试过了,但确实出现了一个错误:

import torch
​
​
def conv3d_example():
    N,C,H,W = 1,3,7,7
    img = torch.randn(N,C,H,W)
    ##
    in_channels, out_channels = 1, 4
    kernel_size = (2,3,3)
    conv = torch.nn.Conv3d(in_channels, out_channels, kernel_size)
    ##
    out = conv(img)
    print(out)
    print(out.size())
​
##
conv3d_example()
---------------------------------------------------------------------------
RuntimeError                              Traceback (most recent call last)
<ipython-input-3-29c73923cc64> in <module>
     15 
     16 ##
---> 17 conv3d_example()

<ipython-input-3-29c73923cc64> in conv3d_example()
     10     conv = torch.nn.Conv3d(in_channels, out_channels, kernel_size)
     11     ##
---> 12     out = conv(img)
     13     print(out)
     14     print(out.size())

~/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py in __call__(self, *input, **kwargs)
    491             result = self._slow_forward(*input, **kwargs)
    492         else:
--> 493             result = self.forward(*input, **kwargs)
    494         for hook in self._forward_hooks.values():
    495             hook_result = hook(self, input, result)

~/anaconda3/lib/python3.7/site-packages/torch/nn/modules/conv.py in forward(self, input)
    474                             self.dilation, self.groups)
    475         return F.conv3d(input, self.weight, self.bias, self.stride,
--> 476                         self.padding, self.dilation, self.groups)
    477 
    478 

RuntimeError: Expected 5-dimensional input for 5-dimensional weight 4 1 2 3, but got 4-dimensional input of size [1, 3, 7, 7] instead
导入火炬
​
​
def conv3d_示例():
N、 C,H,W=1,3,7,7
img=火炬的随机数N(N,C,H,W)
##
输入通道,输出通道=1,4
内核大小=(2,3,3)
conv=torch.nn.Conv3d(输入通道、输出通道、内核大小)
##
输出=转换(img)
打印(输出)
打印(out.size())
​
##
conv3d_示例()
---------------------------------------------------------------------------
运行时错误回溯(上次最近调用)
在里面
15
16 ##
--->17 conv3d_示例()
在conv3d_示例()中
10 conv=torch.nn.Conv3d(输入通道、输出通道、内核大小)
11     ##
--->12输出=转换(img)
13打印(输出)
14打印(out.size())
~/anaconda3/lib/python3.7/site-packages/torch/nn/modules/module.py在调用中(self,*input,**kwargs)
491结果=self.\u slow\u forward(*输入,**kwargs)
492其他:
-->493结果=自我转发(*输入,**kwargs)
494用于钩住自身。\u向前\u钩住.values():
495钩子结果=钩子(自身、输入、结果)
前进中的~/anaconda3/lib/python3.7/site-packages/torch/nn/modules/conv.py(自我,输入)
474自我扩张,自我群体)
475返回F.conv3d(输入、自身重量、自身偏差、自身步幅、,
-->476自填充、自膨胀、自组)
477
478
RuntimeError:5维权重4 1 2 3应为5维输入,但得到的是大小为[1,3,7,7]的4维输入

交叉张贴:


    • 考虑以下情况。您有一个3通道NxN映像。在pytorch中,此图像的大小为3xNxN(暂时忽略批处理维度)

      假设您将此图像传递到二维卷积层,无偏差、内核大小为5x5、填充为2、输入/输出通道分别为3和10

      当我们将这个图层应用到输入图像时,实际发生了什么

      你可以这样想

      对于10个输出通道中的每个通道,都有一个大小为3x5x5的内核。使用该内核对3xNxN输入图像应用3D卷积,该内核可被视为在第一维度中未添加。这种卷积的结果是1xNxN特征图

      因为有10个输出层,所以有10个3x5x5内核。应用所有内核后,输出叠加到单个10xNxN张量中

      实际上,在经典意义上,2D卷积层已经在执行3D卷积了


      类似地,对于3D卷积层,它实际上是在进行4D卷积,这就是为什么需要5维输入。

      考虑以下场景。您有一个3通道NxN映像。在pytorch中,此图像的大小为3xNxN(暂时忽略批处理维度)

      假设您将此图像传递到二维卷积层,无偏差、内核大小为5x5、填充为2、输入/输出通道分别为3和10

      当我们将这个图层应用到输入图像时,实际发生了什么

      你可以这样想

      对于10个输出通道中的每个通道,都有一个大小为3x5x5的内核。使用该内核对3xNxN输入图像应用3D卷积,该内核可被视为在第一维度中未添加。这种卷积的结果是1xNxN特征图

      因为有10个输出层,所以有10个3x5x5内核。应用所有内核后,输出叠加到单个10xNxN张量中

      实际上,在经典意义上,2D卷积层已经在执行3D卷积了

      类似地,对于3D卷积层,它实际上是在进行4D卷积,这就是为什么需要5维输入的原因