이미지를 위한 합성곱 층

PyTorch로 배우는 이미지 딥러닝

Michal Oleszak

Machine Learning Engineer

이미지를 위한 합성곱 층

  • 이미지 데이터에 합성곱 층 적용
  • 합성곱 층 접근 및 추가
  • 합성곱 블록 생성

 

  • 특정 작업에 맞게 모델을 조정하는 데 사용

고양이 주위 박스

PyTorch로 배우는 이미지 딥러닝

Conv2d: 입력 채널

RGB 채널

  • 그레이스케일 이미지: in_channels=1
  • RGB 이미지(빨강, 초록, 파랑): 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. A visual and mathematical explanation of the 2D convolution layer.
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...