卷积神经网络(CNN)简单介绍,给出实例并添加详细的注释

慈云数据 2024-04-27 技术支持 38 0

文章目录

    • 卷积神经网络(CNN)简单介绍
      • 概念
      • 基本结构
        • 卷积层
        • 池化层
        • 全连接层
        • 实现方式
        • 总结

          卷积神经网络(CNN)简单介绍

          卷积神经网络(Convolutional Neural Network,CNN)是一种广泛应用于图像识别计算机视觉等领域的深度学习模型。它通过卷积、池化等操作,提取图像特征,实现对图像的高效分类。在本教程中,我们将介绍CNN的概念、基本结构和实现方式。

          卷积神经网络(CNN)简单介绍,给出实例并添加详细的注释
          (图片来源网络,侵删)

          概念

          CNN由多层卷积层、池化层、全连接层等组成,每个卷积层包含多个卷积核,用于对输入数据进行卷积操作,提取不同的特征。每个池化层则通过下采样的方式,将特征图尺寸缩小,减少数据维度,同时保留最显著的特征。全连接层则将池化层输出的特征向量映射到指定的类别数,完成图像分类任务。

          基本结构

          CNN的基本结构包括输入层、卷积层、池化层、全连接层和输出层,其中输入层和输出层分别用于输入和输出数据,卷积层和池化层用于提取特征,全连接层用于分类。

          卷积神经网络(CNN)简单介绍,给出实例并添加详细的注释
          (图片来源网络,侵删)
          卷积层

          卷积层通过对输入数据进行卷积操作,提取不同的特征。假设输入数据为 X X X,卷积核为 K K K,输出特征图为 Y Y Y,则卷积操作可以表示为:

          Y i , j = ∑ m ∑ n X i + m , j + n K m , n Y_{i,j}=\sum_m\sum_nX_{i+m,j+n}K_{m,n} Yi,j​=m∑​n∑​Xi+m,j+n​Km,n​

          其中, i , j i,j i,j为输出特征图中的位置, m , n m,n m,n为卷积核中的位置。卷积核通常是可学习的参数,可以根据数据特征进行优化。

          池化层

          池化层通过下采样的方式,将特征图尺寸缩小,减少数据维度,同时保留最显著的特征。常见的池化操作有最大池化和平均池化。最大池化的操作可以表示为:

          Y i , j = max ⁡ m max ⁡ n X i + m , j + n Y_{i,j}=\max\limits_{m}\max\limits_{n}X_{i+m,j+n} Yi,j​=mmax​nmax​Xi+m,j+n​

          其中, i , j i,j i,j为输出特征图中的位置, m , n m,n m,n为池化核中的位置。

          全连接层

          全连接层将池化层输出的特征向量映射到指定的类别数,完成图像分类任务。假设池化层输出的特征向量为 X X X,全连接层的权重矩阵为 W W W,偏置向量为 b b b,则全连接层的计算可以表示为:

          Y = W ⋅ X + b Y = W\cdot X+b Y=W⋅X+b

          其中, W W W是可学习的参数,可以通过反向传播算法进行优化, b b b是偏置项。

          实现方式

          在实现CNN时,常用的深度学习框架有TensorFlow、PyTorch等。以下是使用PyTorch实现简单的卷积神经网络的示例代码:

          import torch.nn as nn
          import torch.nn.functional as F
          # 定义一个神经网络类
          class Net(nn.Module):
              def __init__(self):
                  super(Net, self).__init__()
                  # 定义卷积层
                  self.conv1 = nn.Conv2d(1, 6, 5)   # 输入通道数1,输出通道数6,卷积核大小5*5
                  self.conv2 = nn.Conv2d(6, 16, 5)  # 输入通道数6,输出通道数16,卷积核大小5*5
                  # 定义池化层
                  self.pool = nn.MaxPool2d(2, 2)   # 2*2的最大化池化
                  # 定义全连接层
                  self.fc1 = nn.Linear(16 * 4 * 4, 120)  # 输入大小为16*4*4,输出大小为120
                  self.fc2 = nn.Linear(120, 84)         # 输入大小为120,输出大小为84
                  self.fc3 = nn.Linear(84, 10)          # 输入大小为84,输出大小为10
              # 神经网络前向计算过程
              def forward(self, x):
                  # 卷积层 -> ReLU -> 池化层
                  x = self.pool(F.relu(self.conv1(x)))   # 卷积、ReLU、池化操作
                  x = self.pool(F.relu(self.conv2(x)))   # 卷积、ReLU、池化操作
                  # 展开特征向量
                  x = x.view(-1, 16 * 4 * 4)             # 展平操作,将特征向量拉成一维
                  # 全连接层 -> ReLU
                  x = F.relu(self.fc1(x))                # 全连接、ReLU操作
                  x = F.relu(self.fc2(x))                # 全连接、ReLU操作
                  x = self.fc3(x)                        # 全连接操作
                  return x
          

          以上代码定义了一个包含两个卷积层、两个池化层、三个全连接层的卷积神经网络模型。在前向传播过程中,首先通过卷积层对输入数据进行特征提取,然后通过池化层将特征图尺寸缩小,最后通过全连接层完成图像分类任务。

          在训练CNN模型时,通常使用随机梯度下降(Stochastic Gradient Descent,SGD)等优化算法进行权重更新,使用交叉熵(Cross Entropy)等损失函数进行模型评估。

          使用上述神经网络类进行图像分类的例子如下:

          #导入PyTorch相关模块
          import torch
          from torchvision import datasets, transforms
          from torch.utils.data import DataLoader
          #定义数据预处理方式
          #将图片转换成Tensor格式,同时对图片进行标准化,均值0.5,方差0.5
          transform = transforms.Compose([
          transforms.ToTensor(),
          transforms.Normalize((0.5,), (0.5,))
          ])
          # 创建一个用于训练的 MNIST 数据集
          # 在执行此行代码时,数据集将自动下载到 './data' 文件夹中(如果尚未下载)
          #加载MNIST数据集,train=True表示加载训练集,train=False表示加载测试集
          #数据会被自动下载到"./data"文件夹中,同时经过transform的处理
          trainset = datasets.MNIST('./data', download=True, train=True, transform=transform)
          # 创建一个用于测试的 MNIST 数据集
          # 此处 train 参数设置为 False,以表示是用于测试的数据集
          # 同样也会自动下载
          testset = datasets.MNIST('./data', download=True, train=False, transform=transform)
          #定义数据加载器,用于批量读取数据,batch_size表示每次读取的数量,shuffle=True表示每次读取时打乱顺序
          trainloader = DataLoader(trainset, batch_size=64, shuffle=True)
          testloader = DataLoader(testset, batch_size=64, shuffle=False)
          #创建神经网络实例
          #--------------------这就是对上述神经网络的实例化------------------------------
          net = Net()
          #定义损失函数和优化器
          criterion = nn.CrossEntropyLoss() # 交叉熵损失函数
          optimizer = torch.optim.SGD(net.parameters(), lr=0.001, momentum=0.9) # 随机梯度下降优化器
          #训练神经网络
          epochs = 5 # 训练轮数
          for epoch in range(epochs):
          running_loss = 0.0
          for i, data in enumerate(trainloader, 0):
          inputs, labels = data # 读取数据
          optimizer.zero_grad() # 清空梯度
          outputs = net(inputs) # 输入数据进行前向计算
          loss = criterion(outputs, labels) # 计算损失
          loss.backward() # 反向传播,计算梯度
          optimizer.step() # 更新参数
          running_loss += loss.item() # 计算当前损失
          if i % 100 == 99: # 每100个batch输出一次训练状态
          print('[%d, %5d] loss: %.3f' %
          (epoch + 1, i + 1, running_loss / 100))
          running_loss = 0.0
          #测试神经网络
          correct = 0
          total = 0
          with torch.no_grad(): # 不计算梯度,加速计算过程
          for data in testloader:
          images, labels = data # 读取数据
          outputs = net(images) # 输入数据进行前向计算
          _, predicted = torch.max(outputs.data, 1) # 找到概率最大的标签
          total += labels.size(0) # 计算标签总数
          correct += (predicted == labels).sum().item() # 计算分类正确的标签个数
          print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total)) # 输出准确率
          

          总结

          本教程介绍了卷积神经网络(CNN)的概念、基本结构和实现方式,希望能对深度学习初学者有所帮助。在实践中,可以根据具体任务和数据特征进行CNN模型的设计和优化,提高模型性能和效率。

微信扫一扫加客服

微信扫一扫加客服

点击启动AI问答
Draggable Icon