影像的卷積層

使用 PyTorch 進行影像深度學習

Michal Oleszak

Machine Learning Engineer

影像的卷積層

  • 對影像資料套用卷積層
  • 存取並新增卷積層
  • 建立卷積區塊

 

  • 用於將模型調整為特定任務

貓的方框

使用 PyTorch 進行影像深度學習

Conv2d:輸入通道

RGB 通道

  • 灰階影像:in_channels=1
  • RGB 影像(red, green, blue):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

filters

                                        輸入張量               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 進行影像深度學習

一起來練習吧!

使用 PyTorch 進行影像深度學習

Preparing Video For Download...