Pytorch 简明教程

PyTorch - Convolutional Neural Network

深度学习是机器学习的一个分支,被视为过去几十年间研究人员采取的一个关键步骤。深度学习应用的示例包括图像识别和语音识别的应用。

以下给出了两种重要类型的深度神经网络 −

  1. Convolutional Neural Networks

  2. Recurrent Neural Networks.

在本章中,我们将重点关注第一种,即卷积神经网络 (CNN)。

Convolutional Neural Networks

卷积神经网络被设计为通过多层数组来处理数据。此类神经网络被用于诸如图像识别或面部识别的应用。

CNN 和任何其他普通神经网络之间的主要区别在于,CNN 将输入作为二维数组并直接对图像进行操作,而不是关注于其他神经网络重点关注的特征提取。

CNN 的主要方法包括针对识别问题的解决方案。谷歌和 Facebook 等顶尖公司已经对识别项目的研发项目进行了投资,以更快的速度完成活动。

每个卷积神经网络都包括三个基本想法 −

  1. Local respective fields

  2. Convolution

  3. Pooling

让我们详细了解每个术语。

Local Respective Fields

CNN 利用存在于输入数据中的空间相关性。神经网络中的每个并发层都连接到一些输入神经元。这个特定区域被称为局部感受野。它只关注于隐含神经元。隐含神经元将处理所提及区域内的输入数据,而不会意识到特定边界外部的变化。

生成局部感受野的图表表示如下 −

local respective fields

Convolution

在以上图中,我们观察到每个连接都会通过与一个层到另一个层的运动相关的连接学习一个隐含神经元的权重。在此,单个神经元会不时地执行一次转变。此过程被称为“卷积”。

从输入层到隐含特征图的连接映射被定义为“共享权重”,而包含的偏差被称为“共享偏差”。

Pooling

卷积神经网络使用池化层,这些层在 CNN 声明之后立即被定位。它采用用户的输入作为特征图,该特征图来自卷积网络,并且会准备一个密集特征图。池化层有助于使用前一层的神经元创建层。

Implementation of PyTorch

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

Step 1

导入创建简单神经网络所需的包。

from torch.autograd import Variable
import torch.nn.functional as F

Step 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)

Step 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)