이번엔 fashion-mnist 데이터셋으로 실습을 해보자. 먼저, 라이브러리를 정의해준다.
%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개로 구성한다면 모델 선언 부분만 다르게 해주면 된다.
# 모델 이름 변경: 공백을 제거하거나 밑줄(_)로 대체
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