[딥러닝 스터디] 컴퓨터 비전을 위한 딥러닝

[딥러닝 스터디] 컴퓨터 비전을 위한 딥러닝

케라스 창시자에게 배우는 딥러닝 책을 참고하였습니다.

합성곱 신경망

: 텐서플로 자격증을 공부하면서 컨브넷에 대한 이론적 이해가 많이 부족하다고 느꼈다. 이론 베이스가 약하니 모델을 어떻게 변형해야 할지도 감이 안와서 책을 보면서 좀 차근차근 다시 이해해보려고 한다.

https://wikidocs.net/64066 의 포스트를 공부한 내용이 포함되어 있습니다.

합성곱 신경망(CNN) 기본개념

  • 이미지의 공간적인 구조에 대한 정보 를 보존하며 학습하기 위해 사용하는 신경망

  • 이미지는 기본적으로 높이, 너비, 채널로 이루어진 3차원 텐서이다.

    • 컬러 이미지 내 하나의 픽셀은 세가지 색(삼원색)의 조합으로 이뤄진다. 이는 해당 픽셀이 (1, 1, 3)의 3차원 텐서임을 의미한다.
    • 따라서 이미지가 N*N 크기인 경우 특정 컬러 이미지는 (N, N, 3)의 3차원 텐서로 표현된다고 말할 수 있다.
  • 합성곱(convolution)은 이미지의 특징을 추출해내는 연산 이다.

    • 이미지에 커널을 사용해 쭉 훑어내면 결과 특성맵이 나오게 된다.

합성곱 신경망의 가중치

간단한 컨브넷 예제

간단한 컨브넷 예제

1
2
3
4
5
6
7
8
9
10
11
12
from keras import layers
from keras import models

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

컨브넷 구조

  • 컨브넷은 (이미지 높이, 이미지 너비, 채널의 수) 크기의 입력텐서를 사용한다.
    • 이때 배치차원은 포함하지 않는다.
    • 채널의 수는 Conv2D 층에 전달된 첫번째 매개변수에 의해 조절된다.
      : 위 코드의 경우 32 또는 64개
  • ((3, 3, 64) 크기인) 마지막 층의 출력텐서를 fully-connected network에 연결한다 : layers.Dense()
    • 이는 Dense 층을 쌓은 분류기로 1D 벡터만을 처리한다. 따라서 이전층의 출력인 3D텐서를 1D텐서로 펼쳐야 한다.
      : layers.Flatten()

대부분의 컨브넷에서 특성맵의 깊이는 점진적으로 증가하고(32, 64, 128…), 특성맵의 크기는 점진적으로 감소한다(28x28, 26x26, 13x13…).

합성곱 연산

Dense 층은 입력특성공간에 있는 전역패턴을 학습하지만, 합성곱 층은 지역패턴을 학습한다.

  • 합성곱 연산은 입력 특성맵(input feature map) 3D텐서에 적용된다.

  • 이 텐서는 2개의 공간축(높이, 너비)과 하나의 깊이축(채널축)으로 구성된다.

    • RGB 이미지는 3개의 컬러채널을 가지므로 깊이축의 차원이 3.
    • MNIST와 같은 흑백 이미지는 깊이축의 차원이 1.
  • 합성곱 연산은 이러한 입력 특성맵에서 작은 패치를 추출, 변환하여 출력 특성맵 3D텐서를 만들어낸다.

    • 출력텐서의 깊이층의 매개변수로 결정되기 때문에 상황에 따라 다르다.
    • 즉, 여기서의 깊이축의 채널은 더이상 RGB와 같은 특정 컬러를 의미하지 않는다. 대신 일종의 필터를 의미한다.
      : 필터는 입력 데이터의 어떤 특성을 인코딩한다.

[ MNIST 데이터를 통한 입출력 특성맵의 이해 ]

  • 첫번째 합성곱 층이 (28, 28, 1)의 특성맵을 입력으로 받아 (26, 26, 32)크기의 특성맵을 출력한다.

    = 입력에 대해 32개의 필터를 적용한다

  • (26, 26) 크기의 32개 출력채널 각각은 입력의 각 위치에서의 필터 패턴에 대한 응답을 의미한다.
    응답맵이라고 칭한다.

[ 컨브넷의 특징 ]

  1. translation invariant : 이미지의 어느 한 곳에서 특정 패턴을 학습했다면, 이미지의 다른 부분에서 같은 패턴을 인식해낼 수 있다. 이는 세상은 평행 이동에 따라 다르게 인식되지 않는다는 우리의 인식방법과 동일하다.

    반면, 완전 연결 네트워크는 새로운 위치에 나타난 것은 새로운 특성으로 인식한다.

  2. 공간적 계층구조 학습 : 합성곱 연산의 기본적인 프로세스는 다음과 같다.
    [ 첫번째 합성곱 층 ] : 모서리와 같은 작은 지역 패턴을 학습.
    [ 두번째 합성곱 층 ] : 첫번째 층의 특성으로 구성된 더 큰 패턴을 학습.

    이러한 방식을 통해 더 복잡하고 추상적인 시각적 개념을 효과적으로 학습 가능하다.

[ 합성곱의 핵심 parameter ]

이미지 2

  1. 입력으로부터 뽑아낼 패치크기 : 3x3, 5x5 크기를 주로 사용한다.
  2. 특성맵의 출력 깊이 : 합성곱으로 계산할 필터의 수이다. 위의 예시에서는 32로 시작해서 64로 끝남.

패딩과 스트라이드

Padding

이미지 3

: 입력 특성맵의 가장자리에 적절한 개수의 행과 열을 추가하여 입력 특성맵과 출력특성맵의 크기가 같도록 한다.

케라스의 Conv2D층에서 패딩은 padding 변수로 설정 가능하다.

  • valid : 패딩을 사용하지 않음
  • same : 패딩을 사용함. 출력 특성맵의 높이, 너비가 입력 특성맵과 같아진다.

Stride

: 입력 특성맵 위를 지나가는 윈도우 간의 거리(기본은 1씩 움직인다.)

이미지 4

  • 강제적으로 입력 특성맵을 다운샘플링 하는데에 사용된다.
  • 실전에서는 드물게 사용된다. 특성맵의 다운샘플링에는 주로 max pooling 연산을 사용한다.

최대 풀링 연산

  • 스트라이드와 같이 특성맵을 강제적으로 다운샘플링 하는데에 사용한다.
  • 입력 특성맵에서 각 윈도우별로 추출된 패치에 대해 각 채널별로 최대값을 출력한다.
  • 보통 2x2윈도우와 스트라이드 2를 사용하여 특성맵을 절반 크기로 다운샘플링한다.

: 당연하게도 평균풀링 등 다른 방법도 있다. 하지만 최대 풀링연산이 가장 성능이 좋다.

[ 최대 풀링 연산을 하는 이유 ]

  • 특성맵의 가중치 개수를 줄인다.
    : 너무 많은 가중치로 인한 overfitting 방지
  • 연속적인 합성곱 층이 점점 커지는 윈도우를 통해 입력 특성맵을 바라보도록 함으로서 필터의 공간적인 계층 구조를 형성한다. (?)

따라서 일반적으로 컨브넷의 서브샘플링은 다음의 방법을 사용한다.

(1) 스트라이드가 없는 합성곱으로 조밀한 특성맵을 만든다.
(2) 작은 각각의 패치에 대해 최대로 활성화된 특성을 고른다.

댓글