본문 바로가기
AI/인공지능(CNN)

[인공지능] 딥러닝 핵심 : CNN(Convolution Neural Network)

by Yoon_estar 2025. 10. 28.
728x90
반응형

이미지 처리 분야에서 혁명적인 성능을 보여주는 CNN(Convolutional Neural Network, 합성곱 신경망)에 대해 깊이 있게 알아보겠습니다. CNN은 기존의 신경망이 이미지의 공간 정보를 손실하던 한계를 극복하고, 이미지의 특징을 효과적으로 학습하는 딥러닝 모델입니다. 

 

개요

CNN은 이미지와 같은 격자형(Grid-like) 데이터를 처리하는 데 특화된 딥러닝 모델입니다. 사진 데이터를 일반적인 Fully Connected Neural Network(완결 연결 신경망)에 바로 입력하면 3차원(가로, 세로, 채널) 데이터를 1차원으로 Flatten(평면화) 해야하는데, 이 과정에서 이미지의 중요한 공간 정보(Spatial Information)가 손실되어 학습의 정확도에 한계가 생깁니다. 

 

CNN은 이러한 문제를 해결하기 위해 합성곱(Convolution)연산을 사용하여 이미지의 공간 정보를 유지하면서 특징(Feature)을 추출하고 학습할 수 있도록 설계되었습니다.


핵심 구성 요소

 

CNN 모델은 크게 특징 학습(Feature Learning) 부분과 분류(Classification) 부분으로 나뉩니다. 

구성 요소 역할 핵심 용어
특징 학습(Feature Learning) 이미지의 저차원/고차원 특징을 추출합니다.  Convolutional Layer, Pooling Layer
분류(Classification) 추출된 특징을 기반으로 최종 클래스를 분류합니다.  Flatten Layer, Fully Connected Layer

 

주요 용어 개념

용어 실제 의미 IT/CNN 개념
Convolution 말아올리다, 겹치다 작은 필터(커널)를 입력 데이터에 순차적으로 적용하여 특징을 추출하는 연산
Layer(계층) 층, 겹 신경망을 구성하는 뉴련 그룹의 단계, 특정 연산을 수행함
Filter Kernel(필터/커널) 거르는 도구 합성곱 연산에 사용되는 작은 행렬, 이미지의 특정 패턴(선, 모서리 등)을 감지하는 역할
학습 과정을 통해 가중치가 조정됨
Feature Map(특징맵) - 컨볼루션 레이어의 출력 결과, 필터가 이미지에서 추출한 특징을 나타냄
Pooling(풀링) 모으다, 합치다 특징 맵의 크기를 줄여 연산량을 감소시키고 일반화 성능을 높이는 다운 샘플링 과정
Flatten(평면화) 납작하게 하다 특징 학습부의 다차원 출력을 완전 연결 계층에 입력하기 위해 1차원 벡터로 변환하는 과정

 

CNN 계층별 상세 설명

계층 이름 역할 종류/특징
Convolution Layer(합성곱 계층) 입력 데이터에 필터를 적용하고, 활성화 함수(ReLU)를 반영하여 특징을 추출합니다. 
이미지의 중요한 패턴을 감지하며, CNN의 핵심 계층입니다. 
Stride(필터 이동 간격), Padding(경계 처리) 설정을 통해 출력 크기 조절 가능
Pooling Layer(풀링 계층) 특징 맵을 다운 샘플링하여 연산량을 줄이고 모델의 일반화 성능을 높이는 선택적 계층 Max Pooling : 지정 영역에서 최댓값 선택(특징 강조) 
Average Pooling : 지정 영역의 평균값 계산(특징 맵 부드럽게)
Flatten Layer(평면화 계층) 특징맵(3D)을 완전 연결 계층(1D 입력 필요)에 연결하기 위해 1차원 배열로 변환합니다.  특징 학습과 분류 사이를 이어주는 연결 고리
Fully Connected Layer(완전 연결 계층) 추출된 특징(1D 벡터)을 기반으로 최종 분류를 수행합니다. 
모든 뉴런이 서로 연결된 구조를 가집니다. 
Classification 부준의 핵심

 


CNN의 사용 이유 및 필요성

구분 설명
공간적 구조 유지 이미지와 같은 2D 데이터의 공간적 구조를 유지하여 특징을 효과적으로 추출합니다. (Flattening의 문제 해결)
특징 추출 자동화 필터(커널)를 사용해 자동으로 중요한 특징을 학습하고 추출합니다.(별도의 특징 엔지니어링 불필요)
파라미터 효율성 지역 연결(Local Connectivity)과 가중치 공유(Weight Sharing)를 통해 파라미터(학습 가능한 가중치) 수를 획기적으로 줄여 계산 효율성을 높입니다. 
우수한 성능 이미지 분류, 객체 탐지 등 시각 데이터 처리에서 뛰어난 성능을 발휘합니다.

 

언제 사용 하는가?

이미지, 비디오, 음성 파형 등 격자형 구조를 가진 데이터의 패턴 및 분류 문제에 주로 사용됩니다. 

  • 이미지 분류(고양이/강아지 구별, 질병 진단 이미지 분석)
  • 객체 탐지(사진 속 사람/자동차 위치 파악)
  • 시멘틱 분할(이미지의 모든 픽셀을 분류)

CNN에서 채널(Channel)의 의미

채널은 CNN에서 데이터의 총(Layer)을 의미하며, 레이어의 위치에 따라 그 의미가 달라집니다. 

위치 채널 수 의미
입력 이미지 3(RGB) 이미지의 색상 정보
합성곱 계층 출력 32, 64, 128 ... 필터(커널)의 개수를 의미하며 필터마다 새로운 특징맵(Feature Map)을 생성합니다. 

 

즉 , CNN의 깊은 층으로 갈수록 채널 수가 32, 64, 128처럼 커지는 것은 더 많은 종류의 추사오하된 특징을 추출하고 있다는 것을 나타냅니다. 

  • 32 채널 : 기본적인 패턴(선, 모서리, 밝기 대비 등)
  • 64 채널 : 복잡한 질감이나 영역 정보
  • 128 채널 이상 : 물체의 구성 요소 같은 고차원적 특징

작동 원리(Convolutional Layer)

  1. 필터(커널) 적용 : 작은 $N \times N$ 크기의 필터가 입력 이미지의 특정 영역에 순차적으로 슬라이딩하며(Stride) 적용됩니다. 
  2. 합성곱 연산 : 필터와 이미지 영역의 원소별 곱셈 후 합을 계산합니다. (Bias 추가)
  3. 활성화 함수 : 계산된 결과에 ReLU 등 활성화 함수를 적용합니다. 
  4. 특징 맵 생성 : 이 과정을 통해 특징 맵(Feature Map)이 생성됩니다. 

Keras를 이용한 CNN 예시 코드

아래는 기본적인 CNN 모델을 구성하는 예시 코드로, 이미지의 특징을 단계적으로 추출하고 분류하는 과정을 보여줍니다. 

예시 코드 1

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Conv2D, MaxPooling2D, Flatten, Dense
from tensorflow.keras.utils import to_categorical
import numpy as np

# 가상 데이터셋 생성
num_classes = 10
input_shape = (32, 32, 3)

x_train = np.random.random((1000, 32, 32, 3))
y_train = np.random.randint(num_classes, size=(1000, 1))

x_test = np.random.random((200, 32, 32, 3))
y_test = np.random.randint(num_classes, size=(200, 1))

# 원-핫 인코딩
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)

# 모델 정의
model = Sequential()
model.add(Input(shape=input_shape))
model.add(Conv2D(32, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Conv2D(128, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(Flatten())
model.add(Dense(256, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

# 손실 함수 및 옵티마이저 정의
model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

# 모델 훈련
model.fit(x_train, y_train, epochs=10, batch_size=64, validation_split=0.1)

# 모델 평가 
loss, accuracy = model.evaluate(x_test, y_test)
print(f"Test loss: {loss}")
print(f"Test accuracy: {accuracy}")

 

예시 코드 2

import tensorflow as tf
from tensorflow.keras import layers, models, optimizers
import numpy as np

# 가상 데이터 생성 (CIFAR-10 유사, 32x32 크기의 컬러 이미지, 10개의 클래스)
num_samples = 10000  # 데이터셋 크기
input_channels = 3
input_height = 32
input_width = 32
num_classes = 10

# 가상 이미지 데이터 생성
X = np.random.rand(num_samples, input_height, input_width, input_channels).astype(np.float32)
# 가상 레이블 데이터 생성
y = np.random.randint(num_classes, size=num_samples)

# 데이터셋을 훈련/검증 데이터로 나누기
train_size = int(0.8 * len(X))
val_size = len(X) - train_size
X_train, X_val = X[:train_size], X[train_size:]
y_train, y_val = y[:train_size], y[train_size:]

# 데이터셋을 TensorFlow 데이터셋으로 변환
train_dataset = tf.data.Dataset.from_tensor_slices((X_train, y_train)).shuffle(train_size).batch(32)
val_dataset = tf.data.Dataset.from_tensor_slices((X_val, y_val)).batch(32)

# 모델 정의
model = models.Sequential([
    layers.Input(shape=(32, 32, 3)),
    layers.Conv2D(32, (3, 3), activation='relu', padding='same'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu', padding='same'),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(512, activation='relu'),
    layers.Dense(10)
])

model.summary()

 

# 손실 함수 및 옵티마이저 정의
model.compile(
    optimizer=optimizers.Adam(learning_rate=0.001),
    loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
    metrics=['accuracy']
)

# 모델 평가
val_loss, val_accuracy = model.evaluate(val_dataset)
print(f"Validation Accuracy: {val_accuracy:.2f}%")

# 모델 예측
sample_input = X[:5]
predictions = model.predict(sample_input)
print("Predictions: ", predictions)
print("True labels: ", y[:5])

 


특징

  • 계층적 특징 학습 : 초기 층에서는 단순한 특징(선, 모서리)을 학습하고, 깊은 층에서는 복잡한 특징(물체의 부준, 패턴)을 학습합니다. 
  • 병진 불변성(Translation Invariance) : 풀링 덕분에 물체가 이미지 내에서 약간 이동해도 동일한 특징으로 인식하는 능력(일반화 성능)이 뛰어납니다. 

장단점

장점 단점
높은 정확도 : 이미지/시계열 데이터에서 탁월한 성능 높은 연산량 : 특히 훈련 시 다수의 필터 연산으로 인해 높은 계산 리소스(GPU) 요구
파라미터 공유 : 효율적인 메모리 및 계산 사용 많은 데이터 필요 : 복잡한 구조를 학습하기 위해 대규모 데이터셋이 필요함
공간 정보 보존 : 2D 구조를 직접 처리하여 정보 손실 최소화 느린 추론 속도 : 모바일이나 엣지 환경에서 실시간 사용에 제약이 있을 수 있음

결론

CNN은 이미지 인식 분야의 혁신을 이끈 핵심 기술입니다. Convolution Layer를 통해 이미지의 공간 정보를 보존하며 계층적으로 특징을 추출하고 Pooling Layer로 효율성을 높이며, Fully Connected Layer로 최종 분류를 수행합니다. 

 

이미지나 시계열 데이터와 같이 지역적 패턴이 중요한 모든 문제에 CNN은 강력한 해결책을 제공하며, 딥러닝 엔지니어링의 필수적인 지식으로 자리 잡았습니다. 

반응형