오늘은 생성 AI 수업에서 본격적으로 합성곱 신경망(CNN: Convolutional Neural Network)의 구조와 구현 방식에 대해 학습했다. CNN은 이미지 분류나 물체 인식처럼 시각 정보를 처리하는 데 매우 특화된 딥러닝 모델로, 딥러닝 분야에서 빠질 수 없는 핵심 개념 중 하나다.
이론적으로는 CNN의 계층 구조와 각 층의 역할을 상세히 이해했고, 실습에서는 fashion_mnist 데이터셋을 활용하여 직접 CNN 모델을 구현하고 성능을 확인해보는 경험까지 해볼 수 있었다.
합성곱 신경망이란?
합성곱 신경망은 이미지나 영상처럼 공간 구조가 중요한 데이터를 처리하는 데 특화된 신경망 구조다. 기존의 완전연결층 기반 신경망보다 파라미터 수가 적고, 지역적 특징(local feature)을 잘 포착한다는 장점이 있어 이미지 인식, 객체 검출 등에서 널리 활용된다.
이미지를 처리할 때는 입력 데이터를 구성하는 너비(W), 높이(H), 채널 수(C)를 고려하는데, 이 채널은 흑백이면 1, RGB 컬러 이미지면 3이다. CNN은 이 3차원 입력을 기반으로 여러 층을 거치며 특성(feature)을 추출하고, 최종적으로 결과를 분류한다.
합성곱 신경망의 구조
합성곱 신경망은 일반적으로 다음과 같은 순서로 구성된다:
입력층 → 합성곱층(Convolutional Layer) → 풀링층(Pooling Layer) → 완전연결층(Fully Connected Layer) → 출력층(Output Layer)
각 층이 어떤 역할을 하는지 하나씩 살펴보자.
1. 합성곱층 (Convolutional Layer)
합성곱층에서는 필터(커널)가 입력 이미지 위를 슬라이딩하며 특징 맵(feature map)을 생성한다. 이때 사용하는 하이퍼파라미터는 다음과 같다:
- 필터 크기 (F)
- 스트라이드 (S)
- 패딩 (필요시 사용)
이 층의 목적은 이미지의 가장자리, 경계, 질감 등과 같은 지역적인 특성을 감지하는 것이다.
예를 들어, 5×5 이미지에 2×2 필터를 스트라이드 2로 적용하면, 총 4개의 필터 영역이 생성되고 이 중 가장 큰 값만 남기는 '최대 풀링(Max Pooling)'을 수행하게 된다.
2. 풀링층 (Pooling Layer)
풀링은 이미지의 크기를 줄이면서 가장 중요한 정보를 유지하는 작업이다. 대표적인 방식은 다음 두 가지다:
- Max Pooling: 필터 내에서 가장 큰 값 선택
- Average Pooling: 필터 내의 평균값 계산
풀링은 연산량을 줄이고, 과적합(overfitting)을 방지하며, 중요한 특징만 유지할 수 있게 해준다.
아래는 최대 풀링과 평균 풀링의 결과를 비교한 예시다:
입력 (4×4) | Max Pooling 결과 (2×2) | Average Pooling 결과 (2×2) |
3 -1 12 -1-3 1 0 12 -3 0 13 -2 4 -1 | 3 123 4 | 0 30 1 |
이처럼 동일한 영역에서도 풀링 방식에 따라 출력 결과가 달라진다.
3. 완전연결층 (Fully Connected Layer)
합성곱층과 풀링층을 거친 결과는 고차원 벡터로 표현되며, 이 벡터는 완전연결층을 통해 1차원 벡터로 펼쳐지게(flatten) 된다. 이 층은 추출된 특성을 종합해 최종 분류 작업을 수행하는 역할을 한다.
예를 들어, 고양이, 사자, 원숭이 등으로 이미지를 분류한다면, 각각의 클래스에 해당하는 확률 벡터를 출력하게 된다.
4. 출력층 (Output Layer)
출력층에서는 일반적으로 소프트맥스 함수(softmax)를 사용하여 각 클래스에 대한 확률값을 계산한다. 이 확률들 중 가장 높은 값을 가지는 클래스가 모델의 예측 결과가 된다.
CNN 연산 구조 요약
CNN의 합성곱층과 풀링층은 다음과 같은 연산 구조를 따른다:
- 입력 데이터: W₁ × H₁ × D₁
- 필터 크기: F
- 스트라이드: S
- 출력 데이터:
- W₂ = (W₁ - F) / S + 1
- H₂ = (H₁ - F) / S + 1
- D₂ = D₁ (풀링은 채널 수를 유지)
다양한 합성곱 방식
CNN에서 사용하는 합성곱 방식은 1D, 2D, 3D로 나뉘며, 입력 형태와 필터의 구조에 따라 결정된다.
1D 합성곱
- 시간적 순서를 갖는 입력에 사용
- 입력: [W], 필터: [k]
- 출력: [W]
- 예시: 그래프나 시계열 데이터 처리
2D 합성곱
- 공간적 구조를 갖는 이미지 처리에 사용
- 입력: [W, H], 필터: [k, k]
- 출력: [W, H]
3D 합성곱
- 영상, CT 이미지와 같은 3차원 데이터에 사용
- 입력: [W, H, L], 필터: [k, k, d]
- 출력: [W, H, L]
5.2 합성곱 신경망 맛보기
합성곱 신경망의 이론적 구조를 이해했다면, 이제는 실제로 모델을 만들어보고 실험해보는 단계가 필요하다. 이번 실습에서는 PyTorch를 사용해 CNN 모델을 구현하고, fashion_mnist 데이터셋을 학습시켜보았다.
Fashion MNIST란?
Fashion MNIST는 MNIST 숫자 이미지의 대체 데이터셋으로, 10가지 종류의 의류 이미지를 포함한다:
- 0: T-shirt/top
- 1: Trouser
- 2: Pullover
- 3: Dress
- 4: Coat
- 5: Sandal
- 6: Shirt
- 7: Sneaker
- 8: Bag
- 9: Ankle boot
각 이미지는 28x28 픽셀, 흑백(채널 수=1) 형태이며, CNN 입장에서 보면 1개의 채널을 가진 2차원 이미지다.
모델 구조
실습에서는 다음과 같은 CNN 모델을 구성했다:
model = nn.Sequential(
nn.Conv2d(1, 32, kernel_size=3), # 첫 번째 합성곱층
nn.ReLU(),
nn.MaxPool2d(2), # 첫 번째 풀링층
nn.Conv2d(32, 64, kernel_size=3), # 두 번째 합성곱층
nn.ReLU(),
nn.MaxPool2d(2), # 두 번째 풀링층
nn.Flatten(), # 완전연결층 진입을 위한 flatten
nn.Linear(64 * 5 * 5, 128), # Fully connected
nn.ReLU(),
nn.Linear(128, 10), # 10개 클래스 분류
nn.Softmax(dim=1)
)
- Conv2d는 합성곱 연산을 담당하며, 이미지에서 특징을 추출한다.
- MaxPool2d는 크기를 줄이면서 중요한 정보를 남긴다.
- Flatten → Linear를 통해 클래스를 분류하는 단계로 전환한다.
학습 과정
이미지를 모델에 통과시키고 손실 함수(loss)를 기준으로 역전파를 수행하면서 파라미터가 조정된다. 학습을 반복할수록 정확도가 증가하며, 최종적으로 테스트 데이터에 대해 분류 정확도를 평가할 수 있다.
시각화
실습에서는 학습된 모델이 이미지에 대해 어떤 출력을 내는지도 직접 확인해보았다. 예를 들어, 다음과 같이 모델이 분류 결과를 확률로 출력하는 것을 볼 수 있다:
예측 확률 벡터: [0.01, 0.00, 0.00, 0.02, 0.92, 0.03, 0.00, 0.00, 0.01, 0.01]
예측 클래스: 4 (Coat)
오늘의 회고
이번 회고를 통해 합성곱 신경망의 구조를 단순히 외우는 것을 넘어, 데이터가 각 층을 거치며 어떻게 변형되고 추상화되는지에 대한 흐름을 실제로 체감할 수 있었다.
특히, 필터를 통한 특징 추출과 풀링을 통한 정보 요약 과정을 직접 구현하며 CNN의 작동 원리를 보다 구체적으로 이해하게 되었다.
앞으로는 전이 학습, 설명 가능한 CNN 기법, 그리고 다양한 실전 프로젝트에 이 구조를 어떻게 적용할 수 있을지에 대해 더 깊이 고민해보고자 한다.
'[kakao x goorm] 생성 AI 응용 서비스 개발자 양성 과정 > 회고록' 카테고리의 다른 글
[kakao x goorm] 형태소 분석과 토큰화, 그리고 텍스트 전처리 (0) | 2025.05.15 |
---|---|
[kakao x goorm] 전이학습, 설명 가능한 CNN, 그래프 기반 CNN (0) | 2025.05.14 |
[kakao x goorm] PyTorch 핵심 문법 정리 (0) | 2025.05.11 |
[kakao x goorm] 실습 환경 설정과 파이토치 기초 (0) | 2025.05.07 |
[kakao x goorm] 계산 그래프와 역전파, 딥러닝의 수학적 뼈대를 이해하다 (0) | 2025.05.02 |