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.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
→ 출력(분류/회귀)