합성곱 신경망

PyTorch로 배우는 Intermediate Deep Learning

Michal Oleszak

Machine Learning Engineer

선형 레이어를 사용하지 않는 이유

256×256 그레이스케일 이미지를 나타내는 검은 사각형

PyTorch로 배우는 Intermediate Deep Learning

선형 레이어를 사용하지 않는 이유

256×256 그레이스케일 이미지는 약 6만 5천 개의 픽셀 값으로 구성됨

PyTorch로 배우는 Intermediate Deep Learning

선형 레이어를 사용하지 않는 이유

1,000개의 뉴런으로 구성된 선형 레이어가 6만 5천 개의 픽셀 값을 처리하는 그림

PyTorch로 배우는 Intermediate Deep Learning

선형 레이어를 사용하지 않는 이유

이미지와 레이어 사이에 6,500만 개의 연결이 있는 그림

PyTorch로 배우는 Intermediate Deep Learning

선형 레이어를 사용하지 않는 이유

RGB 컬러 이미지의 경우 2억 개의 연결이 존재하는 그림

PyTorch로 배우는 Intermediate Deep Learning

선형 레이어를 사용하지 않는 이유

  • 선형 레이어의 문제:
    • 느린 학습
    • 과적합
    • 공간 패턴 인식 불가
  • 더 나은 대안: 합성곱 레이어!

고양이가 구석에 있는 이미지와 해당 부분을 읽는 뉴런

PyTorch로 배우는 Intermediate Deep Learning

합성곱 레이어

3×3 필터가 5×5 입력 위를 슬라이딩하여 3×3 특징 맵을 생성하는 그림

  • 입력 위에서 필터를 슬라이딩
  • 각 위치에서 합성곱 수행
  • 생성되는 특징 맵:
    • 입력의 공간 패턴 보존
    • 선형 레이어보다 적은 파라미터 사용
  • 필터 1개 = 특징 맵 1개
  • 특징 맵에 활성화 함수 적용
  • 모든 특징 맵이 결합되어 출력 형성
  • nn.Conv2d(3, 32, kernel_size=3)
PyTorch로 배우는 Intermediate Deep Learning

합성곱

두 3×3 행렬이 원소별로 곱해진 후 결과 행렬의 모든 값이 합산되는 그림

  1. 입력 패치와 필터의 내적 계산
    • 왼쪽 상단: 2 × 1 = 2
  2. 결과 합산
PyTorch로 배우는 Intermediate Deep Learning

제로 패딩

값이 0인 픽셀 프레임으로 둘러싸인 4×4 이미지

  • 합성곱 레이어 입력에 0으로 구성된 프레임 추가
nn.Conv2d(
  3, 32, kernel_size=3, padding=1
)
  • 입력과 출력 텐서의 공간 차원 유지
  • 경계 픽셀을 다른 픽셀과 동등하게 처리
PyTorch로 배우는 Intermediate Deep Learning

최대 풀링

4×4 행렬에서 각 2×2 사분면이 다른 색으로 표시되고 최대 풀링 후 2×2 행렬이 되는 그림

  • 겹치지 않는 윈도우를 입력 위에서 슬라이딩
  • 각 위치에서 최댓값만 유지
  • 합성곱 레이어 이후 공간 차원 축소에 사용
  • nn.MaxPool2d(kernel_size=2)
PyTorch로 배우는 Intermediate Deep Learning

합성곱 신경망

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로 배우는 Intermediate Deep Learning

특징 추출기 출력 크기

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로 배우는 Intermediate Deep Learning

특징 추출기 출력 크기

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로 배우는 Intermediate Deep Learning

특징 추출기 출력 크기

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로 배우는 Intermediate Deep Learning

특징 추출기 출력 크기

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로 배우는 Intermediate Deep Learning

특징 추출기 출력 크기

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로 배우는 Intermediate Deep Learning

연습해 봅시다!

PyTorch로 배우는 Intermediate Deep Learning

Preparing Video For Download...