matlab卷积神经网络代码_Pytorch:分步实施3D卷积神经网络(附代码教程!)

如何编写3d CNN的PyTorch教程

c114f30b567c459580459cdf14c79ad3

首先,我们需要简单解释一下什么是3d CNN,以及它与通用2d CNN的区别。然后,我们将逐步分析如何使用Pytorch实现3D卷积神经网络。

什么是3D卷积神经网络?

无论我们说的CNN与2d CNN非常相似,都保留3d CNN。区别在于以下几点(非详尽列表):

3d卷积层

最初2d卷积层是输入与不同过滤器之间的逐项乘法运算,其中过滤器和输入是2d矩阵

495a51ac55724c98a440161ec244c4b2

在3d卷积层中,使用相同的操作。我们对多对二维矩阵进行这些操作。

48ca9ecf19fe43d08e75d04a1ae4b37b

填充选项和幻灯片步骤选项的工作方式相同。

3d MaxPool图层

2d Maxpool图层(2x2滤镜)大约要取一个我们从输入中划定的2x2小正方形的最大元素。

f6a4845272e94251a12cbe98bbe0da9a

现在,在3d Maxpool(2x2x2)中,我们在宽度为2的立方体中查找最大元素。此多维数据集表示从输入以2x2x2区域分隔的空间。

97c1e89a120e4c06b217255907889b1d

请注意,运算数量(与2d CNN层相比)乘以使用的过滤器的大小(与Maxpool或卷积无关),也乘以输入本身的大小。

3d数据点看起来如何?

那么3D CNN的数据点看起来如何?

生动描述图片的一种方法是使用以下图片:

c2072fc0e513438cbd4062c438465ee1

可用于CNN的其他现有数据集包括:

  • RGB-D设备:Google Tango,Microsoft Kinect等。
  • 激光雷达
  • 从多个图像进行3D重建

现在如何实施?

可以自己尝试使用我们正在使用的 Kaggle在该数据集上的代码。

整个笔记本中将使用多个库。这是它的列表。

# importing the librariesimport pandas as pdimport numpy as npfrom tqdm import tqdmimport os # for reading and displaying imagesfrom skimage.io import imreadimport matplotlib.pyplot as plt # for creating validation setfrom sklearn.model_selection import train_test_split# for evaluating the modelfrom sklearn.metrics import accuracy_score # PyTorch libraries and modulesimport torchfrom torch.autograd import Variableimport torch.nn as nnimport torch.nn.functional as Ffrom torch.optim import *import h5pyfrom plot3D import *

首先,由于数据集是特定的,因此在将它们提供给网络之前,我们使用以下帮助函数来处理它们。

另外,数据集存储为h5文件,因此要提取实际数据点,我们需要从h5文件读取数据,并使用to_categorical函数将其转换为向量。在此步骤中,我们还准备进行交叉验证。

def array_to_color(array, cmap="Oranges"):    s_m = plt.cm.ScalarMappable(cmap=cmap)    return s_m.to_rgba(array)[:,:-1]  def rgb_data_transform(data):    data_t = []    for i in range(data.shape[0]):        data_t.append(array_to_color(data[i]).reshape(16, 16, 16, 3))    return np.asarray(data_t, dtype=np.float32)

假设变量X_train / X_test分别具有(10000,16,16,16,3)和(2000,16,16,16,3)的形状,而target_train / targets_test分别具有(10000,)(2000,)的形状。但是现在我们再次将所有这些转换为PyTorch张量格式。我们通过以下方式做到这一点。

with h5py.File("./full_dataset_vectors.h5", "r") as hf:        # Split the data into training/test features/targets    X_train = hf["X_train"][:]    targets_train = hf["y_train"][:]    X_test = hf["X_test"][:]    targets_test = hf["y_test"][:]     # Determine sample shape    sample_shape = (16, 16, 16, 3)     # Reshape data into 3D format    X_train = rgb_data_transform(X_train)    X_test = rgb_data_transform(X_test)     # Convert target vectors to categorical targets    targets_train = to_categorical(targets_train).astype(np.integer)    targets_test = to_categorical(targets_test).astype(np.integer)
train_x = torch.from_numpy(X_train).float()train_y = torch.from_numpy(targets_train).long()test_x = torch.from_numpy(X_test).float()test_y = torch.from_numpy(targets_test).long() batch_size = 100 #We pick beforehand a batch_size that we will use for the training  # Pytorch train and test setstrain = torch.utils.data.TensorDataset(train_x,train_y)test = torch.utils.data.TensorDataset(test_x,test_y) # data loadertrain_loader = torch.utils.data.DataLoader(train, batch_size = batch_size, shuffle = False)test_loader = torch.utils.data.DataLoader(test, batch_size = batch_size, shuffle = False)

对于模型,这里是我们将使用的架构

2套ConvMake:

· 两个集合的过滤器大小为(3x3x3),步幅为(1x1x1)的3d卷积层

· 泄漏的Relu激活功能

· 具有滤镜大小(2x2x2)和跨度(2x2x2)的3d MaxPool层

2个FC层,分别具有512128个节点。

在第一个FC层之后有一个Dropout层。

然后将模型通过以下方式转换为代码:

num_classes = 10 # Create CNN Modelclass CNNModel(nn.Module):    def __init__(self):        super(CNNModel, self).__init__()               self.conv_layer1 = self._conv_layer_set(3, 32)        self.conv_layer2 = self._conv_layer_set(32, 64)        self.fc1 = nn.Linear(2**3*64, 128)        self.fc2 = nn.Linear(128, num_classes)        self.relu = nn.LeakyReLU()        self.batch=nn.BatchNorm1d(128)        self.drop=nn.Dropout(p=0.15)                  def _conv_layer_set(self, in_c, out_c):        conv_layer = nn.Sequential(        nn.Conv3d(in_c, out_c, kernel_size=(3, 3, 3), padding=0),        nn.LeakyReLU(),        nn.MaxPool3d((2, 2, 2)),        )        return conv_layer        def forward(self, x):        # Set 1        out = self.conv_layer1(x)        out = self.conv_layer2(out)        out = out.view(out.size(0), -1)        out = self.fc1(out)        out = self.relu(out)        out = self.batch(out)        out = self.drop(out)        out = self.fc2(out)               return out #Definition of hyperparametersn_iters = 4500num_epochs = n_iters / (len(train_x) / batch_size)num_epochs = int(num_epochs) # Create CNNmodel = CNNModel()#model.cuda()print(model) # Cross Entropy Losserror = nn.CrossEntropyLoss() # SGD Optimizerlearning_rate = 0.001optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate)

在参数方面,请注意第一个完全卷积层上的输入节点数。我们的数据集的形状为(16,16,16,3),这就是我们获得大小为(2x2x2)的滤波输出的方式。

以下是训练代码。可以通过将优化器更改为Adam来进行优化,调整学习速度(有一定的动力)等等。

# CNN model trainingcount = 0loss_list = []iteration_list = []accuracy_list = []for epoch in range(num_epochs):    for i, (images, labels) in enumerate(train_loader):               train = Variable(images.view(100,3,16,16,16))        labels = Variable(labels)        # Clear gradients        optimizer.zero_grad()        # Forward propagation        outputs = model(train)        # Calculate softmax and ross entropy loss        loss = error(outputs, labels)        # Calculating gradients        loss.backward()        # Update parameters        optimizer.step()               count += 1        if count % 50 == 0:            # Calculate Accuracy                    correct = 0            total = 0            # Iterate through test dataset            for images, labels in test_loader:                               test = Variable(images.view(100,3,16,16,16))                # Forward propagation                outputs = model(test)                 # Get predictions from the maximum value                predicted = torch.max(outputs.data, 1)[1]                               # Total number of labels                total += len(labels)                correct += (predicted == labels).sum()                       accuracy = 100 * correct / float(total)                       # store loss and iteration            loss_list.append(loss.data)            iteration_list.append(count)            accuracy_list.append(accuracy)        if count % 500 == 0:            # Print Loss            print('Iteration: {}  Loss: {}  Accuracy: {} %'.format(count, loss.data, accuracy))

经过少量样本培训,我们得到了以下准确性和损失。

2ec8277d8d2340bab82c4cef249a492c
dbe198b979c3410f836591ade8d43ba9

3D CNN的应用场景

  • IRM数据处理及其推断
  • 自动驾驶
  • 距离估算
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值