用于图像的卷积层

使用 PyTorch 进行图像深度学习

Michal Oleszak

Machine Learning Engineer

用于图像的卷积层

  • 将卷积层用于图像数据
  • 访问并添加卷积层
  • 创建卷积块

 

  • 用于将模型适配到特定任务

猫的边框

使用 PyTorch 进行图像深度学习

Conv2d:输入通道

RGB 通道

  • 灰度图:in_channels=1
  • RGB 图像(红、绿、蓝):in_channels=3
  • 透明度包含 Alpha 通道:in_channels=4
from torchvision.transforms import functional
image = PIL.Image.open("dog.png")
num_channels = functional.get_image_num_channels(image)
print("Number of channels: ", num_channels)
Number of channels: 3
使用 PyTorch 进行图像深度学习

Conv2d:kernel

滤波器

                                        输入张量               Kernel       输出张量(特征图)

  • Kernel(绿色)从左到右、从上到下在图像上移动$^1$
1 Thevenot, Axel. 2020. A visual and mathematical explanation of the 2D convolution layer.
使用 PyTorch 进行图像深度学习

Kernel 尺寸

矩阵计算

  • 最常见的 kernel 尺寸:3x3(Conv2d)和 2x2(MaxPool2d
  • 卷积是 kernel(绿)与图像区域(粉)的点积
  • 点积求和得到特征图(蓝)
使用 PyTorch 进行图像深度学习

Kernel 是滤波器

  • 捕捉图像模式

区域滤波器

线条滤波器

使用 PyTorch 进行图像深度学习

Conv2d:输出通道

输出通道                                             输入通道      Kernel 滤波器     输出通道

  • 输出通道数决定应用多少个滤波器
  • 每个输出通道对应一个不同的滤波器
  • 更多的输出通道可学习更复杂的特征
  • 输出通道通常取 2 的幂(16、32、64、128)
    • 便于后续层的通道合并与拆分
使用 PyTorch 进行图像深度学习

添加卷积层

import torch
import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=3, out_channels=16, kernel_size=3, padding=1)
conv2 = nn.Conv2d(in_channels=16, out_channels=32, kernel_size=3, padding=1)
model = Net()

model.add_module('conv2', conv2)
使用 PyTorch 进行图像深度学习

访问卷积层

print(model)
Net(
  (conv1): Conv2d(3, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
)
model.conv2
Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
使用 PyTorch 进行图像深度学习

创建卷积块

  • nn.Sequential() 将卷积层堆叠成一个块
class BinaryImageClassification(nn.Module):
    def __init__(self):
        super(BinaryImageClassification, self).__init__()

self.conv_block = nn.Sequential( nn.Conv2d(3, 16, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.Conv2d(16, 32, kernel_size=3, stride=1, padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2, stride=2) )
def forward(self, x): x = self.conv_block(x)
使用 PyTorch 进行图像深度学习

Passons à la pratique !

使用 PyTorch 进行图像深度学习

Preparing Video For Download...