[학습 일기 #36] 딥러닝 4일차

Ariel_Jeong·2026년 3월 3일

[학습 일기 시리즈]

목록 보기
37/44

1. CNN이 왜 필요한가?

1.1 MLP(일반 신경망)가 이미지에 약한 이유

1.1.1. 파라미터 폭발

  • MNIST 28×28 흑백 이미지 → 입력 784개
    → 만약 첫 node(=newron)가 512개라면 파라미터는 대략 784×512 수준으로 수십만 개가 된다.
  • 224×224 컬러 이미지(3채널)는 입력이 224×224×3 = 150,528이라서 더 심각해진다.

1.1.2. 공간 정보 손실

  • MLP에 넣으려면 보통 이미지를 Flatten(1차원 펼치기) 한다.
    → 그러면 “왼쪽 위에 있던 픽셀”과 “오른쪽 아래 픽셀”이 그냥 1차원 인덱스가 되어, 서로 이웃이라는 의미가 크게 약해진다.

1.1.3. 위치 변화에 취약

  • 고양이가 왼쪽에 있든 오른쪽에 있든 “같은 고양이”로 보고 싶지만, MLP는 위치가 달라지면 다른 패턴으로 인식하기 쉽다.

이에 대한 해결책이 CNN이다.

CNN은

  • 국소 연결(local connection) 로 파라미터를 줄이고,
  • 공간 구조(2D)를 유지한 채로,
  • 위치가 조금 바뀌어도 핵심 패턴을 잡는 방향으로 학습한다.




2. 합성곱(Convolution): “필터가 이미지를 훑으며 특징을 뽑는다”

2.1. 합성곱이란?

작은 필터(=커널, kernel) 가 이미지 위를 “슬라이딩”하면서
겹치는 영역에서 원소별 곱(element-wise multiply) 을 하고 합(sum) 해서 값을 하나 만든다.
이 과정을 모든 위치에 대해 반복하면 특징맵(Feature Map) 이 나온다.

비유로 말하면:
돋보기(필터) 를 들고 사진 위를 훑으면서 “특정 무늬/경계/질감이 있는지”를 점수로 기록하는 느낌.


2.2. 합성곱의 계산 흐름

1) 필터(커널): 보통 3×3 또는 5×5 같은 작은 행렬
2) 슬라이딩: 한 칸(또는 여러 칸)씩 이동
3) 원소별 곱셈: 필터와 겹치는 픽셀끼리 곱
4) 합산: 곱한 값들을 모두 더함
5) 결과: 특징맵(Feature Map) 생성


2.3. 수식으로 표현

  • Input: 입력 이미지(또는 입력 특성맵)
  • Kernel: 필터 가중치
  • (i, j): 출력 위치
  • (m, n): 커널 내부 위치

2.4. 합성곱의 3요소: Kernel Size, Stride, Padding

CNN을 이해하는 데 제일 중요한 “조절 레버” 3개다.

2.4.1. Kernel Size (필터 크기)

2.4.2. Stride (이동 간격)

  • Stride=1: 한 칸씩 이동(기본)
  • Stride=2: 두 칸씩 이동 → 출력 크기 감소(다운샘플링 효과)

비유하자면,

  • 같은 거리를 걷는데 보폭이 커지면 찍는 발자국(출력 위치)이 줄어든다.

2.4.3. Padding (가장자리 채우기)

  • 입력 주변에 0을 둘러서 붙인다.
  • Padding 없음(=Valid) → 출력 크기 감소
  • Same padding → 출력 크기 유지(대표적으로 3×3이면 padding=1)
  • Valid padding → padding=0(사실상 “패딩 없음”)

2.5. 출력 크기(Output size) 계산식

왜 +1이 붙을까?

  • “시작 위치도 하나의 위치”로 카운트하기 때문
    즉, (움직일 수 있는 총 구간 / 보폭) 만큼 이동해서 얻는 위치 개수에, 처음 시작점 1개를 더한다.

왜 stride로 나누나?

  • 필터가 한 번 움직일 때마다 출력이 하나 생긴다.
  • Stride=2면 두 칸에 출력 1개. 즉, 출력 위치가 절반 수준으로 줄어든다.




3. 채널(channel)과 필터(filter)

3.1. 채널이란?

  • 흑백 이미지: 1채널
  • 컬러(RGB): 3채널
  • 의료 영상(CT 등): 상황에 따라 슬라이스/시퀀스를 채널처럼 다루기도 함(데이터 구성에 따라)

3.2. 출력 채널 = 필터 수

  • 필터 1개가 특징맵 1장을 만든다.
  • 그래서 out_channels=64면 특징맵이 64장(64채널)이 된다.

3.3. Conv2d 파라미터 수 공식

  • +1은 bias(편향)
  • 예: Conv2d(3, 64, kernel_size=3)
    • (3×3×3+1)×64=1,792

3.4. 필터가 “학습하는 것” (층이 깊어질수록 추상화)

CNN의 필터는 처음부터 정해진 게 아니라, 학습을 통해 “무엇을 감지할지”를 스스로 맞춘다.

  • 초기 층: 엣지(경계), 선, 색 변화 같은 저수준 특징
  • 중간 층: 질감, 반복 패턴, 모양 같은 중수준 특징
  • 깊은 층: 눈/코/얼굴/특정 물체 같은 고수준 특징




4. 풀링(Pooling): “특성맵을 줄이면서 중요한 정보만 남기기”

4.1. 풀링이 필요한 이유

  • 다운샘플링: 특성맵 크기 축소
  • 계산량 감소: 다음 층 연산이 가벼워짐
  • 위치 불변성: 약간의 위치 변화에 강해짐
  • 과적합 완화: 정보 압축으로 일반화에 도움

비유:

  • 사진을 원본 그대로 들고 다니면 무겁다.
  • 핵심만 남긴 “요약본”으로 줄이면 빠르게 판단할 수 있다.

4.2. 풀링의 종류

4.2.1. Max Pooling

  • 영역 내 최댓값만 가져온다.
  • “가장 강하게 반응한 특징”을 남기는 느낌.

4.2.2. Average Pooling

  • 영역 내 평균값을 가져온다.
  • “전체 반응의 평균적인 강도”를 남긴다.

4.2.3. Global Average Pooling (GAP)

  • 특성맵 전체(H×W)를 채널당 1×1로 압축한다.
  • PyTorch에서는 보통 AdaptiveAvgPool2d((1,1))로 구현한다.
  • Flatten + FC를 크게 줄여서 파라미터 절감에 유리하다.




5. CNN의 전체 구조(전형적인 형태)

입력 이미지
[Conv → BatchNorm → ReLU → Pool] × N
Flatten
[Fully Connected → ReLU] × M
출력(분류/회귀)

profile
R&D 분야의 경험을 토대로 커리어 확장에 도전중인 개발꿈나무입니다.

0개의 댓글