일상에 필요한 정보들/컴퓨터, IT관련

파이썬으로 딥러닝 기초 입문하기

불타는 신디 2025. 5. 18. 09:54
728x90
반응형

어느 따스한 토요일 오후, ‘지수’는 컴퓨터 앞에 앉아 깊은 숨을 내쉬었습니다.
“머신러닝까지는 해봤는데, 이제 인공신경망의 심장을 들여다보고 싶어!”
이렇게 시작된 오늘의 여정, **“파이썬으로 딥러닝 기초 입문하기”**를 함께 따라가 보겠습니다.


출처 : 구글 이미지

🧠 1. 딥러닝이란 무엇인가?

딥러닝(Deep Learning)은 뇌 신경망을 모방한 여러 층(Layer)의 인공신경망(Artificial Neural Network)을 쌓아 데이터의 복잡한 패턴을 학습하는 기술입니다.

  • 특징 추출의 자동화: 전통적 머신러닝은 사람이 특징을 설계해야 하지만, 딥러닝은 입력 데이터에서 유용한 특징을 스스로 찾아냅니다.
  • 다층 아키텍처: 입력층 → 은닉층(여러 개) → 출력층으로 구성되며, 층이 깊어질수록 추상화 레벨이 높아집니다.
  • 활용 분야: 이미지 인식, 자연어 처리, 음성 인식, 자율주행, 추천 시스템 등 무궁무진합니다.

지수의 깨달음
“딥러닝은 데이터의 원형을 다양한 관점에서 읽어내는, 일종의 ‘다채로운 해석가’ 같아요.”


⚙️ 2. 개발 환경 세팅

pip install tensorflow pandas matplotlib
import tensorflow as tf
from tensorflow.keras import layers, models
import pandas as pd
import matplotlib.pyplot as plt

# 한글 폰트 설정 (필요 시)
plt.rc('font', family='Malgun Gothic')
print("TensorFlow 버전:", tf.__version__)
  • TensorFlow 2.x의 Keras API를 활용하면, 간결한 코드로 신경망을 구현할 수 있어요.
  • 가상환경을 미리 만들어 두면, 라이브러리 충돌 없이 프로젝트 관리를 할 수 있습니다.

🌟 3. 예제 데이터셋: MNIST 숫자 이미지

초보자에게 가장 익숙한 데이터셋인 MNIST(손글씨 숫자 이미지)를 사용해 볼게요.

# MNIST 데이터 로드
mnist = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 픽셀 값을 0~1 사이로 스케일링
X_train, X_test = X_train / 255.0, X_test / 255.0

print("학습 샘플 수:", X_train.shape[0])
print("테스트 샘플 수:", X_test.shape[0])
  • 28×28 픽셀의 흑백 이미지 70,000장(학습 60,000장, 테스트 10,000장)
  • 픽셀 값 범위를 [0, 1]로 정규화하면 학습이 안정적입니다.

지수의 팁
“데이터 전처리는 모델 성능의 밑바탕! 정규화·정형화 과정에 소홀하면 학습이 불안정해질 수 있어요.”


출처 : 구글 이미지

🏗️ 4. 모델 설계: 간단한 신경망 구현

입력층 → 은닉층(128 뉴런, ReLU 활성화) → 출력층(10개 클래스, Softmax 활성화) 구조를 만들어 봅니다.

model = models.Sequential([
    layers.Flatten(input_shape=(28, 28)),       # 2D 이미지를 1D 벡터로 전개
    layers.Dense(128, activation='relu'),       # 은닉층
    layers.Dense(10, activation='softmax')      # 출력층
])

model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()
  • Flatten: 입력 이미지(28×28)를 784개의 1D 벡터로 바꿉니다.
  • Dense: 완전연결층(Fully Connected Layer)으로, 모든 입력 노드와 연결됩니다.
  • ReLU(Rectified Linear Unit): 은닉층에서 비선형성을 부여해 복잡한 패턴을 학습하도록 돕습니다.
  • Softmax: 출력값을 확률로 변환해, 각 클래스에 속할 확률을 예측합니다.

지수의 깨달음
“은닉층의 뉴런 수나 층 수가 모델의 ‘눈높이’를 결정하네요. 너무 작으면 단순, 너무 크면 과적합 위험!”


🚂 5. 모델 학습(Training)

history = model.fit(
    X_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.2
)
  • epochs: 전체 학습 데이터를 몇 번 반복 학습할지
  • batch_size: 한 번에 처리할 샘플 수
  • validation_split: 학습 중간 중간 성능을 평가할 검증 데이터 비율

📈 6. 학습 결과 시각화

훈련 과정에서의 손실(Loss)과 정확도(Accuracy) 변화를 그려봅시다.

epochs = range(1, len(history.history['loss']) + 1)

plt.figure(figsize=(12, 5))

# 손실 그래프
plt.subplot(1, 2, 1)
plt.plot(epochs, history.history['loss'], label='훈련 손실')
plt.plot(epochs, history.history['val_loss'], label='검증 손실')
plt.xlabel('Epoch')
plt.ylabel('Loss')
plt.legend()

# 정확도 그래프
plt.subplot(1, 2, 2)
plt.plot(epochs, history.history['accuracy'], label='훈련 정확도')
plt.plot(epochs, history.history['val_accuracy'], label='검증 정확도')
plt.xlabel('Epoch')
plt.ylabel('Accuracy')
plt.legend()

plt.tight_layout()
plt.show()
  • 훈련 손실이 감소하고 훈련 정확도가 증가하면, 모델이 학습하고 있다는 신호입니다.
  • 검증 손실/정확도도 함께 살펴, 과적합 여부를 판단합니다.

🔍 7. 모델 평가 및 예측

test_loss, test_acc = model.evaluate(X_test, y_test, verbose=2)
print(f"테스트 정확도: {test_acc:.4f}")

# 몇 개 샘플을 랜덤으로 예측
import numpy as np
idxs = np.random.choice(len(X_test), 5)

for idx in idxs:
    img = X_test[idx]
    label = y_test[idx]
    pred = np.argmax(model.predict(img.reshape(1, 28, 28)))
    print(f"실제: {label}, 예측: {pred}")
  • 테스트 세트에서의 정확도를 확인해, 모델의 일반화 성능을 평가합니다.
  • 몇 가지 샘플을 직접 출력해보면, 모델이 얼마나 잘 분류하는지 체감할 수 있어요.

지수의 팁
“예측 결과를 사람 눈으로 확인하면, 모델의 약점을 직관적으로 발견할 수 있습니다.”


✨ 8. 다음 단계 및 응용 아이디어

  1. 심층 신경망(Deep Neural Network): 은닉층을 2~3개 이상 늘려보기
  2. 컨볼루션 신경망(CNN): 이미지 전용 구조로, Conv2D·MaxPooling2D 활용
  3. 전이 학습(Transfer Learning): 이미 학습된 모델(ResNet, VGG)을 활용해 적은 데이터로도 높은 성능 달성
  4. 과적합 방지 기법: 드롭아웃(Dropout), 가중치 규제(L2 Regularization) 등

어느덧 해가 기울어갈 때, 지수는 모델의 예측 결과를 바라보며 미소 지었습니다.
“딥러닝의 세계는 끝없이 깊고 넓구나… 하지만 한 걸음씩 나아가면, 누구나 그 심장을 뛰게 할 수 있어!”

다음 포스팅에서는 “파이썬으로 심층 CNN 모델 구현하기”를 다룰 예정이니, 이미지 분류의 매력 속으로 함께 빠져봅시다! 🚀


728x90
반응형