Python DeepLearning

CNN(Convolutional Neural Network)의 개념 및 동작 원리

PyExplorer 2025. 4. 16. 14:02
728x90

CNN(Convolutional Neural Network)의 개념 및 동작 원리

1. 개요

CNN(Convolutional Neural Network, 합성곱 신경망)은 이미지 및 영상 데이터를 다룰 때 주로 사용되는 신경망 모델입니다. 인간의 시각 피질(Visual Cortex)에서 영감을 받아 개발된 CNN은 이미지 내에서 특징을 자동으로 추출하여 분석하는 데 매우 효과적입니다. 기존의 완전 연결 신경망(FC, Fully Connected Layer)보다 학습해야 할 가중치의 수를 줄이고, 공간적 구조를 고려한 학습이 가능하기 때문에 컴퓨터 비전 분야에서 가장 많이 활용됩니다.

이 글에서는 CNN의 기본 개념과 동작 원리를 살펴보고, 주요 구성 요소 및 동작 방식에 대해 설명하겠습니다. 또한, 간단한 CNN 모델을 구현하는 예제 코드도 포함하여 실습할 수 있도록 하겠습니다.


2. CNN의 기본 개념

CNN은 일반적으로 다음과 같은 주요 계층으로 구성됩니다:

  1. 입력 레이어(Input Layer): 이미지 데이터를 입력받는 계층입니다.
  2. 합성곱 레이어(Convolutional Layer): 이미지의 특징을 추출하는 계층입니다.
  3. 활성화 함수(Activation Function): 비선형성을 추가하여 복잡한 패턴을 학습할 수 있도록 하는 역할을 합니다.
  4. 풀링 레이어(Pooling Layer): 특징 맵을 축소하여 연산량을 줄이고 중요한 특징을 유지하는 역할을 합니다.
  5. 완전 연결 레이어(Fully Connected Layer, FC): CNN의 최종 출력 값을 생성하는 계층입니다.

각 계층의 역할을 자세히 알아보겠습니다.


3. CNN의 주요 구성 요소 및 동작 원리

3.1. 합성곱 레이어(Convolutional Layer)

CNN의 핵심은 합성곱 연산(Convolution Operation)입니다. 합성곱 연산을 통해 입력 데이터에서 중요한 특징을 추출할 수 있습니다. 합성곱 연산의 기본 개념은 작은 필터(커널, Kernel)를 사용하여 이미지의 특정 영역과 곱셈 연산을 수행한 후, 그 값을 더하여 특징 맵(Feature Map)을 생성하는 것입니다.

합성곱 연산 공식:

$$
Y(i, j) = \sum_{m}\sum_{n} X(i+m, j+n) \cdot K(m, n)
$$

여기서:

  • $ X $ : 입력 데이터 (이미지)
  • $ K $ : 커널(필터)
  • $ Y $ : 출력 특징 맵

아래는 간단한 예제입니다.

import torch
import torch.nn as nn
import torch.nn.functional as F

# 입력 데이터 (3x3 이미지)
x = torch.tensor([[1.0, 2.0, 3.0],
                  [4.0, 5.0, 6.0],
                  [7.0, 8.0, 9.0]])

# 2x2 커널 정의
kernel = torch.tensor([[1.0, 0.0],
                       [0.0, -1.0]])

# 합성곱 연산 수행
output = F.conv2d(x.unsqueeze(0).unsqueeze(0), kernel.unsqueeze(0).unsqueeze(0))
print(output)

3.2. 활성화 함수(Activation Function)

CNN에서는 주로 ReLU(Rectified Linear Unit) 활성화 함수를 사용합니다. ReLU 함수는 음수를 0으로 변환하고, 양수는 그대로 유지하는 함수입니다.

ReLU 공식:

$$
f(x) = \max(0, x)
$$

ReLU는 계산이 간단하며, 기울기 소실(Vanishing Gradient) 문제를 완화하는 데 도움을 줍니다.

def relu(x):
    return max(0, x)

3.3. 풀링 레이어(Pooling Layer)

풀링(Pooling) 연산은 특징 맵의 크기를 줄여 연산량을 감소시키고, 중요한 정보만을 남기는 역할을 합니다. 대표적인 방법으로는 최대 풀링(Max Pooling)평균 풀링(Average Pooling) 이 있습니다.

최대 풀링 예제:

import torch.nn.functional as F

x = torch.tensor([[[[1.0, 2.0, 3.0, 4.0],
                    [5.0, 6.0, 7.0, 8.0],
                    [9.0, 10.0, 11.0, 12.0],
                    [13.0, 14.0, 15.0, 16.0]]]])

# 2x2 크기의 최대 풀링 적용
output = F.max_pool2d(x, kernel_size=2)
print(output)

3.4. 완전 연결 레이어(Fully Connected Layer)

마지막으로 CNN의 출력은 완전 연결층(FC Layer)을 거쳐 최종적인 예측 결과를 도출합니다. CNN의 앞부분에서 추출된 특징들은 FC 레이어를 통해 학습되어 분류 등의 작업을 수행할 수 있습니다.


4. 간단한 CNN 모델 구현

이제 간단한 CNN 모델을 PyTorch를 이용하여 구현해보겠습니다.

import torch
import torch.nn as nn
import torch.optim as optim

class SimpleCNN(nn.Module):
    def __init__(self):
        super(SimpleCNN, self).__init__()
        self.conv1 = nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, padding=1)
        self.relu = nn.ReLU()
        self.pool = nn.MaxPool2d(kernel_size=2, stride=2)
        self.fc1 = nn.Linear(32 * 14 * 14, 10)  # MNIST 예제 기준

    def forward(self, x):
        x = self.conv1(x)
        x = self.relu(x)
        x = self.pool(x)
        x = x.view(x.size(0), -1)
        x = self.fc1(x)
        return x

# 모델 생성
model = SimpleCNN()
print(model)

5. 결론

CNN은 이미지 처리에서 가장 많이 활용되는 신경망 모델로, 합성곱 연산을 통해 특징을 추출하고, 풀링 레이어를 통해 데이터를 축소하여 학습 효율을 높입니다. 본 포스팅에서는 CNN의 기본 개념과 주요 구성 요소를 살펴보고, PyTorch를 이용한 간단한 CNN 모델을 구현해보았습니다. 이를 바탕으로 다양한 이미지 처리 및 분류 문제를 해결하는 데 활용할 수 있습니다.

728x90