Notice
Recent Posts
Recent Comments
Link
«   2026/05   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
Tags
more
Archives
Today
Total
관리 메뉴

bonggyulim 님의 블로그

딥러닝 - CNN 본문

AI dev/Deep Learning

딥러닝 - CNN

bonggyulim 2026. 4. 7. 13:44

CNN이란

CNN(Convolutional Neural Network)은 이미지처럼 가로·세로 형태를 가진 데이터를 처리하는 데 강한 딥러닝 모델이다.
일반적인 신경망은 이미지를 1차원으로 펼쳐서 처리하지만, CNN은 이미지의 공간적 특징을 유지한 채 학습한다.

그래서 CNN은 다음과 같은 문제에서 많이 사용된다.

  • 손글씨 숫자 분류
  • 얼굴 이미지 분류
  • 동물/사물 이미지 분류
  • 의료 영상 분석

입력 이미지 → Convolution → ReLU → Pooling → 특징 추출 반복 → Flatten → Dense Layer → 출력


CNN의 동작 과정

1. Convolution

필터(커널)를 이미지 위로 이동시키며 특징(선, 모서리, 곡선)을 추출한다.

2. ReLU

음수 값을 0으로 바꾸는 활성화 함수다.
비선형성을 추가해 더 복잡한 패턴을 학습할 수 있게 만든다.

3. Pooling

특징맵의 크기를 줄여 계산량을 낮추고, 중요한 정보만 남긴다.
주로 MaxPooling을 많이 사용한다.

4. Flatten

2차원 특징맵을 1차원 벡터로 펼친다.

5. Dense Layer

추출한 특징을 종합해서 최종 클래스를 예측한다.


MNIST 예제

import tensorflow as tf
from tensorflow.keras import layers, models

# 1. MNIST 데이터 불러오기
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()

# 2. 정규화
x_train = x_train / 255.0
x_test = x_test / 255.0

# 3. CNN 입력 형태 맞추기
# (batch, height, width, channel)
x_train = x_train[..., tf.newaxis]
x_test = x_test[..., tf.newaxis]

# 4. CNN 모델 구성
model = models.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),

    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),

    layers.Flatten(),
    layers.Dense(128, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# 5. 모델 컴파일
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# 6. 학습
model.fit(x_train, y_train, epochs=5, batch_size=64, validation_split=0.1)

# 7. 평가
test_loss, test_acc = model.evaluate(x_test, y_test)
print("Test Accuracy:", test_acc)

CNN에서 주의할 점

1) CNN은 보통 4차원의 입력을 받는다

  • (batch, height, width, channel)

2) 정규화를 해야 학습이 안정적이다

  • x_train = x_train / 255.0, x_test = x_test / 255.0

3) 출력층과 loss 함수가 맞아야 한다

  • 라벨이 0,1,2,3... 같은 정수면 → sparse_categorical_crossentropy
  • 라벨이 [0,0,1,0,...] 같은 원-핫이면 → categorical_crossentropy

4) 과적합 주의

  • Dropout 추가
  • 데이터 증강(Data Augmentation)
  • Epoch 너무 크게 잡지 않기

5) Pooling을 너무 많이 하면 정보가 사라진다


'AI dev > Deep Learning' 카테고리의 다른 글

딥러닝 - RNN  (0) 2026.04.07
딥러닝의 기본 개념 정리  (0) 2026.04.06