반응형
CNN(합성곱 신경망, Convolutional Neural Network)은 이미지 및 영상 데이터 처리에 특화된 딥러닝 모델입니다.
인간의 시각적 인식을 모방하여 패턴을 자동으로 학습하고, 이미지에서 의미 있는 특징(feature)을 추출하는 데 뛰어난 성능을 발휘합니다.
CNN은 특히 컴퓨터 비전(Computer Vision) 분야에서 널리 사용되며, 이미지 분류, 객체 탐지, 얼굴 인식, 자율주행, 의료 영상 분석 등의 다양한 응용 사례에서 핵심적인 역할을 합니다.
1. CNN의 주요 개념과 특징
1) 지역적 연결(Local Connectivity)
- 기존의 완전연결 신경망(Fully Connected Network, FCN)과 달리, CNN은 이미지의 공간적 구조를 유지하면서 학습합니다.
- 한 번에 전체 이미지를 처리하는 것이 아니라, **작은 필터(커널, Kernel)**를 사용하여 이미지의 일부 영역만 학습합니다.
2) 가중치 공유(Weight Sharing)
- 같은 필터를 이미지 전체에 적용하기 때문에 매우 적은 수의 가중치(weight)만 학습하면 됩니다.
- 이를 통해 계산량이 줄어들고, 학습 속도가 향상됩니다.
3) 자동 특징 추출(Feature Extraction)
- CNN은 데이터를 학습하면서 특징을 자동으로 추출할 수 있습니다.
- 초기층에서는 단순한 패턴(선, 모서리)을 학습하고, 깊은 층으로 갈수록 복잡한 구조(얼굴, 자동차 등)를 학습할 수 있습니다.
2. CNN의 구조
CNN은 기본적으로 다음과 같은 3가지 주요 레이어로 구성됩니다.
1) 합성곱 레이어(Convolutional Layer)
- 이미지 데이터를 작은 크기의 필터(커널)와 합성곱 연산을 수행하여 **특징맵(Feature Map)**을 생성합니다.
- ReLU(Rectified Linear Unit) 활성화 함수를 적용하여 비선형성을 추가합니다.
- 여러 개의 필터를 사용하여 이미지의 다양한 특징을 학습할 수 있습니다.
합성곱 연산 공식

- XX : 입력 이미지
- KK : 필터(커널)
- YY : 출력 특징맵
2) 풀링 레이어(Pooling Layer)
- 특징맵의 크기를 줄이고 계산량을 감소시키는 역할을 합니다.
- 가장 많이 사용되는 방법은 **최대 풀링(Max Pooling)**으로, 일정 영역에서 가장 큰 값을 선택합니다.
- 풀링을 통해 중요한 특징을 유지하면서도, 연산량을 줄일 수 있습니다.
3) 완전연결 레이어(Fully Connected Layer, FC)
- CNN에서 추출한 특징을 바탕으로 분류(Classification)를 수행하는 단계입니다.
- 일반적인 신경망과 마찬가지로, 모든 뉴런이 서로 연결되어 있으며, 소프트맥스(Softmax) 함수를 적용하여 최종 확률을 출력합니다.
3. CNN의 주요 활용 분야
CNN은 이미지 데이터를 다룰 때 가장 강력한 도구 중 하나이며, 여러 산업에서 필수적인 기술로 자리 잡고 있습니다.
1) 이미지 및 영상 처리
- 얼굴 인식 (Face Recognition)
- 객체 탐지(Object Detection)
- 자율주행 자동차의 영상 분석
2) 의료 영상 분석
- X-ray, CT, MRI 등의 의료 영상에서 이상 징후 탐지
- 피부암, 폐 질환 등 질병 진단 지원
3) 자연어 처리(NLP)
- CNN은 텍스트 데이터를 2D 형태로 변환하여 문장 분류, 감정 분석 등의 자연어 처리 작업에도 활용될 수 있습니다.
4) 음성 및 신호 처리
- 음성 인식 모델에 CNN을 적용하여 음성 데이터의 특징을 추출하는 데 활용
4. CNN의 대표적인 모델
CNN은 많은 연구자들에 의해 다양한 형태로 발전해 왔으며, 대표적인 CNN 모델은 다음과 같습니다.
1) LeNet-5 (1998)
- Yann LeCun이 개발한 최초의 CNN 모델
- 손글씨 숫자 인식(MNIST 데이터셋)을 위해 설계됨
- 5개의 레이어 구조로 이루어져 있으며, 필터 크기가 작음
2) AlexNet (2012)
- 딥러닝의 혁신을 이끈 모델로, ImageNet 대회에서 압도적인 성능을 보임
- 5개의 합성곱 레이어와 3개의 완전연결 레이어로 구성됨
- ReLU 활성화 함수와 드롭아웃(Dropout) 기법을 도입하여 성능 개선
3) VGGNet (2014)
- 16~19개의 깊은 레이어를 가진 CNN 모델
- 모든 합성곱 레이어에서 3×3 필터 크기를 고정하여 단순한 구조를 유지
4) ResNet (2015)
- 잔차 학습(Residual Learning)을 활용하여 매우 깊은 네트워크(50~152 레이어) 구현
- Skip Connection 구조를 도입하여 기울기 소실 문제 해결
5. CNN 예제
예를 들어, CNN을 사용하여 고양이 vs. 강아지 이미지 분류를 수행하는 경우 다음과 같은 단계를 거칩니다.
- 입력 이미지: 고양이 사진을 입력
- 합성곱 연산: 경계, 질감, 모양 등의 특징 추출
- 풀링 연산: 불필요한 정보를 제거하고 중요한 특징만 남김
- 완전연결 레이어: 추출한 특징을 바탕으로 ‘고양이’ 또는 ‘강아지’로 분류
- 출력 결과: “고양이일 확률: 95%, 강아지일 확률: 5%”
아래는 PyTorch를 사용하여 간단한 CNN 모델을 정의하는 코드입니다.
import torch # PyTorch 라이브러리 임포트
import torch.nn as nn # 신경망 모듈을 사용하기 위한 nn 패키지 임포트
import torch.optim as optim # 최적화 알고리즘을 위한 optim 패키지 임포트
import torch.nn.functional as F # 활성화 함수 및 손실 함수를 포함하는 functional 패키지 임포트
# CNN 모델 정의 (SimpleCNN 클래스)
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__() # 부모 클래스(nn.Module)의 생성자 호출
# 첫 번째 합성곱 층 (Conv2d)
# 입력 채널: 1 (예: 흑백 이미지), 출력 채널: 32, 커널 크기: 3x3, 패딩: 1
self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1)
# 두 번째 합성곱 층 (Conv2d)
# 입력 채널: 32, 출력 채널: 64, 커널 크기: 3x3, 패딩: 1
self.conv2 = nn.Conv2d(in_channels=32, out_channels=64, kernel_size=3, padding=1)
# 최대 풀링 층 (MaxPool2d)
# 커널 크기: 2x2, 스트라이드: 2 (특징맵 크기를 절반으로 축소)
self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
# 완전 연결 층 (Fully Connected Layer)
# 입력 크기: 64채널 * 14x14 (입력 이미지 크기 28x28 기준, 풀링 적용 후 크기 계산)
self.fc1 = nn.Linear(in_features=64 * 14 * 14, out_features=128)
# 출력층 (Fully Connected Layer)
# 입력 크기: 128, 출력 크기: 10 (예: 10개의 클래스 분류)
self.fc2 = nn.Linear(in_features=128, out_features=10)
# 순전파(Forward) 연산 정의
def forward(self, x):
# 첫 번째 합성곱 연산 -> ReLU 활성화 함수 -> 최대 풀링
x = self.pool(F.relu(self.conv1(x)))
# 두 번째 합성곱 연산 -> ReLU 활성화 함수 -> 최대 풀링
x = self.pool(F.relu(self.conv2(x)))
# 텐서의 형태를 변경 (Flatten)
# (배치 크기, 64 * 14 * 14) 형태로 변환하여 완전 연결층에 입력할 수 있도록 함
x = x.view(-1, 64 * 14 * 14)
# 첫 번째 완전 연결층 -> ReLU 활성화 함수
x = F.relu(self.fc1(x))
# 출력층 (Softmax는 사용하지 않음, 분류 문제에서는 CrossEntropyLoss를 적용할 때 내부적으로 Softmax 사용)
x = self.fc2(x)
return x # 최종 출력값 반환
# 모델 인스턴스 생성
model = SimpleCNN()
# 모델 구조 출력
print(model)
설명 요약
- 합성곱(Convolution) 층: 이미지의 특징을 추출하는 계층.
- ReLU 활성화 함수: 비선형성을 추가하여 모델이 더 복잡한 패턴을 학습하도록 함.
- 최대 풀링(Max Pooling): 이미지의 크기를 줄여 계산량을 감소시키고 중요한 특징만 남김.
- 완전 연결층(Fully Connected Layer): 추출된 특징을 기반으로 최종 분류 수행.
- Flatten 과정: 합성곱 층에서 나온 특징 맵을 1차원 벡터로 변환하여 완전 연결층에 입력.
이 모델은 기본적인 CNN 구조로, 주로 MNIST, CIFAR-10과 같은 이미지 분류 작업에 사용될 수 있습니다.
반응형