一、何为3D-CNN
卷积神经网络通常是指用于图像分类的二维CNN。但是,现实世界中还使用了其他两种类型的卷积神经网络,即1维CNN和3维CNN。
其中所谓的维度并不是一个描述数据维度的名词,判断模型的维度多少主要需要观察我们定义的卷积核沿着几个维度滑动
(1)一维CNN | Conv1D
按照前面的定义,在Conv1D中,内核沿一维滑动,例如时间序列,或者是物理学中的某些标量。当问题的结果只收到一个变量的影响,我们就可以应用一维CNN
(2)二维CNN | Conv2D
二维CNN就是我们平时在处理图像时最常用到的,内核在图像上沿着两个维度滑动
使用CNN的整体优势在于,它可以使用其内核从数据中提取空间特征,而其他网络则无法做到。例如,CNN可以检测图像中的边缘,颜色分布等,这使得这些网络在图像分类和包含空间属性的其他类似数据中非常强大。这样也使得整个图片中的信息被关联起来
(3)三维CNN | Conv3D
Conv3D主要用于3D图像数据。例如磁共振成像(MRI)数据,计算机断层扫描(CT)扫描也是三维数据,这是通过组合从身体周围的不同角度拍摄的一系列X射线图像。
我们可以使用Conv3D对该医学数据进行分类或从中提取特征。分析空间维度上不同扫描层级对于我们的分类结果的影响
MosMedData: 新冠肺炎胸部 CT扫描数据集上基于3D-CNN实现二分类_3d医学影像二分类网络_AI Studio的博客-CSDN博客
二.数据处理过程
3D-CNN重点在于多维数据处理能力,三维的卷积层可以保证他学习到多个维度上的信息,因此需要注意的是3D-CNN处理的是四维数据,是通道数和图片集结合,在前期数据增强和处理时需要注意这点,在数据通道数上需要特别注意
代码上相比CNN没有很明显的创新部分。。如下
import torch
import torch.nn as nn
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.fc1 = nn.Linear(16 * 8 * 8 * 8, 10)
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.fc1(x)
return x
# 创建一个3D-CNN模型实例
model = CNN3D()
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.001, momentum=0.9)
# 训练模型
for epoch in range(num_epochs):
# 前向传播
outputs = model(inputs)
loss = criterion(outputs, labels)
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
# 使用训练好的模型进行预测
outputs = model(inputs)
_, predicted = torch.max(outputs.data, 1)