卷积神经网络

PyTorch 深度学习进阶

Michal Oleszak

Machine Learning Engineer

为什么不用线性层?

一个黑色方块,表示 256×256 的灰度图像。

PyTorch 深度学习进阶

为什么不用线性层?

一张 256×256 的灰度图像约含 65k 个像素值。

PyTorch 深度学习进阶

为什么不用线性层?

一个含 1000 个神经元的线性层处理这 65k 个像素值。

PyTorch 深度学习进阶

为什么不用线性层?

图像与该层之间有 6500 万个连接。

PyTorch 深度学习进阶

为什么不用线性层?

对于 RGB 彩色图像,有 2 亿个连接。

PyTorch 深度学习进阶

为什么不用线性层?

  • 线性层:
    • 训练慢
    • 易过拟合
    • 不识别空间模式
  • 更好的选择:卷积层!

角落有猫的图像,神经元只读取该区域

PyTorch 深度学习进阶

卷积层

大小为 3×3 的滤波器在 5×5 的输入上滑动,产生 3×3 的特征图。

  • 在输入上滑动带参数的滤波器
  • 各位置执行卷积
  • 得到的特征图:
    • 保留输入的空间模式
    • 比线性层参数更少
  • 一个滤波器 = 一张特征图
  • 对特征图做激活
  • 所有特征图合并为输出
  • nn.Conv2d(3, 32, kernel_size=3)
PyTorch 深度学习进阶

卷积

两个 3×3 矩阵逐元素相乘,并将结果矩阵的所有数求和。

  1. 计算输入小块与滤波器的点积
    • 左上角:2 × 1 = 2
  2. 将结果求和
PyTorch 深度学习进阶

零填充(Zero-padding)

一个 4×4 图像被值为零的像素边框包围。

  • 在卷积层输入周围加零框
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • 保持输入与输出张量的空间尺寸不变
  • 确保边界像素与其他像素同等对待
PyTorch 深度学习进阶

最大池化(Max Pooling)

一个 4×4 矩阵,四个 2×2 象限用不同颜色标记,最大池化后变为 2×2。

  • 用不重叠的窗口在输入上滑动
  • 各位置仅保留最大值
  • 卷积层后用于降低空间维度
  • nn.MaxPool2d(kernel_size=2)
PyTorch 深度学习进阶

卷积神经网络

class Net(nn.Module):
    def __init__(self, num_classes):
        super().__init__()

self.feature_extractor = nn.Sequential( nn.Conv2d(3, 32, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Conv2d(32, 64, kernel_size=3, padding=1), nn.ELU(), nn.MaxPool2d(kernel_size=2), nn.Flatten(), )
self.classifier = nn.Linear(64*16*16, num_classes)
def forward(self, x): x = self.feature_extractor(x) x = self.classifier(x) return x
  • feature_extractor:[卷积→激活→池化]重复两次并展平
  • classifier:单个线性层
  • forward():将输入图像依次经过特征提取器和分类器
PyTorch 深度学习进阶

特征提取器的输出尺寸

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

示意图:形状为 3×64×64 的输入图像依次经过卷积层、池化层、另一卷积层和池化层。

PyTorch 深度学习进阶

特征提取器的输出尺寸

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

示意图:形状为 3×64×64 的输入图像依次经过卷积层、池化层、另一卷积层和池化层。

PyTorch 深度学习进阶

特征提取器的输出尺寸

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

示意图:形状为 3×64×64 的输入图像依次经过卷积层、池化层、另一卷积层和池化层。

PyTorch 深度学习进阶

特征提取器的输出尺寸

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

示意图:形状为 3×64×64 的输入图像依次经过卷积层、池化层、另一卷积层和池化层。

PyTorch 深度学习进阶

特征提取器的输出尺寸

self.feature_extractor = nn.Sequential(
  nn.Conv2d(3, 32, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Conv2d(32, 64, kernel_size=3, padding=1),
  nn.ELU(),
  nn.MaxPool2d(kernel_size=2),
  nn.Flatten(),
)
self.classifier = nn.Linear(64*16*16, num_classes)
`

示意图:形状为 3×64×64 的输入图像依次经过卷积层、池化层、另一卷积层和池化层。

PyTorch 深度学习进阶

Passons à la pratique !

PyTorch 深度学习进阶

Preparing Video For Download...