카테고리 없음

패션 mnist 예측 프로그램 만들기

sillon 2022. 6. 10. 00:48
728x90
반응형

출처: https://codetorial.net/tensorflow/fashion_mnist_classification.html

 

9. Fashion MNIST 이미지 분류하기 - Codetorial

Fashion MNIST 데이터셋은 위 그림과 같이 운동화, 셔츠, 샌들과 같은 작은 이미지들의 모음이며, 기본 MNIST 데이터셋과 같이 열 가지로 분류될 수 있는 28×28 픽셀의 이미지 70,000개로 이루어져 있습

codetorial.net

 

https://m.blog.naver.com/bananacco/221947423830

 

CNN 코드 실습 ② loss and accuracy curves 추가

CNN 모델을 이용한 이미지 분류 실습을 진행하겠습니다. 지난 실습에 이어 loss and accuracy curves 내...

blog.naver.com

 

 

 

 

소스코드

import tensorflow as tf
import numpy as np
from tensorflow.keras.models import load_model  # 저장된 모델 불러오기
import matplotlib.pyplot as plt

# 1. Fashion MNIST 데이터셋 임포트
fashion_mnist = tf.keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()


# 2. 데이터 전처리
train_images, test_images = train_images / 255.0, test_images / 255.0


# 3. 모델 구성
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(28, 28)),
    tf.keras.layers.Dense(512, activation='relu'),
    tf.keras.layers.Dense(10, activation='softmax')
])


# 4. 모델 컴파일
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])


# 5. 모델 훈련
history = model.fit(train_images, train_labels, batch_size=32, epochs=10, validation_split=0.2)


# 6. 정확도 평가하기
loss, accuracy = model.evaluate(test_images, test_labels)
print(loss, accuracy)


# 7. 예측하기
predictions = model.predict(test_images)
print(predictions[0])
print(np.argmax(predictions[0]))

# 8. 모델 저장하기
model.save("fashion_load_model.h5")
loaded_model = load_model("fashion_load_model.h5")


# 9. 모델 성능 출력
plt.figure(figsize=(18, 6))

# 에포크별 정확도
plt.subplot(1,2,1)
plt.plot(history.history["accuracy"], label="accuracy")
plt.plot(history.history["val_accuracy"], label="val_accuracy")
plt.title("accuracy")
plt.legend()

# 에포크별 손실률
plt.subplot(1,2,2)
plt.plot(history.history["loss"], label="loss")
plt.plot(history.history["val_loss"], label="val_loss")
plt.title("loss")
plt.legend()

plt.show()

 

코드 설명

 

  • input_shape : 샘플 수를 제외한 입력 형태를 정의 합니다. 모델에서 첫 레이어일 때만 정의하면 됩니다. (행, 열, 채널 수)로 정의합니다. 흑백영상인 경우에는 채널이 1이고, 컬러(RGB)영상인 경우에는 채널을 3으로 설정합니다.
  • activation : 활성화 함수를 설정
    • linear : 디폴트 값, 입력뉴런과 가중치로 계산된 결과값이 그대로 출력으로 나옵니다.
    • relu : rectifier 함수, 은익층에 주로 쓰입니다. 0이하는 0으로 만들고 그 이상은 그대로 출력합니다.
    • sigmoid : 시그모이드 함수, 이진 분류 문제에서 출력층에 주로 쓰입니다. 0 혹은 1로 출력합니다.
    • softmax : 소프트맥스 함수, 다중 클래스 분류 문제에서 출력층에 주로 쓰입니다. 0과 1사이의 값으로 출력되며, 모두 더한값은 1이 되므로, 확률처럼 사용합니다.
  • filter(kernel) : 이미지의 특징을 찾기위한 파라미터, 해당 filter가 이미지를 움직이며 특징을 잡아냄, 해당 특징이 featuremap, filter의 종류에 따라 가로선 filter, 세로선 filter등이 있는데 cnn에선 해당 필터를 자동으로 생성함
  • featuremap : input 이미지에서 filter로 만들어진 해당 이미지의 특성을 가진 map
  • filters : input 이미지에서 featuremap을 생성 하는 filter의 갯수
  • padding : 외곽의 값을 0으로 채워넣어서 filter들로 만들어진 featuremap 기존의 이미지의 크기와 같게 할지의 여부 same은 같게, valid는 다르게, same으로 하면 filter가 이미지 사이즈에 맞게 featuremap을 만듬.
  • pooling : 계속 filter가 이미지를 움직이며 featuremap을 만들고 paddind이 same이라면 계속 같은 크기의 featuremap이 생성되게 됨. 이를 방지하기 위해 pooling 레이어를 거쳐 이미지 사이즈를 줄임, pool_size는 이미지에서 줄여지는 값
    • maxpooling : pooling 영역에서 가장 큰 값만 남기는것
    • averagepoolig : pooling 영역의 모든 데이터의 평균값을 구하여 남김
  • dropout : 이미지의 일부분을 drop시켜 학습하는데 어려움을 줌, 이로 인해 과적함을 막을 수 있습니다.
  • flatten : 앞에서 만든 (7, 7, 64)의 배열을 7 * 7 * 64하여 3136의 1줄의 배열로 평평하게 만드는것 입니다.
    • (2번의 pooling으로 이미지 사이즈가 작아짐, 28, 28, 64 -> 14, 14, 64 -> 7, 7, 64)
  • dense : 평평한 데이터가 들어오면, 해당 데이터를 dense레이어를 지나 맨앞의 사이즈로 줄여줌, 마지막은 10개 사이즈가 나오고, 이를 softmax함수로 활성화하여 0 ~ 9까지의 클래스를 예측할수 있게 해줍니다

 

 

과적합이 일어남

CNN 아님

 

CNN 이미지 설명

 

 

728x90
반응형