딥러닝을 공부하다 보면 반드시 마주치게 되는 구조 중 하나가 바로 CNN(Convolutional Neural Network, 합성곱 신경망)이에요.
CNN은 특히 이미지나 영상 같은 2차원 데이터를 처리하는 데 강점을 가진 신경망 구조로, 컴퓨터 비전 분야에서 폭넓게 활용되고 있죠. 이 글에서는 CNN의 기본 개념부터 주요 구성 요소, 간단한 코드 예제, 그리고 활용 사례까지 한 번에 살펴보겠습니다.


1. CNN이 필요한 이유

딥러닝 이전에 전통적인 머신러닝 방식으로 이미지를 다룰 때는, 사람 손으로 특징(feature)을 일일이 추출해야 했어요.
예를 들어, 에지 검출, 컬러 히스토그램 계산 등 수많은 전처리 과정을 거쳐야 했죠. 하지만 CNN은 “합성곱 연산(Convolution)”을 통해 이미지 속에 숨어 있는 중요한 패턴을 자동으로 학습할 수 있어요.

  • 수작업 특징 추출 불필요
  • 이미지의 공간적 구조(공간적 상관관계)를 효과적으로 활용
  • 학습해야 할 파라미터 수를 줄여 연산량 절감

이러한 이유로 이미지 분류, 객체 검출, 세그멘테이션 등 다양한 컴퓨터 비전 과제에서 CNN이 주류가 되었습니다.


2. CNN의 전체 구조

CNN 모델은 크게 아래와 같은 단계로 구성돼 있어요:

  1. 입력층(Input Layer)
  2. 합성곱 층(Convolutional Layer)
  3. 활성화 함수(Activation Function)
  4. 풀링 층(Pooling Layer)
  5. (반복적으로 2~4번 블록 구성)
  6. 평탄화 층(Flatten Layer)
  7. 완전연결층(Dense Layer)
  8. 출력층(Output Layer)

아래 그림을 간단하게 떠올려 보세요:

[이미지] → [Conv + ReLU] → [Pooling] → [Conv + ReLU] → [Pooling] → … → [Flatten] → [Dense] → [Output]

1~5 단계에서 이미지를 점점 압축하고 추출된 특징 맵(feature map)을 만들고, 6단계에서 1차원 벡터로 변환한 뒤, 7~8단계에서 최종 분류(or 회귀)를 수행합니다.


3. 주요 구성 요소

3.1 합성곱 층(Convolutional Layer)

  • 역할
    이미지(또는 이전 층의 특징 맵)에 여러 개의 필터(커널)를 “슬라이딩”하면서, 지역적인 패턴(엣지, 선, 질감 등)을 추출합니다.
  • 파라미터
    • 필터 크기(kernel size): 주로 (3×3), (5×5) 등을 사용
    • 필터 개수(filters or channels): 예를 들어 32, 64, 128 등
    • 스트라이드(stride): 필터가 얼마나 이동하면서 연산할지 (보통 1)
    • 패딩(padding): 입력 가장자리 처리를 어떻게 할지 (valid or same)
  • 출력
    각 필터당 하나의 특징 맵(feature map)이 생성되며, 이를 쌓아 다차원 텐서(예: (H, W, C))로 만듭니다.

3.2 활성화 함수(Activation Function)

  • 역할
    합성곱으로 얻은 선형 결합 결과에 비선형성을 부여합니다.
  • 대표적 함수
    • ReLU(Rectified Linear Unit): f(x) = max(0, x)
    • Leaky ReLU, ELU 등도 상황에 따라 활용

3.3 풀링 층(Pooling Layer)

  • 역할
    특징 맵의 공간적 크기(높이 × 너비)를 줄이고, 가장 중요한 정보만 남깁니다. (차원 축소 + 과적합 방지)
  • 종류
    • Max Pooling: 일정 영역 내 최댓값 추출 (가장 많이 사용)
    • Average Pooling: 일정 영역 내 평균값 계산
  • 파라미터
    • 풀 크기(pool size): 보통 (2×2)
    • 스트라이드(stride): 보통 풀 크기와 동일하게 설정

3.4 평탄화 층(Flatten Layer)

  • 역할
    2D(또는 3D) 텐서를 1D 벡터로 펼쳐서, 이후의 Dense 층에 입력할 수 있도록 변환합니다.

3.5 완전연결층(Dense Layer)

  • 역할
    평탄화된 벡터를 받아 최종 예측(클래스 점수 혹은 회귀값)을 수행합니다.
  • 활성화 함수
    • 분류: 마지막 층에 softmax (다중 클래스) 또는 sigmoid (이진)
    • 은닉층 내부: 보통 relu 사용

4. 간단한 Keras 코드 예제

아래 예제는 MNIST(28×28 흑백 손글씨 이미지)를 분류하는 아주 단순한 CNN 모델이에요.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense

# 1) 모델 정의
model = Sequential([
    # (1) 합성곱 층: 32개의 3×3 필터, ReLU, 입력 크기 (28, 28, 1)
    Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    # (2) 풀링 층: 2×2 MaxPooling
    MaxPooling2D((2, 2)),

    # (3) 합성곱 층: 64개의 3×3 필터, ReLU
    Conv2D(64, (3, 3), activation='relu'),
    # (4) 풀링 층: 2×2 MaxPooling
    MaxPooling2D((2, 2)),

    # (5) 평탄화
    Flatten(),
    # (6) 완전연결층: 128개 노드, ReLU
    Dense(128, activation='relu'),
    # (7) 출력층: 10개 노드, softmax
    Dense(10, activation='softmax')
])

# 2) 컴파일
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# 3) 학습 (x_train: (60000, 28, 28, 1), y_train: (60000,))
model.fit(x_train, y_train, epochs=5, batch_size=64, validation_split=0.1)

코드 설명

  1. Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1))

    • 32개의 (3×3) 필터를 사용해 이미지를 합성곱한 뒤, ReLU를 적용
    • 입력 데이터 형태는 (28, 28, 1) (흑백 이미지)
  2. MaxPooling2D((2,2))

    • (2×2) 영역에서 최대값을 뽑아 공간 크기를 절반으로 줄임
    • 예를 들어, (28,28) → (14,14)
  3. Flatten()

    • 2D 특징 맵을 1D 벡터로 변환.
    • 만약 마지막 Conv/Pool 블록의 출력이 (4, 4, 64) 라면, Flatten()(4*4*64 = 1024,) 크기의 벡터가 만들어짐
  4. Dense(128, activation='relu')

    • 1D 벡터를 받아 128개 뉴런을 가진 은닉층에 연결하고 ReLU 활성화 함수 사용
  5. Dense(10, activation='softmax')

    • 최종적으로 10개의 클래스로 확률을 출력 (MNIST 숫자 0~9)

5. 주요 하이퍼파라미터

  • 필터 크기(kernel size)
    • 작은 필터 (3×3) 사용이 일반적 → 연산량 감소 + 더 깊은 네트워크 가능
  • 필터 개수(filters)
    • 처음에는 32, 64부터 시작, 가로질러 가면 128, 256 등으로 증가
  • 패딩(padding)
    • valid: 패딩 없이 순수 합성곱
    • same: 출력 크기를 입력 크기와 동일하게 유지
  • 스트라이드(stride)
    • 보통 1로 설정. 2로 하면 더 급격한 축소
  • 풀 크기(pool size)
    • 보통 (2×2) → 공간 크기 절반으로 줄임
  • 학습률(learning rate), 배치 크기(batch size), 에포크 수(epochs) 등 일반 딥러닝 하이퍼파라미터

6. CNN의 활용 사례

  1. 이미지 분류(Image Classification)

    • 고양이 vs 개 분류, 자율주행 차량의 객체 인식 등
    • 대표 모델: LeNet, AlexNet, VGG, ResNet 등
  2. 객체 검출(Object Detection)

    • 이미지 내에서 특정 물체가 어디에 있는지 바운딩 박스로 찾아냄
    • 대표 모델: R-CNN 계열(기본 R-CNN, Fast R-CNN, Faster R-CNN), YOLO, SSD 등
  3. 이미지 세그멘테이션(Image Segmentation)

    • 픽셀 단위로 물체 영역을 분할
    • 대표 모델: U-Net, Mask R-CNN, DeepLab 등
  4. 의료 영상 분석(Medical Imaging)

    • 암 진단, 병변 검출 등에 CNN이 널리 활용됨
  5. 스타일 변환(Style Transfer), 생성 모델(Generative Models)

    • GAN, VAE 등에서 CNN을 인코더/디코더 구조로 활용

7. 결론

CNN은 이미지나 영상 데이터를 다룰 때 “합성곱” 연산을 통해 자동으로 유의미한 특징을 추출하여, 높은 성능을 보여주는 강력한 신경망 구조예요.
핵심은 다음과 같습니다:

  • 합성곱 층에서 로컬한 특징을 뽑고
  • 풀링 층에서 공간적 크기를 줄이며
  • Dense 층에서 최종 예측을 수행

처음에는 간단한 구조로 시작해 보고, 점차 필터 개수나 레이어를 늘려가는 방식으로 실험해 보면 CNN의 작동 방식을 더 깊게 이해할 수 있어요.
Velog 포스트를 통해 배우며 직접 손으로 코드를 작성해 보고, MNIST나 CIFAR-10 같은 데이터셋으로 실습해 보면 더욱 빠르게 감을 잡을 수 있을 거예요.

궁금한 점이 있거나, 더 깊은 내용(예: ResNet, MobileNet, Transfer Learning 등)이 궁금하다면 댓글로 알려주세요!
즐거운 딥러닝 공부 되세요~ 😊


작성일: 2025년 6월 4일

profile
능숙한 바이브코딩을 할 수 있게 됨을 꿈꾸며

0개의 댓글