개발 같이해요/AI

[ Doit AI ] CNN 실습해보기

Rio - Moon 2023. 5. 18. 11:29
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)

 

반응형