AI 활용 소프트웨어 개발/AI, 머신러닝, 딥러닝

CNN 구조 안에서 커널(kernel), 스트라이드(stride), 채널(channel), MaxPooling, 다운샘플링(downsampling), Fully Connected Layer의 의미, 그리고 실제 계산

ha2yong 2025. 8. 18. 14:58

1. 커널 (Kernel, 필터)

  • 정의: CNN에서 특징(feature)을 추출하기 위해 사용하는 작은 가중치 행렬.
  • 크기 예시: YOLO v1에서는 주로 3×3 커널을 사용했어요.
  • 계산 방식: 입력 이미지 위를 커널이 슬라이딩하면서 합성곱(convolution)을 수행해 새로운 출력(feature map)을 만듭니다.
    • 예: 입력이 7×7, 커널이 3×3, stride=1, padding=0 → 출력은 5×5

공식:

O=S(I−K+2P)​+1
  • II: 입력 크기
  • KK: 커널 크기
  • PP: 패딩 크기
  • SS: 스트라이드

2. 스트라이드 (Stride)

  • 정의: 커널이 입력 위를 이동할 때의 보폭.
  • 예시: stride=1 → 한 칸씩 이동 / stride=2 → 두 칸씩 이동
  • 효과: stride가 크면 출력 feature map 크기가 작아져, 다운샘플링 효과를 가져옵니다.

예: 입력 7×7, 커널 3×3, stride=2, padding=0

O=2(7−3+0)​+1=3

즉, 출력은 3×3이 됩니다.


3. 채널 (Channel)

  • 정의: 입력 이미지의 깊이(dimension).
  • 컬러 이미지(RGB)는 채널=3 (Red, Green, Blue).
  • 합성곱 연산에서는 각 채널별로 커널이 적용되고, 결과가 합쳐져 출력 feature map을 만듭니다.

예:

입력: 224×224×3 (RGB 이미지)

커널: 3×3×3, 필터 수=64개

출력: 224×224×64

즉, 채널은 “특징을 담는 깊이”라고 이해하면 됩니다.


4. MaxPooling

  • 정의: 일정 영역(예: 2×2)에서 최댓값을 뽑아내는 다운샘플링 방법.
  • 효과:
    • 크기 축소 (downsampling)
    • 연산량 감소
    • 중요한 특징만 남기고 불필요한 값 제거 → translation invariance(위치 변화에 덜 민감)

예:

  • 입력: 4×4
  • MaxPool 2×2, stride=2 → 출력: 2×2
 
입력: 
입력:   1 3 2 1
        4 6 5 2
        7 8 9 1
        2 3 4 0

출력:   6 5
        8 9

5. 다운샘플링 (Downsampling)

  • 정의: 입력 크기를 줄여 더 작은 feature map으로 만드는 과정.
  • 방법:
    • Stride > 1 합성곱
    • Pooling (MaxPool, AvgPool)
  • YOLO v1: Conv stride=2, MaxPooling을 반복적으로 사용해
    • 입력 448×448 → 마지막 feature map 7×7로 축소

6. YOLO v1 예시 계산 과정

YOLO v1의 입력은 .
네트워크 구조를 따라가면 이렇게 다운샘플링됩니다.


✅ 정리

  • 커널: 특징 추출을 위한 작은 가중치 행렬
  • 스트라이드: 커널 이동 보폭 → 클수록 출력 작아짐
  • 채널: 특징의 깊이, 필터 수만큼 출력 채널 생성
  • MaxPooling: 일정 영역에서 대표 값만 추출해 크기 축소
  • 다운샘플링: Conv(stride>1), Pooling으로 입력을 점점 줄여나감
  • YOLO v1:   입력이 최종적으로 7×7 feature map으로 변환

 

YOLO v1 Darknet 참조 버전 레이어별 출력 크기 (입력: 448×448×3)

# Layer Kernel / Stride / Pad Filters Input → Output
1 Conv 7×7 / s2 / p3 64 448×448×3 → 224×224×64
2 MaxPool 2×2 / s2 224×224×64 → 112×112×64
3 Conv 3×3 / s1 / p1 192 112×112×64 → 112×112×192
4 MaxPool 2×2 / s2 112×112×192 → 56×56×192
5 Conv 1×1 / s1 / p0 128 56×56×192 → 56×56×128
6 Conv 3×3 / s1 / p1 256 56×56×128 → 56×56×256
7 Conv 1×1 / s1 / p0 256 56×56×256 → 56×56×256
8 Conv 3×3 / s1 / p1 512 56×56×256 → 56×56×512
9 MaxPool 2×2 / s2 56×56×512 → 28×28×512
10 Conv 1×1 / s1 / p0 256 28×28×512 → 28×28×256
11 Conv 3×3 / s1 / p1 512 28×28×256 → 28×28×512
12 Conv 1×1 / s1 / p0 256 28×28×512 → 28×28×256
13 Conv 3×3 / s1 / p1 512 28×28×256 → 28×28×512
14 Conv 1×1 / s1 / p0 256 28×28×512 → 28×28×256
15 Conv 3×3 / s1 / p1 512 28×28×256 → 28×28×512
16 Conv 1×1 / s1 / p0 256 28×28×512 → 28×28×256
17 Conv 3×3 / s1 / p1 512 28×28×256 → 28×28×512
18 Conv 1×1 / s1 / p0 512 28×28×512 → 28×28×512
19 Conv 3×3 / s1 / p1 1024 28×28×512 → 28×28×1024
20 MaxPool 2×2 / s2 28×28×1024 → 14×14×1024
21 Conv 1×1 / s1 / p0 512 14×14×1024 → 14×14×512
22 Conv 3×3 / s1 / p1 1024 14×14×512 → 14×14×1024
23 Conv 1×1 / s1 / p0 512 14×14×1024 → 14×14×512
24 Conv 3×3 / s1 / p1 1024 14×14×512 → 14×14×1024
25 Conv 3×3 / s2 / p1 1024 14×14×1024 → 7×7×1024
26 Conv 3×3 / s1 / p1 1024 7×7×1024 → 7×7×1024
27 Conv 3×3 / s1 / p1 1024 7×7×1024 → 7×7×1024
28 FC 4096 7×7×1024 → 4096
29 FC (output) 7×7×30 4096 → 7×7×30 (=1470)

 

 


1. Fully Connected Layer (FC)의 정의

  • 완전연결층은 말 그대로 앞 층의 모든 뉴런이 현재 층의 모든 뉴런과 연결된 구조예요.
  • 합성곱층(conv layer)이나 풀링층(pooling layer)에서는 공간적(local) 연결만 존재하지만, FC층에서는 전역(global) 연결이 이루어집니다.
  • 수식으로 표현하면, FC층은 **행렬 곱(matrix multiplication)**을 하는 것과 같아요.

y=W⋅x+by = W \cdot x + b

  • xx: 입력 벡터 (flatten된 feature map)
  • WW: 가중치(weight) 행렬
  • bb: 편향(bias)
  • yy: 출력 벡터

2. YOLO v1에서의 FC 동작

YOLO v1은 마지막 합성곱 층의 출력이 7×7×1024입니다.

  1. Flatten 과정
    • 7×7×1024=501767 \times 7 \times 1024 = 50176개의 값을 1차원 벡터로 변환합니다.
  2. FC Layer 1 (4096 units)
    • 50176차원 입력 → 4096차원 출력
    • 이 단계에서 CNN이 학습한 공간적 특징을 압축해서, 최종 탐지에 필요한 **고수준 표현(high-level representation)**을 만듭니다.
  3. FC Layer 2 (7×7×30 = 1470 units)
    • 4096차원 입력 → 1470차원 출력
    • 이 1470차원 벡터를 다시 7×7×30 텐서로 reshape
    • 각 grid cell마다 30개의 값:
      • 2개의 bounding box × 5 값(x, y, w, h, confidence) = 10
      • 클래스 확률 20개 = 20
      • → 총 30

즉, FC층이 하는 일은 **“CNN이 뽑아낸 특징을 YOLO의 최종 예측 구조(7×7×30)에 맞춰 변환하는 것”**입니다.


3. FC Layer의 특징

  • 장점: 이미지 전체의 특징을 종합하여 최종 의사결정(분류, 탐지)을 수행
  • 단점:
    • 파라미터 수가 매우 많음 (가중치 행렬 크기가 엄청남)
    • 연산량 증가
    • 그래서 최근(YOLOv2 이후)에는 FC 대신 **Global Average Pooling (GAP)**을 쓰는 추세

4. YOLO v1 예시

  • 입력: 7×7×1024 = 50176
  • FC(4096): 가중치 크기 = 50176×4096 ≈ 2억 개 (매우 많음)
  • FC(1470): 가중치 크기 = 4096×1470 ≈ 600만 개
    YOLO v1이 무겁고 GPU 메모리를 많이 먹었던 이유 중 하나가 바로 이 FC 구조 때문이에요.

✅ 정리

  • FC층은 합성곱 특징맵 → 최종 예측값으로 매핑하는 “전역 의사결정 층”
  • YOLO v1에서는 FC 덕분에 7×7 grid마다 bounding box + 클래스 확률을 출력할 수 있었음
  • 하지만 파라미터 수가 너무 많아서, 이후 YOLOv2부터는 FC를 없애고 Fully Convolutional Network (FCN) 구조로 바뀜

 

 


 

 

YOLO v1은 마지막에 FC 레이어(4096 → 1470)를 붙여서 출력했는데, 이후 YOLO v2부터는 FCN (Fully Convolutional Network) 구조로 바뀌었고, 마지막에 **Global Average Pooling (GAP)**이나 작은 conv layer로 출력을 뽑는 방식을 씁니다.


1. YOLO v1 (FC 사용)의 문제점

YOLO v1 마지막 구조:

  • 마지막 conv 출력: 7×7×1024=501767 \times 7 \times 1024 = 50176
  • FC1: 50176 → 4096
    • 가중치 수 = 50176×4096≈2.05억50176 \times 4096 ≈ 2.05억
  • FC2: 4096 → 1470
    • 가중치 수 = 4096×1470≈600만4096 \times 1470 ≈ 600만
  • 총 파라미터 ≈ 2.11억 개 (메모리 수 GB 단위 소모)

👉 단점

  • 매우 많은 파라미터 → GPU 메모리, 학습 시간 부담
  • 위치 특화(Locality) 손실 → flatten 후 전역 연결이라, 공간 구조가 사라짐
  • 과적합 위험 → 데이터가 부족하면 쉽게 오버피팅

2. FCN(Global Average Pooling) 방식

YOLO v2~ 이후는 FC 대신 Conv + GAP을 사용:

  • 마지막 conv 출력: 7×7×10247 \times 7 \times 1024
  • Conv (1×1, out=30): 7×7×1024→7×7×307 \times 7 \times 1024 → 7 \times 7 \times 30
    • 가중치 수 = 1×1×1024×30=307201 \times 1 \times 1024 \times 30 = 30720 (3만 개 수준)
  • 그대로 7×7×30을 출력

👉 장점

  • 파라미터 수 대폭 감소: 2억 → 3만 (약 7000배 감소)
  • 속도 향상: 학습/추론 모두 가벼움
  • 공간 정보 보존: conv라서 위치 구조가 유지됨
  • 과적합 방지: 불필요한 거대 파라미터가 없어 안정적

3. 계산량 비교 (대략적)

  • YOLO v1 FC 구조:
    • 연산량 = 2억 × forward/backprop → 매우 무거움
  • YOLO v2 FCN 구조:
    • 연산량 = 3만 × forward/backprop → 훨씬 가벼움

즉, 계산량/메모리 모두 수천 배 감소합니다.


4. 왜 GAP가 좋은가?

  • GAP는 feature map의 각 채널을 평균값 1개로 줄이는 방식 → 파라미터 0개
  • 최종적으로 conv filter만 조정해서 클래스 수나 bbox 수에 맞추면 끝
  • 따라서 네트워크를 End-to-End Convolutional 구조로 바꾸고, 공간성을 유지한 채 예측 가능

정리

  • YOLO v1 (FC): 파라미터 ≈ 2억, 무겁고 오버피팅 위험
  • YOLO v2 이후 (FCN+GAP): 파라미터 ≈ 3만, 훨씬 가볍고 일반화 잘됨
  • 장점: 연산량 감소, 메모리 효율, 공간 정보 보존, 학습 안정성