CNN

hyeony·2025년 6월 22일

VISION

목록 보기
5/6

1. Introduction

가. CNN 정의

  • CNN(Convolutional Neural Network)은 입력 영상이나 신호에 대해 합성곱(convolution) 연산을 수행하는 신경망 구조

  • 기존의 linear 계층 대신(또는 추가로) convolution layerpooling layer을 사용하여 지역적 특징을 추출하고 파라미터 수 절감

나. FC 신경망과의 비교

① 완전 연결 신경망(FC Network)

  • 각 계층의 모든 뉴런이 이전 계층의 모든 뉴런과 연결되는 구조

  • 입력 영상을 1차원 벡터로 펼쳐(flatten) 처리하기 때문에 공간적·채널 정보 활용이 어려움

  • 픽셀 간 멀리 떨어진 관계까지 모두 모델링하나 실제 유의미한 상관관계는 적어 비효율적

  • 파라미터 수가 급격히 증가하여 메모리·연산 비용이 과도해지고, 오버피팅 위험이 높아짐

② CNN

  • 지역 수용 영역(local receptive field)을 통해 이웃 픽셀 간의 공간 정보를 보존하며 특징 추출

  • 필터(커널) 파라미터를 공유(weight sharing)하여 모델 복잡도를 크게 줄임

  • pooling layer로 특징 맵(feature map)의 크기를 축소해 연산량을 줄이고, 불변성(invariance) 확보

  • 결과적으로 FC 네트워크보다 효율적이고 강력한 이미지 특징 학습 可

2. 합성곱 연산

가. 2D 합성곱 과정(흑백 영상)

  • 합성곱 연산은 입력 영상 f(x,y)f(x,y)와 필터(커널) w(s,t)w(s,t)의 원소별 MAC(Multiply-Accumulate) 연산을 통해 출력 영상 g(x,y)g(x,y)를 계산

  • 수식:

    g(x,y)=s=aat=bbw(s,t)f(x+s,y+t)g(x,y) = \sum_{s=-a}^{a}\sum_{t=-b}^{b} w(s,t)\,f(x+s,\,y+t)

    여기서 필터 크기가 (2a+1)×(2b+1)(2a+1)\times(2b+1)일 때 각 위치 (x,y)(x,y)에서 주변 픽셀 가중합을 수행

  • 입력 크기 (Hin,Win)(H_{\rm in}, W_{\rm in}), 필터 크기 (KH,KW)(K_H, K_W), 패딩 PP, 스트라이드 SS를 적용하면 출력 크기는 다음과 같이 계산됨:

Hout=Hin+2PKHS+1,Wout=Win+2PKWS+1H_{\rm out} = \left\lfloor \frac{H_{\rm in} + 2P - K_H}{S} \right\rfloor + 1,\quad W_{\rm out} = \left\lfloor \frac{W_{\rm in} + 2P - K_W}{S} \right\rfloor + 1

나. 패딩·스트라이드·편향

① 패딩(Padding)

  • 입력 가장자리 픽셀에도 필터를 적용하기 위해 00 등을 추가

  • P=K/2P = \left\lfloor K/2 \right\rfloor로 설정하면 출력 크기 유지 가능

② 스트라이드(Stride)

  • 필터를 이동시키는 보폭

  • S=2S=2면 두 칸씩 건너뛴 위치에서 연산

  • 스트라이드 증가 → 출력 크기·연산량 감소

③ 편향(Bias)

  • 합성곱 결과에 더해지는 스칼라 bb

  • 각 특성 맵마다 학습 가능한 오프셋 제공

다. Spatial Filtering

  • Spatial Filtering은 입력 영상의 국소 영역에 마스크를 적용하여 원하는 특징(에지, 블러 등)을 추출하는 기법

  • 출력 이미지는 입력 신호와 필터 마스크 간의 correlation 또는 weighted sum을 통해 생성

3. 컬러 영상과 특성 맵

가. 다중 채널 합성곱

  • 컬러 영상 입력은 (C,H,W)(C, H, W) 형태의 3차원 텐서로 표현되고, 배치 처리는 (N,C,H,W)(N, C, H, W) 형태로 다룸

  • 각 필터는 (in_channels,out_channels,KH,KW)(\text{in\_channels},\,\text{out\_channels},\,K_H,\,K_W) 크기의 4차원 텐서로 구현

  • 합성곱 연산 시, 입력 채널 별로 커널과 MAC 연산을 수행한 뒤 채널 축을 따라 합산하여 하나의 출력 채널(feature map)을 생성

  • 여러 개의 필터 세트를 사용해 다수의 출력 채널을 얻으면, 최종 출력은 (out_channels,Hout,Wout)(\text{out\_channels},\,H_{\rm out},\,W_{\rm out}) 크기의 feature map 묶음이 됨

나. Feature Map 크기 변화

  • 개별 feature map 하나의 크기 변화는 이전 장의 출력 크기 공식과 동일하게 계산:

    Hout=Hin+2PKHS+1,Wout=Win+2PKWS+1H_{\rm out} = \left\lfloor\frac{H_{\rm in} + 2P - K_H}{S}\right\rfloor + 1,\quad W_{\rm out} = \left\lfloor\frac{W_{\rm in} + 2P - K_W}{S}\right\rfloor + 1
  • 채널 축 관점에서 보면,

    입력 (Cin,Hin,Win)(C_{\rm in}, H_{\rm in}, W_{\rm in}) → 출력(Cout,Hout,Wout)(C_{\rm out}, H_{\rm out}, W_{\rm out})

    (CoutC_{\rm out}은 사용된 필터 세트의 개수(출력 채널 수))

  • Feature map은 CNN 내부에서 합성곱 및 풀링 등 계층별 입·출력을 통칭하는 용어

4. 풀링과 수용 영역

가. Max/Average Pooling

① Max Pooling

  • 일정 크기 k×kk\times k 윈도우 내 최댓값을 추출

  • 가장 두드러진 특징을 강조

② Average Pooling

  • 같은 윈도우 내 픽셀 값의 평균을 계산

  • 부드러운 요약, 노이즈 저감

③ Pooling Layer의 역할

  • 특성 맵 크기 축소 → 연산량·모델 복잡도 감소

  • 국소적 특징 요약 → 불변성(invariance) 확보

  • 수용 영역(receptive field) 확대 → 더 넓은 문맥 학습 가능

나. Receptive Field

① 정의
특정 계층의 한 픽셀이 입력 영상에서 영향받는 영역 크기

② 증가 요인
풀링 계층 사용 빈도 ↑ 또는 스트라이드 (>1) 계층 ↑ → 수용 영역 확대

③ 의미
수용 영역이 클수록 더 글로벌한 특징 분석 가능

5. 파라미터·연산량 분석

가. 학습 파라미터 수

① 학습 파라미터 존재 여부

  • 존재: Linear 계층, Conv2d 계층 등
  • 부재: 활성화 함수, 풀링, Softmax, Loss 계층 등

② Conv2d 레이어의 파라미터 수

  • 필터(커널) 파라미터:
    in_channels×out_channels×K2\text{in\_channels} \times \text{out\_channels} \times K^2
  • 편향 파라미터:
    out_channels\text{out\_channels}

나. 연산량 계산

ⓢ 곱셈 연산 수 (MAC 관점)

in_channels×out_channels×K2×(Hout×Wout)\text{in\_channels} \times \text{out\_channels} \times K^2 \times (H_{\rm out} \times W_{\rm out})

② 덧셈 연산
곱셈 결과를 누적(accumulate)하므로 덧셈 수도 유사하게 계산

③ 참고
GPU 구조는 Fused Multiply–Add(FMA) 연산을 효율적으로 처리하도록 설계됨

6. PyTorch를 이용한 구현

가. nn.Conv2d 주요 인자

  • in_channels: 입력 채널 수 (예: 흑백 영상은 11, 컬러 영상은 33)

  • out_channels: 출력 채널(필터) 수 (feature map 개수)

  • kernel_size: 필터 크기. 정수 하나면 K×KK\times K, 튜플이면 (KH,KW)(K_H, K_W)

  • stride: 필터 이동 간격. 기본값 11

  • padding: 입력 테두리에 추가하는 ‘제로 패딩’ 크기. 기본값 00

  • dilation: 필터 요소 간격(확장). 기본값 11

  • groups: 채널 분할 수. 기본값 11(채널별 완전 연결)

  • bias: 편향 사용 여부. 기본값 True

나. MNIST 실험 모델 (FC Vs. CNN)

① FC 모델

  class My_Model(nn.Module):
      def __init__(self):
          super().__init__()
          self.layer = nn.Sequential(
              nn.Linear(784, 50),
              nn.ReLU(),
              nn.Linear(50, 10)
          )
      def forward(self, x):
          x = x.view(bs, -1)        # [bs, 1, 28, 28] → [bs, 784]
          return self.layer(x)      # [bs, 10]

② CNN 모델: 학습 데이터 정확도 거의 100% 수렴, 시험 데이터 정확도 95% 이상

class My_Model(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv_layer = nn.Sequential(
            nn.Conv2d(1, 16, 5),   # [bs, 1, 28, 28] → [bs, 16, 24, 24]
            nn.ReLU(),
            nn.MaxPool2d(2, 2),    # → [bs, 16, 12, 12]
            nn.Conv2d(16, 32, 5),  # → [bs, 32, 8, 8]
            nn.ReLU(),
            nn.MaxPool2d(2, 2)     # → [bs, 32, 4, 4]
        )
        self.fc_layer = nn.Linear(32*4*4, 10)  # [bs, 512] → [bs, 10]
    def forward(self, x):
        x = self.conv_layer(x)  
        x = x.view(bs, -1)      # → [bs, 512]
        return self.fc_layer(x)

7. CNN 시각화

가. 1층 필터 시각화

  • 첫 번째 합성곱 계층의 가중치(필터)들은 보통 5×55\times5 크기로 구성됨

  • 흑백 입력에서는 단일 채널 필터 세트에 각기 다른 30 개의 필터를 적용할 수 있음

  • 시각화 시에는 필터 계수 값을 스케일링하여 그레이스케일 이미지 형태로 표시

나. 층별 특징 변화 (Zeiler & Fergus)

  • 초반부 레이어에서는 주로 에지(edge)나 간단한 패턴 같은 로컬 정보가 검출됨

  • 중·심층부로 갈수록 점차 복잡하고 글로벌한 형태(텍스처, 형태 등)를 학습함

  • Zeiler & Fergus(2014)의 연구는 각 레이어별 활성화 deconvolutional visualization을 통해 이 변화를 명확히 보여줌

<참고 자료>
유성욱 교수님, 지능형 영상처리, 중앙대학교 전자전기공학부, 2024

profile
Chung-Ang Univ. EEE.

0개의 댓글