CNN
Convolutional Neural Network
합성곱 신경망. 이미지 인식에 특화. 컨볼루션, 풀링 레이어로 구성. ResNet, VGG가 대표적.
Convolutional Neural Network
합성곱 신경망. 이미지 인식에 특화. 컨볼루션, 풀링 레이어로 구성. ResNet, VGG가 대표적.
CNN(Convolutional Neural Network, 합성곱 신경망)은 이미지, 비디오, 음성 등 격자 형태의 데이터를 처리하기 위해 설계된 딥러닝 아키텍처입니다. 1998년 Yann LeCun이 손글씨 숫자 인식을 위해 개발한 LeNet-5가 CNN의 시초이며, 2012년 AlexNet이 ImageNet 대회에서 압도적인 성능을 보이며 딥러닝 혁명을 촉발했습니다.
CNN의 핵심은 합성곱 연산(Convolution)입니다. 작은 필터(커널)가 입력 이미지를 슬라이딩하며 특징을 추출하고, 이 과정에서 에지, 텍스처, 패턴 같은 시각적 특성을 계층적으로 학습합니다. 풀링 레이어는 공간 크기를 줄여 계산량을 감소시키고 위치 불변성을 제공합니다.
초기 레이어에서는 에지나 색상 같은 저수준 특징을, 깊은 레이어에서는 눈, 코, 자동차 바퀴 같은 고수준 특징을 학습합니다. 이러한 계층적 특징 추출 덕분에 CNN은 이미지 분류, 객체 탐지, 세그멘테이션 등 다양한 컴퓨터 비전 작업에서 뛰어난 성능을 보입니다.
실무에서 CNN은 ResNet, VGG, EfficientNet 같은 사전 학습된 모델을 전이 학습(Transfer Learning)하여 사용합니다. ImageNet으로 학습된 가중치를 활용하면 적은 데이터로도 높은 정확도를 달성할 수 있어, 의료 영상 분석, 자율주행, 제조업 품질 검사 등에 폭넓게 적용됩니다.
# PyTorch로 간단한 CNN 구현
import torch
import torch.nn as nn
import torch.nn.functional as F
class SimpleCNN(nn.Module):
def __init__(self, num_classes=10):
super(SimpleCNN, self).__init__()
# 합성곱 레이어
self.conv1 = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.conv2 = nn.Conv2d(32, 64, kernel_size=3, padding=1)
self.conv3 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
# 풀링 레이어
self.pool = nn.MaxPool2d(2, 2)
# 완전 연결 레이어
self.fc1 = nn.Linear(128 * 4 * 4, 512)
self.fc2 = nn.Linear(512, num_classes)
self.dropout = nn.Dropout(0.5)
def forward(self, x):
# Conv Block 1: 32x32 -> 16x16
x = self.pool(F.relu(self.conv1(x)))
# Conv Block 2: 16x16 -> 8x8
x = self.pool(F.relu(self.conv2(x)))
# Conv Block 3: 8x8 -> 4x4
x = self.pool(F.relu(self.conv3(x)))
# Flatten
x = x.view(-1, 128 * 4 * 4)
# Fully Connected
x = F.relu(self.fc1(x))
x = self.dropout(x)
x = self.fc2(x)
return x
# 모델 생성 및 추론
model = SimpleCNN(num_classes=10)
sample_input = torch.randn(1, 3, 32, 32) # 배치, 채널, 높이, 너비
output = model(sample_input)
print(f"출력 shape: {output.shape}") # torch.Size([1, 10])
"불량 검출 모델은 ResNet-50을 백본으로 쓰고, 마지막 FC 레이어만 우리 클래스 수에 맞게 교체해서 fine-tuning하면 됩니다. ImageNet pretrained 가중치를 쓰면 학습 시간이 80% 이상 단축됩니다."
"CNN에서 풀링 레이어의 역할은 세 가지입니다. 첫째, 특징 맵 크기를 줄여 계산량을 감소시킵니다. 둘째, 위치 불변성을 제공해 객체가 약간 이동해도 같은 특징으로 인식합니다. 셋째, 과적합을 방지하는 정규화 효과가 있습니다."
"BatchNorm을 Conv 레이어 뒤에 추가해주세요. 학습 속도가 빨라지고 수렴도 안정적이에요. 그리고 작은 커널(3x3)을 여러 번 쌓는 게 큰 커널(7x7) 한 번보다 파라미터 효율이 좋습니다."
사전 학습된 모델은 특정 입력 크기(224x224, 299x299 등)를 기대합니다. 다른 크기의 이미지를 입력하면 FC 레이어에서 차원 불일치 에러가 발생하므로 반드시 리사이징이 필요합니다.
배치 크기가 크면 GPU 메모리 초과(OOM) 오류가 발생합니다. 고해상도 이미지나 깊은 네트워크를 사용할 때는 배치 크기를 줄이거나 gradient checkpointing을 적용하세요.
CNN은 학습 데이터의 변형에 민감합니다. 회전, 플립, 크롭, 색상 변환 등의 데이터 증강 없이 학습하면 과적합 가능성이 높아지고 일반화 성능이 떨어집니다.