합성곱 신경망
  - 구성
    
      - 합성곱층(Convolution layer)
- 풀링층(Pooling layer)
 
합성곱 신경망 이전
  - 매트릭스 데이터를 컴퓨터에게 학습시킬 경우
    
      - 다층 퍼셉트론을 사용해야함
- 2차원 매트릭스를 1차원 벡터로 변환해야함
 
- 공간적인 구조 정보 유실 -> 제대로된 결과가 안나옴
- 합성곱 신경망이 나오게됨
합성곱 연산
  - 커널(필터)이 이미지를 처음부터 끝까지 겹치며 훑음
- 겹쳐지는 부분의 각 이미지와 커널의 원소값을 곱함
- 그 곱한 것들을 다 더함
- 이미지의 왼쪽 위부터 오른쪽 아래까지
\[input = \begin {pmatrix}
            1 & 2 & 3 & 4 & 5 \\
            2 & 1 & 0 & 1 & 2 \\
            3 & 0 & 1 & 1 & 0 \\
            1 & 4 & 1 & 1 & 2 \\
            2 & 1 & 1 & 0 & 0
            \end {pmatrix} \;,\;
    
  kernel = \begin {pmatrix}
            1 & 0 & 1 \\
            1 & 0 & 1 \\
            0 & 1 & 0
            \end {pmatrix} \\
  featuremap = \begin {pmatrix}
            6 & 9 & 11 \\
            10 & 4 & 4 \\
            7 & 7 & 4
            \end {pmatrix} \\ 
  featuremap_{1, 1} = (1 \times 1) + (2 \times 0) + (3 \times 1) + \\ (2 \times 1) + (1 \times 0) + (0 \times 1) + \\
  (3 \times 0) + (0 \times 1) + (1 \times 0) \;=\; 6\]
  - 커널의 크기는 보통 3 X 3 내지는 5 X 5
- stride : 커널의 이동 범위
패딩(Padding)
  - 특성맵은 입력에 비해 크기가 현저히 작아짐
    
      - 위의 예시에서도 5 X 5에서 3 X 3으로 작아짐
 
- 합성곱층을 여러개 쌓을 경우 최종 특성맵은 매우 작아지게 됨
- 이런 문제를 패딩으로 방지
    
      - 입력 가장자리에 지정된 폭만큼 행과 열을 추가
- 주로 값을 0으로 채우는 제로패딩 사용
 
- 이 방법으로 특성맵이 지나치게 작아지는 것을 방지
가중치와 편향
가중치
  - CNN에서 가중치는 커널의 원소
    
  
- 가중치가 다층 퍼셉트론에 비하면 적음
    
  
- 활성화함수 : 비선형성을 추가하기 위해 사용
    
      - 합성곱층에선 ReLU()함수나 이 함수의 변형들이 주로 사용
 
편향
특성맵의 크기 계산
  - 입력의 크기, 커널의 크기, 스트라이드를 알면 특성맵의 크기를 구할 수 있음
\[O_h = floor(\frac{I_h - K_h}{S} + 1) \\ O_w = floor(\frac{I_w - K_w}{S} + 1)\]
  - h가 붙은 것은 높이, w가 붙은 것은 너비
- O는 특성맵, I는 입력, K는 커널, S는 스트라이드
- floor함수 : 소수점 이하를 버림
- 예시
    
      - 입력 : 5 X 5, 커널 : 3 X 3, 스트라이드 : 1
- 특성맵의 크기 = (5 - 3 + 1) X (5 - 3 + 1) = 3 X 3
 
다수의 채널을 가질 경우 합성곱 연산
  - 각 채널마다 합성곱 연산
- 그 결과를 더해준다
- 예시
\[ch1 = \begin {pmatrix}
              1 & 2 & 0 \\
              0 & 0 & 1 \\
              1 & 0 & 5
              \end {pmatrix} \;,\;
ch2 = \begin {pmatrix}
            1 & 2 & 3 \\
            3 & 1 & 0 \\
            0 & 1 & 0
            \end {pmatrix} \;,\;
ch3 = \begin {pmatrix}
            1 & 2 & 3 \\
            2 & 1 & 0 \\
            3 & 0 & 1
            \end {pmatrix} \\
kernel1 = \begin {pmatrix}
           1 & 0 \\
           0 & 1
           \end {pmatrix}
kernel2 = \begin {pmatrix}
           1 & 1 \\
           1 & 0
           \end {pmatrix}
kernel3 = \begin {pmatrix}
           0 & 0 \\
           0 & 1
           \end {pmatrix}\\
fm1 = \begin {pmatrix}
       1 & 3 \\
       0 & 5
       \end {pmatrix}
fm2 = \begin {pmatrix}
       6 & 6 \\
       4 & 2
       \end {pmatrix}
fm3 = \begin {pmatrix}
       1 & 0 \\
       0 & 1
       \end {pmatrix} \\
featuremap = \begin {pmatrix}
              8 & 9 \\
              4 & 8
              \end {pmatrix}\]
  - 여기서 사용되는 커널은 3개의 채널을 가진 1개의 커널
3차원 텐서의 합성곱 연산

  - 3차원 텐서의 합성곱 연산 후 특성맵의 채널은 1임

  - 위 이미지는 커널을 여러개 사용하는 경우
- 사용된 커널의 수는 특성맵의 채널이 됨
- 이 경우 Ci와 C0가 주어졌을 때 가중치 매개변수의 수를 구할 수 있음
    
      - 합성곱층에서 가중치 : 커널의 원소
- 커널의 크기 : Ki X Ko
- 커널의 크기(채널도 포함) : Ki X Ko X Ci
- 커널의 개수도 포함 : Ki X Ko X Ci X Co
 
\[가중치 \,\ 매개변수의 \,\ 총 \,\ 수 \;=\; K_i \times K_o \times C_i \times C_o\]
풀링
  - 일반적으로 합성곱층 이후 풀링층을 추가
- 풀링층에선 특성맵을 다운샘플링
    
  
- 커널과 스트라이드 개념 다 있음
- 풀링 연산
    
      - maxpooling : 특성맵과 커널이 겹치는 원소들 중 최댓값만 뽑아냄
- averagepooling : 특성맵과 커널이 겹치는 원소들의 평균 추출
 
합성곱 연산과 풀링의 차이