PyTorch - 卷积神经网络

  • 简述

    深度学习是机器学习的一个分支,被认为是近几十年来研究人员采取的关键步骤。深度学习实现的例子包括图像识别和语音识别等应用。
    下面给出了两种重要类型的深度神经网络 -
    • 卷积神经网络
    • 循环神经网络。
    在本章中,我们将关注第一种类型,即卷积神经网络 (CNN)。
  • 卷积神经网络

    卷积神经网络旨在通过多层阵列处理数据。这种类型的神经网络用于图像识别或人脸识别等应用。
    CNN 与其他任何普通神经网络的主要区别在于,CNN 将输入作为二维数组,直接对图像进行操作,而不是其他神经网络专注于特征提取。
    CNN 的主要方法包括解决识别问题。谷歌和脸书等顶级公司纷纷投资识别项目的研发项目,以更快地完成活动。
    每个卷积神经网络都包含三个基本思想 -
    • 当地各领域
    • 卷积
    • 池化
    让我们详细了解这些术语中的每一个。
  • 当地各领域

    CNN 利用输入数据中存在的空间相关性。神经网络的并发层中的每个层都连接一些输入神经元。这个特定区域称为局部感受野。它只关注隐藏的神经元。隐藏神经元将处理上述字段内的输入数据,而不会意识到特定边界外的变化。
    下面提到了生成本地各个字段的图表表示 -
    当地各领域
  • 卷积

    在上图中,我们观察到每个连接学习隐藏神经元的权重,并与从一层到另一层的运动相关联。在这里,单个神经元不时地执行转换。这个过程称为“卷积”。
    从输入层到隐藏特征图的连接映射被定义为“共享权重”,包含的偏差称为“共享偏差”。
  • 池化

    卷积神经网络使用紧接在 CNN 声明之后定位的池化层。它将用户的输入作为特征图,从卷积网络出来并准备一个压缩的特征图。池化层有助于使用前一层的神经元创建层。
  • PyTorch 的实现

    以下步骤用于使用 PyTorch 创建卷积神经网络。

    第1步

    导入创建简单神经网络所需的包。
    
    from torch.autograd import Variable
    import torch.nn.functional as F
    

    第2步

    创建一个具有卷积神经网络批量表示的类。我们输入 x 的批次形状的维度为 (3, 32, 32)。
    
    class SimpleCNN(torch.nn.Module):
       def __init__(self):
          super(SimpleCNN, self).__init__()
          #Input channels = 3, output channels = 18
          self.conv1 = torch.nn.Conv2d(3, 18, kernel_size = 3, stride = 1, padding = 1)
          self.pool = torch.nn.MaxPool2d(kernel_size = 2, stride = 2, padding = 0)
          #4608 input features, 64 output features (see sizing flow below)
          self.fc1 = torch.nn.Linear(18 * 16 * 16, 64)
          #64 input features, 10 output features for our 10 defined classes
          self.fc2 = torch.nn.Linear(64, 10)
    

    第 3 步

    计算第一个卷积大小从 (3, 32, 32) 变为 (18, 32, 32) 的激活。
    维度的大小从 (18, 32, 32) 变为 (18, 16, 16)。由于其大小从 (18, 16, 16) 变为 (1, 4608),因此重塑了神经网络输入层的数据维度。
    回想一下,-1 从另一个给定的维度推断出这个维度。
    
    def forward(self, x):
       x = F.relu(self.conv1(x))
       x = self.pool(x)
       x = x.view(-1, 18 * 16 *16)
       x = F.relu(self.fc1(x))
       #Computes the second fully connected layer (activation applied later)
       #Size changes from (1, 64) to (1, 10)
       x = self.fc2(x)
       return(x)