- PyTorch 教程
- PyTorch - 首页
- PyTorch - 简介
- PyTorch - 安装
- 神经网络的数学基础
- PyTorch - 神经网络基础
- 机器学习的通用工作流程
- 机器学习与深度学习
- 实现第一个神经网络
- 神经网络到功能块
- PyTorch - 术语
- PyTorch - 加载数据
- PyTorch - 线性回归
- PyTorch - 卷积神经网络
- PyTorch - 循环神经网络
- PyTorch - 数据集
- PyTorch - 卷积网络简介
- 从零开始训练卷积网络
- PyTorch - 卷积网络中的特征提取
- PyTorch - 卷积网络的可视化
- 使用卷积网络进行序列处理
- PyTorch - 词嵌入
- PyTorch - 递归神经网络
- PyTorch 有用资源
- PyTorch - 快速指南
- PyTorch - 有用资源
- PyTorch - 讨论
PyTorch - 卷积神经网络
深度学习是机器学习的一个分支,被认为是近几十年来研究人员取得的关键一步。深度学习实现的例子包括图像识别和语音识别等应用。
下面列出了两种重要的深度神经网络类型:
- 卷积神经网络
- 循环神经网络。
本章我们将重点介绍第一种类型,即卷积神经网络 (CNN)。
卷积神经网络
卷积神经网络旨在通过多层数组处理数据。这种类型的神经网络用于图像识别或人脸识别等应用。
CNN 与任何其他普通神经网络的主要区别在于,CNN 将输入作为二维数组,直接对图像进行操作,而不是像其他神经网络那样关注特征提取。
CNN 的主要方法包括解决识别问题。谷歌和 Facebook 等顶级公司已投资于识别项目的研发项目,以更快地完成活动。
每个卷积神经网络都包含三个基本思想:
- 局部感受野
- 卷积
- 池化
让我们详细了解这些术语。
局部感受野
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)