3D-CNN

Q1:什么是2D卷积(多通道)

A1:这里假设输入层是一个 5 x 5 x 3 矩阵,它有 3 个通道。过滤器则是一个 3 x 3 x 3 矩阵。首先,过滤器中的每个卷积核都应用到输入层的 3 个通道,执行 3 次卷积后得到了尺寸为 3 x 3 的 3 个通道。

 面向多通道的 2D 卷积的第一步:过滤器每个卷积核分别应用到输入层的 3 个通道上,之后,这 3 个通道都合并到一起(元素级别的加法)组成了一个大小为 3 x 3 x 1 的单通道。这个通道是输入层(5 x 5 x 3 矩阵)使用了过滤器(3 x 3 x 3 矩阵)后得到的结果。

 

notes:强调两点:

  1. 滤波器的卷积核数量与前一层Feature Maps数量相等。
  2. 一个滤波器只在当前层产生一个Feature Map,可通过滤波器的数量来控制产生的Feature Map的数量。

思考一下,如果卷积核数量小于前一层通道数怎么办?这就是3D卷积的思想来源。

 1.论文背景

2D卷积是针对一张原始图像或者视频的一帧进行的特征提取,但是很多场景中多张图片(MRI slices)或者视频的连续帧之间往往存在关联信息,这就是3D CNN提出的背景。3D CNN主要是为了解决图片之间的关联信息,增加一个新的维度信息。

2.Flash point

2D CNN主要将视频的一帧作为输入,但这就忽略了各帧之间的关联信息。而3D CNN以连续的多帧作为输入,增加了时间维度的信息,能够提取到更具表达性的特征。

3.论文细节

3.1 3D卷积

3D卷积的突出特点:卷积核数量小于前一层通道数

如果是2D卷积应该就是一个卷积核数量为4的滤波器去卷积产生一张Feature Map。但是3D卷积共享一个卷积核产生了多张Feature Map,这些Feature Map之间包含着时间维度的信息,即连续帧之间的关联信息。

上图中时间维度上卷积核大小为3,并且连接使用颜色进行编码,所以共享权值的是相同的颜色,在三维卷积中,将相同的三维卷积核应用于输入视频中重叠的三维立方体重,提取特征。

但是如果想要不同类型的特征呢?与2D卷积一样,用不同的滤波器即可。

 上图中,从连续的帧中提取多个特征。多个三维卷积可以应用于相邻帧,提取多个特征。如图所示,连接集是用颜色编码的,因此共享权重是相同的颜色。请注意,所有6组连接都不共享权重,从而导致右侧出现两个不同的特征映射。

3.2 hardwired kernels

通过上面的讲解你应该知道3D卷积的真正实现了,但是在实际应用中我们不可能直接对连续的帧直接做3D卷积,因为这样提取的信息过于简单,所以需要在3D卷积之前做一次hardwired kernels 卷积。

解释一下这里5种颜色的33个Feature map,作者利用 hardwired kernels 生成了灰度、x方向梯度、y方向梯度、x方向光流、y方向光流五种特征信息(gray,gradient-x,gradient-y, optflow-x, and optflow-y),前面三个通道的信息可以直接对每帧分别操作获取,后面的光流(x,y)则需要利用两帧的信息才能提取,因此H1层的特征maps数量:(7+7+7+6+6=33),特征maps的大小依然是60 * 40。

3.3 3D-CNN

 3D-CNN架构室友1个hardwired kernels层,三个卷积层,两个下采样层,一个全连接层组成。

notes: 

1.上图2个红框表示两个不同的滤波器得到的特征图。

2.上图这种3D卷积由于是对五种特征分开进行卷积的,因此卷积核的数量是3.1节中所有通道一起卷积的卷积核数量的五倍。

在如图3所示的这个架构中,我们考虑以当前帧为中心的7个大小为60×40的帧作为3D CNN模型的输入

H1.首先使用hardwired kernel层使的输入的帧形成多个channel,这使得在第二次的5个不同channel中有33个不同特征信息:gray,gradient-x,gradient-y, optflow-x, and optflow-y.

        gray channel:包含7个输入帧的灰度像素值。

        gradient-x,gradient-y:分别映射计算7和输入帧每个帧延水平和垂直方向的梯度

        optflow-x和optflow-y:分别包含沿水平和垂直方向的光流场,从相邻的输入帧计算中得出。

C2.使用3D卷积内核大小为7x7x3(7x7在空间维度上,3在时间维度)在5个channel上分别进行,为了增加特征映射的数量,在每个位置应用了两组不同的卷积,导致C2层有2组特征映射,每组包含23个特征映射,该层包含1480个可训练参数。

S3:在随后的下采样层S3中:我们在C2层的每个feature map上应用2×2下采样,导致feature map数量相同,但空间分辨率降低。该层可训练参数数为92个。

C4:下一个卷积层C4是通过分别对两组特征映射中的5个channel中的每个通道应用核大小为7×6×3的3D卷积得到的。为了增加特征映射的数量,我们在每个位置应用3个带有不同内核的卷积,导致在C4层中产生6组不同的特征映射,每组包含13个特征映射。该层包含3810个可训练参数。

S6:下一层S5通过在C4层的每个feature map上应用3×3下采样,得到相同数量的feature map,但降低了空间分辨率。该层可训练参数个数为156个。在这个阶段,时间维的大小已经比较小了(gray, gradient-x, gradient-y为3,optflow-x和optflow-y为2),所以我们只在这一层的空间维度进行卷积。所使用的卷积内核的大小为7×4,因此输出特性映射的大小减少为1×1。

 C6:C6层由128个1×1大小的feature map组成,每个feature map都连接到S5层的所有78个feature map,导致289536个可训练参数。

通过多层卷积和子采样,将7个输入帧转换为128D特征向量,捕获输入帧中的运动信息。输出层由与动作数量相同的单元组成,每个单元完全连接到C6层的128个单元。

input—>H1

      神经网络的输入为7张大小为60*40的连续帧,7张帧通过事先设定硬核(hardwired kernels)获得5种不同特征:灰度、x方向梯度、y方向梯度、x方向光流、y方向光流,前面三个通道的信息可以直接对每帧分别操作获取,后面的光流(x,y)则需要利用两帧的信息才能提取,因此H1层的特征maps数量:(7+7+7+6+6=33),特征maps的大小依然是60* 40。

H1—>C2

     用两个7*7*3的3D卷积核对5个channels分别进行卷积,获得两个系列,每个系列5个channels(7*  7表示空间维度,3表示时间维度,也就是每次操作3帧图像),同时,为了增加特征maps的个数,在这一层采用了两种不同的3D卷积核,因此C2层的特征maps数量为:(((7-3)+1)*  3+((6-3)+1)*  2)*  2=23*  2。这里右乘的2表示两种卷积核。特征maps的大小为:((60-7)+1)*  ((40-7)+1)=54 * 34。然后为卷积结果加上偏置套一个tanh函数进行输出。(典型神经网。)

C2—>S3

   2x2池化,下采样。下采样之后的特征maps数量保持不变,因此S3层的特征maps数量为:23 *2。特征maps的大小为:((54 / 2) *  (34 /2)=27  *17

S3—>C4

   为了提取更多的图像特征,用三个7*6*3的3D卷积核分别对各个系列各个channels进行卷积,获得6个系列,每个系列依旧5个channels的大量maps。

我们知道,从输入的7帧图像获得了5个通道的信息,因此结合总图S3的上面一组特征maps的数量为((7-3)+1) * 3+((6-3)+1) * 2=23,可以获得各个通道在S3层的数量分布:

前面的乘3表示gray通道maps数量= gradient-x通道maps数量= gradient-y通道maps数量=(7-3)+1)=5;

后面的乘2表示optflow-x通道maps数量=optflow-y通道maps数量=(6-3)+1=4;

假设对总图S3的上面一组特征maps采用一种7 6 3的3D卷积核进行卷积就可以获得:

((5-3)+1)* 3+((4-3)+1)* 2=9+4=13;

三种不同的3D卷积核就可获得13* 3个特征maps,同理对总图S3的下面一组特征maps采用三种不同的卷积核进行卷积操作也可以获得13*3个特征maps,

因此C4层的特征maps数量:13* 3* 2=13* 6

C4层的特征maps的大小为:((27-7)+1)* ((17-6)+1)=21*12

然后加偏置套tanh。

C4—>S5

3X3池化,下采样。此时每个maps的大小:7* 4。通道maps数量分布情况如下:

gray通道maps数量= gradient-x通道maps数量= gradient-y通道maps数量=3

optflow-x通道maps数量=optflow-y通道maps数量=2;

S5—>C6

      进行了两次3D卷积之后,时间上的维数已经被压缩得无法再次进行3D卷积(两个光流channels只有两个maps)。此时对各个maps用7*42D卷积核进行卷积,加偏置套tanh(烦死了!),获得C6层。C6层维度已经相当小,flatten为一列有128个节点的神经网络层。

C6—>output

      经典神经网络模型两层之间全链接,output的节点数目随标签而定。
 

下面是整个过程中3DCNN各通道数量变化情况以及特征maps大小变化情况:

 参考:3D CNN_The Thinker-CSDN博客

深度学习之3D卷积神经网络_zlinxi-CSDN博客_3d卷积神经网络

        

  • 10
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
对于3D卷积神经网络3D CNN)的PyTorch实现,以下是一个简单的示例代码: ```python import torch import torch.nn as nn # 定义3D CNN模型 class CNN3D(nn.Module): def __init__(self): super(CNN3D, self).__init__() self.conv1 = nn.Conv3d(1, 16, kernel_size=3, stride=1, padding=1) self.relu = nn.ReLU() self.pool = nn.MaxPool3d(kernel_size=2, stride=2) self.fc = nn.Linear(16 * 8 * 8 * 8, 10) # 假设输入为8x8x8大小的体积数据 def forward(self, x): x = self.conv1(x) x = self.relu(x) x = self.pool(x) x = x.view(x.size(0), -1) x = self.fc(x) return x # 创建模型实例 model = CNN3D() # 定义损失函数和优化器 criterion = nn.CrossEntropyLoss() optimizer = torch.optim.Adam(model.parameters(), lr=0.001) # 假设你有3D体积数据作为输入 input_data = torch.randn(32,1, 8, 8, 8) targets = torch.randint(0, 10, (32,)) # 训练模型 for epoch in range(10): optimizer.zero_grad() outputs = model(input_data) loss = criterion(outputs, targets) loss.backward() optimizer.step() print(f"Epoch {epoch+1}/{10}, Loss: {loss.item():.4f}") ``` 这个示例代码定义了一个简单的3D CNN模型(`CNN3D`),其中包含一个3D卷积层、ReLU激活函数、3D最大池化层和全连接层。你可以根据自己的需求修改模型结构和参数。训练过程中使用交叉熵损失函数和Adam优化器进行模型优化。输入数据的维度为32x1x8x8x8,输出类别数为10。 希望这个示例可以帮助你开始使用PyTorch进行3D CNN的实现。如果有更多问题,请随时提问!
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值