Згорткові шари для зображень

Глибоке навчання для зображень із PyTorch

Michal Oleszak

Machine Learning Engineer

Згорткові шари для зображень

  • Застосовуйте згорткові шари до зображень
  • Доступ і додавання згорткових шарів
  • Створення згорткових блоків

 

  • Використовують, щоб адаптувати моделі до задачі

Рамка навколо кота

Глибоке навчання для зображень із PyTorch

Conv2d: вхідні канали

Канали RGB

  • Зображення у відтінках сірого: in_channels=1
  • RGB (red, green, blue): in_channels=3
  • Прозорість додає альфа-канал: 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: ядро

фільтри

                                        Вхідний тензор               Ядро       Вихідний тензор (карта ознак)

  • Ядро (позначене зеленим) рухається зліва направо і зверху вниз$^1$
1 Thevenot, Axel. 2020. Візуальне та математичне пояснення шару 2D-згортки.
Глибоке навчання для зображень із PyTorch

Розміри ядра

обчислення матриці

  • Найпоширеніші розміри ядра: 3x3 (Conv2d) і 2x2 (MaxPool2d)
  • Згортка — це скалярний добуток ядра (зелене) і фрагмента зображення (рожеве)
  • Сума добутків формує карту ознак (синє)
Глибоке навчання для зображень із PyTorch

Ядро — це фільтр

  • Виявляйте шаблони на зображенні

фільтр області

лінійний фільтр

Глибоке навчання для зображень із PyTorch

Conv2d: вихідні канали

вихідні канали                                             Вхідний канал      Ядрові фільтри     Вихідні канали

  • Кількість вихідних каналів визначає, скільки фільтрів застосовано
  • Кожен вихідний канал відповідає окремому фільтру
  • Більше вихідних каналів дає змогу навчитись складніших ознак
  • Часто беруть степені 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...