728x90
반응형
컴퓨터 비전 에서의 CNN 은 다양한 예제가 존재하지만 이번 포스팅에서는 TensorFlow/Keras 라이브러리를 사용하여 Python으로 컨볼루션 신경망(CNN)을 만드는 예제를 보여드리겠습니다. 이 예제에서는 널리 사용되는 손으로 쓴 숫자로 구성된 MNIST 데이터 세트를 사용합니다.
1단계 : 필요 모듈 불러오기 & 데이터 세트 불러 오기
첫번째 로 필요모듈 Import 하고 데이터세트 load 하는 단계입니다.
#모듈 import
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
# MNIST 데이터 세트 로드
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
# 픽셀 값을 0 에서 1 사이로 정규화 합니다.
train_images, test_images = train_images / 255.0, test_images / 255.0
# 모델에 맞게 데이터 집합 재구성 합니다.
train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))
# One-hot encode 라벨링 합니다.
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)
2단계 : CNN 모델 만들기
tensorflow 의 핵심인 CNN 모델을 만드는 단계 입니다.
from tensorflow.keras import layers
from tensorflow.keras import models
# 모델 오브젝트 초기화
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()) # 레이어를 Flatten 하게 하여 이미지의 형식을 2D 배열(28×28픽셀)에서 28×28픽셀의 1D 배열(28=784픽셀)로 변환합니다.
model.add(layers.Dense(64, activation='relu')) # 첫번째 Dense 레이어
model.add(layers.Dense(10, activation='softmax')) # 출력 레이어
3단계 : 모델 컴파일 하고 손실함수, 옵티마이저 및 메트릭 정의하기
이번 단계는 모델 컴파일 및 loss, optimizer , metrics 를 정의 하는 단계 입니다.
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
4단계 : 모델 학습 하기
이번단계는 모델 학습하는 단계입니다. 앞에서 설정한 학습데이터와 라벨링한 데이터,
에폭시 와 배치사이즈를 설정합니다.
model.fit(train_images, train_labels, epochs=5, batch_size=64)
5단계 : 모델 평가 하기
이번단계는 학습한 모델을 평가 하는 단계입니다.
결과확인 :
import numpy as np
import matplotlib.pyplot as plt
# 테스트 세트에서 이미지를 선택합니다(인덱스를 0에서 9999 사이의 숫자로 바꿀 수 있습니다).
image_index = 5
image = test_images[image_index]
# 이미지 표시
plt.imshow(np.squeeze(image), cmap='gray')
plt.show()
# 모델에 사용할 이미지 준비
image = np.expand_dims(image, axis=0)
# 모델을 사용하여 예측하기
prediction = model.predict(image)
# 예측 클래스(숫자) 가져오기
predicted_digit = np.argmax(prediction)
# 예측 클래스(숫자) 인쇄
print("예측된 숫자 :", predicted_digit)
평가 :
test_loss, test_acc = model.evaluate(test_images, test_labels)
print('Test loss:', test_loss)
print('Test accuracy:', test_acc)
반응형