[day-19] fashion-mnist 실습

Joohyung Park·2024년 1월 24일
0

[모두연] 오름캠프

목록 보기
24/95

이번엔 fashion-mnist 데이터셋으로 실습을 해보자. 먼저, 라이브러리를 정의해준다.

층 1개로 구성된 모델

%matplotlib inline
import seaborn as sns
import matplotlib.pyplot as plt

import pandas as pd
import numpy as np

from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier

import tensorflow as tf
from tensorflow import keras

from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import Adam

from sklearn.metrics import classification_report,confusion_matrix

라이브러리에 저장되어 있는 데이터를 불러온다.

# 데이터 로드
(train_input, train_target), (test_input, test_target) = keras.datasets.fashion_mnist.load_data()

# 데이터 형태 출력
print("Training data shape:", train_input.shape, train_target.shape)
print("Test data shape:", test_input.shape, test_target.shape)

# 처음 10개의 이미지를 시각화
fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
    axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off')
plt.show()

처음 10개의 타겟(정답값) 라벨을 살펴보면 다음과 같다.

print("First 10 training labels:", [train_target[i] for i in range(10)])
# First 10 training labels: [9, 0, 0, 3, 0, 2, 7, 2, 5, 5]

라벨을 실제 분류와 매칭시켜보자.

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


labels_and_names = [(label, class_names[label]) for label in train_target[:10]]
labels_and_names

타겟(정답) 라벨의 고유한 값 및 각 라벨의 개수 출력

unique_targets, counts = np.unique(train_target, return_counts=True)
print("Unique target labels:", unique_targets)
print("Counts of each label:", counts)

표준화

train_scaled = train_input / 255.0
train_scaled = train_scaled.reshape(-1, 28, 28)

모델 생성 및 컴파일

# 단순한 완전 연결 계층을 사용한 모델 생성
model = tf.keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)), # 입력 데이터를 1D로 변환
    keras.layers.Dense(10, activation='softmax')
])

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

모델 학습

history = model.fit(train_scaled, train_target, epochs=5, validation_data=(test_input, test_target))

모델 평가

model.evaluate(test_input, test_target)

결과 시각화

# 훈련 및 검증 정확도 시각화
plt.figure(figsize=(12, 4))

plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Training Accuracy')
plt.plot(history.history['val_accuracy'], label='Validation Accuracy')
plt.legend()
plt.title('Training vs. Validation Accuracy')

plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Training Loss')
plt.plot(history.history['val_loss'], label='Validation Loss')
plt.legend()
plt.title('Training vs. Validation Loss')

plt.tight_layout()
plt.show()

층 2개로 구성된 모델

앞의 예제와 달리 층 2개로 구성한다면 모델 선언 부분만 다르게 해주면 된다.

# 모델 이름 변경: 공백을 제거하거나 밑줄(_)로 대체
model = keras.Sequential([
    keras.layers.Dense(100, activation='sigmoid', input_shape=(784,), name='hidden'),
    keras.layers.Dense(10, activation='softmax', name='output')
], name='Add_Model')  # 이름 변경

model.summary()

모델 저장, 불러오기

# 원래 모델 저장
model.save("original_model.h5")

# 저장된 모델 불러오기
loaded_original_model = keras.models.load_model("original_model.h5")

# 불러온 모델의 요약 정보 출력
loaded_original_model.summary()

콜백

학습 진행중에 개선되지 않으면 종료, 로깅 등의 작업을 할 수 있다.

from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint

# EarlyStopping 콜백 정의: 검증 손실이 10번의 에포크 동안 개선되지 않으면 훈련을 중지
early_stopping_cb = EarlyStopping(patience=10, restore_best_weights=True)

# ModelCheckpoint 콜백 정의: 각 에포크마다 모델의 가중치를 저장
checkpoint_cb = ModelCheckpoint("dropout_model_checkpoint.h5", save_best_only=True)

# 콜백을 사용하여 모델 학습
history = dropout_model.fit(
    train_scaled, train_target,
    epochs=100,  # 충분한 에포크 수 설정
    validation_data=(val_scaled, val_target),
    callbacks=[early_stopping_cb, checkpoint_cb]
)

# 이렇게 하면, 모델은 최대 100번의 에포크까지 훈련되지만,
# 검증 손실이 10번의 에포크 동안 개선되지 않으면 훈련이 조기 종료됩니다.
# 또한 각 에포크마다 모델의 가중치가 저장되며, 최적의 가중치만 최종적으로 저장됩니다.

텐서보드

텐서플로우 모델 학습 과정을 텐서보드로 쉽게 파악할 수 있다. 모델 학습시에 콜백함수로 텐서보드 옵션을 넣으면 된다.

# TensorBoard 로그 파일을 저장할 디렉토리 설정
from tensorflow.keras.callbacks import TensorBoard
import os
log_dir = os.path.join("logs", "fit")
tensorboard_cb = TensorBoard(log_dir=log_dir, histogram_freq=1)
model.fit(train_scaled, train_target,
          epochs=5,
          validation_data=(val_scaled, val_target),
          callbacks=[tensorboard_cb])

텐서보드 확인 명령어는 다음과 같다.

%load_ext tensorboard

%tensorboard --logdir=/content/logs/fit
profile
익숙해지기 위해 기록합니다

0개의 댓글