Python 기초

Python을 활용한 딥러닝 - TensorFlow와 Keras로 이미지 분류 모델 만들기

PyExplorer 2024. 12. 11. 08:52
728x90

Python을 활용한 딥러닝 - TensorFlow와 Keras로 이미지 분류 모델 만들기

딥러닝은 최근 몇 년 동안 많은 관심을 받으며 다양한 산업에 큰 변화를 가져왔습니다. 이미지 분류, 자연어 처리, 음성 인식 등에서 탁월한 성능을 보이며 그 중요성이 날로 커지고 있습니다. 오늘은 Python을 활용하여 딥러닝에 대한 기본적인 이해를 돕고, TensorFlow와 Keras를 사용해 간단한 이미지 분류 모델을 만들어 보겠습니다.

딥러닝이란?

딥러닝(Deep Learning)은 인공신경망(Artificial Neural Network)을 기반으로 한 기계 학습의 한 종류입니다. 인간의 뇌 구조와 유사한 여러 층(layer)을 통해 데이터를 학습하며, 복잡한 문제 해결에 매우 뛰어난 성능을 발휘합니다. 딥러닝은 기존의 머신러닝보다 더 깊은 층을 사용하여 데이터를 학습하며, 이는 더 많은 파라미터를 학습하고 비선형적인 관계를 잘 표현할 수 있게 합니다.

인공신경망의 기본 구조

딥러닝 모델은 기본적으로 입력층(Input Layer), 은닉층(Hidden Layer), 출력층(Output Layer)으로 구성되어 있습니다. 입력층에서는 데이터를 받아들이고, 은닉층에서는 복잡한 계산을 통해 특성을 추출하며, 출력층에서는 최종 예측 결과를 제공합니다. 각 층의 뉴런들은 활성화 함수(Activation Function)를 통해 비선형성을 부여받아 복잡한 패턴을 학습하게 됩니다.

TensorFlow와 Keras 소개

TensorFlow와 Keras는 딥러닝 모델을 만들고 학습시키는 데 가장 널리 사용되는 Python 라이브러리입니다.

  • TensorFlow: Google에서 개발한 오픈소스 딥러닝 라이브러리로, 대규모 데이터 처리 및 머신러닝을 쉽게 구현할 수 있도록 도와줍니다. 다양한 플랫폼에서 사용 가능하며 확장성이 뛰어납니다.
  • Keras: TensorFlow 위에서 동작하는 고수준의 API로, 간단하고 직관적인 코드로 딥러닝 모델을 설계하고 학습할 수 있도록 도와줍니다. 사용자 친화적인 인터페이스 덕분에 빠르게 프로토타입을 만들기에 좋습니다.

딥러닝 예제: 이미지 분류 모델 만들기

이제 TensorFlow와 Keras를 사용하여 간단한 이미지 분류 모델을 만들어 보겠습니다. 이번 예제에서는 대표적인 데이터셋인 MNIST를 사용하여 숫자를 분류하는 모델을 학습시킬 것입니다. MNIST 데이터셋은 손으로 쓴 숫자 이미지로 구성되어 있으며, 각 이미지의 크기는 28x28 픽셀입니다.

환경 설정

먼저 필요한 라이브러리를 설치하고 가져옵니다. 이 예제에서는 TensorFlow와 Keras를 사용하므로, Python 환경에서 다음 명령어로 설치합니다.

pip install tensorflow

이제 Python 코드를 작성해 보겠습니다.

import tensorflow as tf
from tensorflow.keras import datasets, layers, models
import matplotlib.pyplot as plt

데이터셋 로드 및 전처리

MNIST 데이터셋을 로드하고, 학습을 위해 데이터를 전처리합니다.

# MNIST 데이터셋 로드
(train_images, train_labels), (test_images, test_labels) = datasets.mnist.load_data()

# 데이터 정규화: 픽셀 값을 0~1 사이로 변환
train_images, test_images = train_images / 255.0, test_images / 255.0

# 이미지 형태 변경: (28, 28) -> (28, 28, 1)
train_images = train_images.reshape((train_images.shape[0], 28, 28, 1))
test_images = test_images.reshape((test_images.shape[0], 28, 28, 1))

모델 생성

다음으로, CNN(Convolutional Neural Network) 구조를 사용하여 모델을 생성합니다. CNN은 이미지와 같은 데이터에 특히 효과적입니다.

# CNN 모델 정의
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

# 완전 연결층 추가
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

모델 컴파일 및 학습

모델을 컴파일하고 학습시킵니다. 손실 함수로는 sparse_categorical_crossentropy를 사용하며, 옵티마이저로는 adam을 사용합니다.

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

# 모델 학습
model.fit(train_images, train_labels, epochs=5, validation_data=(test_images, test_labels))

모델 평가

테스트 데이터를 사용하여 모델의 성능을 평가합니다.

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

결과 시각화

모델의 예측 결과를 시각화해 보겠습니다. 몇 개의 테스트 이미지와 그 예측 결과를 출력해 봅시다.

# 테스트 이미지 중 일부를 예측
predictions = model.predict(test_images)

# 첫 5개 이미지와 예측 결과 시각화
plt.figure(figsize=(10, 10))
for i in range(5):
    plt.subplot(1, 5, i + 1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(test_images[i].reshape(28, 28), cmap=plt.cm.binary)
    plt.xlabel(f"예측: {tf.argmax(predictions[i]).numpy()}")
plt.show()

결론

오늘은 Python을 활용한 딥러닝 기초와 TensorFlow 및 Keras를 사용하여 간단한 이미지 분류 모델을 만들어 보았습니다. 딥러닝은 복잡한 문제를 해결하는 데 매우 강력한 도구이며, Python과 같은 접근성이 좋은 언어 덕분에 많은 사람들이 쉽게 학습하고 사용할 수 있게 되었습니다.

이 글을 통해 딥러닝의 기본적인 개념과 TensorFlow 및 Keras를 사용한 실습 과정을 이해하는 데 도움이 되었기를 바랍니다.