매직코드
article thumbnail
1. 라이브러리
# 필요한 라이브러리 불러오기
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from tensorflow import keras

tf.random.set_seed(777)  # for reproducibility
print(tf.__version__)

 

 

2. 데이터 확인
fashion = tf.keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion.load_data()

class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat',
               'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']

keras에서 제공하는 fashion_mnist 데이터를 변수 fashion에 저장했다.

 

fashion_mnist 데이터를 train/test와 images/labels로 나눠주었다

 

class_names는 label값인데 실제 fashion_mnist에는 label값이 숫자 0~9로 입력이 되어있다.

케라스에서 데이터를 제공할 때 실제 데이터 값은 0~9 숫자로 되어있지만 각 숫자에 해당하는 값이 무엇인지를 알려줬다.

0번은 T-shirt/top, 1번은 Trouser, 2번은 Pullover, 3번은 Dress...이렇기 때문에 우리가 모델링 이후 잘 분류했는지 직관적으로 확인할 수 있도록 각 번호에 맞게 class_names에 이름을 넣어준다.

 

plt.figure()
plt.imshow(train_images[3]) # train_images[]숫자를 변경하여 이미지 확인
plt.colorbar()
plt.grid(False)

train_imagesdml 4번째 이미지 확인

데이터를 불러왔으니 이미지로 확인을 해봤다.

이미지를 확인하기 위해서는 imshow()라는 명령어가 필요하다.

 

3. 이미지 정규화
train_images = train_images / 255.0 #(60000, 28, 28)
test_images = test_images / 255.0 #(10000, 28, 28)

이미지는 RGB를 통해 색상표현이 가능한데, 각각 0~255로 표현이 된다.

이 값들을 0~1 사이의 값들로 변환시켜주는 정규화를 하기 위해서 train_images와 test_images에서 각각 나누기 255를 해줬다.

 

이미지 정규화

 

 

plt.figure(figsize=(10,10))
for i in range(25):
    plt.subplot(5,5,i+1)
    plt.xticks([])
    plt.yticks([])
    plt.grid(False)
    plt.imshow(train_images[i], cmap=plt.cm.binary)
    plt.xlabel(class_names[train_labels[i]])

정규화 된 이미지들을 25개 정도만 불러와서 어떻게 나타나는지 확인해봤다.

한번에 여러개의 이미지를 불러오기 위해서 subplot을 이용했다.

 

25개의 이미지 미리 확인

 

 

4. 모델 생성, 학습, 성능 확인
# 모델 생성
model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.softmax)
])

첫번째로 Flatten을 이용해서 28*28 형태의 데이터를 펴준다.

이후 layer에서는 ReLU를 한번 적용해줬다.

이 데이터의 경우 label 개수가 10개 이기 때문에 마지막 층에서 10개로 출력할 수 있도록 했고,

이 때 사용하는 activation은 softmax함수다.

왜 소프트맥스가 사용되는지 모르는 사람은 아래 포스팅을 참고하길 바란다.

[코드] 소프트맥스 회귀 (Softmax Regression) 다중 클래스 분류 실습.쥬피터

 

[코드] 소프트맥스 회귀 (Softmax Regression) 다중 클래스 분류 실습.쥬피터

소프트맥스 우리는 무언가를 분류할 때 맞다 아니다(True/False)만 분류하는 것이 아니라 상, 중, 하로 분류하기도 하고 동물의 사진을 보고 강아지, 고양이, 토끼, 앵무새 등으로 분류하기도 한다.

magicode.tistory.com

 

# 모델 학습
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
model.fit(train_images, train_labels, epochs=20)

compile을 통해 이 모델에 어떤 optimizer를 적용할지 정해주고 내가 확인하고 싶은 loss와 metrics를 설정해준다.

fit을 통해 학습시켜준다.

 

epochs는 반복 횟수를 의미하는데 반복을 하다보면 로스값이 점점 0에 가까워지고 추후에는 early stop이라는 개념을 통해 많은 반복횟수 중에서 더이상 로스가 떨어지지 않는 경우 반복을 중지하라는 명령을 내릴수도 있다.

지금은 간단하게 20번만 진행해봤다.

 

혹시 모델 학습을 다시 진행하고 싶다면 실행코드는 모델 생성부터 다시 진행해야한다.

모델 학습만 다시 진행하면 이미 학습이 진행된 모델에 또 학습을시키는 경우가 되어버리기 때문이다.

첫번째 두번째에서는 로스도 0.5, 0.37로 그 값이 크고, 정확도는 0.82, 0.86으로 작은 반면 학습을 시킬수록 로그는 떨어지고 정확도는 올라서 마지막 20번째에서는 로스가 0.18, 정확도는 0.93인것을 확인할 수 있다. 더 많은 학습을 시키면 더 좋은 성능을 낼 수 있다.

 

# 모델 적용(예측)
test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)

마지막으로 만들어진 모델에 test 데이터를 넣어서 얼마나 잘 예측하는지 확인해봤다.

테스트 데이터를 넣었을 때의 정확도는 0.8799가 나왔다.

 

 

 

 

profile

매직코드

@개발법사

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!