티스토리 뷰
from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
import matplotlib.pyplot as plt
import numpy as np
import os
import tensorflow as tf
# seed 값 설정
seed = 0
np.random.seed(seed)
tf.random.set_seed(seed)
# MNIST 데이터 불러오기
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
X_train = X_train.reshape(X_train.shape[0], 784).astype('float32') / 255
X_test = X_test.reshape(X_test.shape[0], 784).astype('float32') / 255
Y_train = tf.keras.utils.to_categorical(Y_train, 10)
Y_test = tf.keras.utils.to_categorical(Y_test, 10)
# 모델 프레임 설정
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
# 모델 실행 환경 설정
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 모델 최적화 설정
MODEL_DIR = './model_mnist_b/' # 경로 수정
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath = "./model_mnist_b/{epoch:02d}-{val_loss:.4f}.keras" # 포맷 문자열 수정
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# 모델의 실행
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=1, callbacks=[early_stopping_callback, checkpointer])
# 테스트 정확도 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
# 테스트셋의 오차
y_vloss = history.history['val_loss']
# 학습셋의 오차
y_loss = history.history['loss']
# 그래프로 표현
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker=".", c="blue", label='Trainset_loss')
# 그래프에 그리드를 주고 레이블을 표시
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()
1.주요 기능
데이터 로드 및 전처리:
2. MNIST 데이터셋을 로드하고, 이미지를 784차원 벡터로 변환합니다.
픽셀 값을 0~1 범위로 정규화합니다.
레이블을 원-핫 인코딩 형태로 변환합니다.
모델 구성:
3. Sequential 모델을 사용하여 두 개의 Dense 레이어를 추가합니다.
첫 번째 레이어는 512개의 뉴런을 가지며 ReLU 활성화 함수를 사용합니다.
두 번째 레이어는 10개의 뉴런을 가지며 소프트맥스 활성화 함수를 사용하여 다중 클래스 분류를 수행합니다.
모델 컴파일:
4. 손실 함수로 categorical_crossentropy를 사용하고, 옵티마이저로 adam을 사용합니다.
모델 학습:
5. 모델을 학습하고, 조기 종료 및 체크포인트 저장 기능을 사용합니다.
결과 시각화:
6. 학습 과정에서의 손실을 시각화하여 성능을 분석합니다.
개선 사항
1.모델 구조 개선:
더 깊은 네트워크를 만들거나 Dropout 레이어를 추가하여 과적합을 방지할 수 있습니다.
2.하이퍼파라미터 튜닝:
배치 크기와 에포크 수를 조정하여 성능을 최적화할 수 있습니다.
3.학습 곡선 시각화:
정확도(accuracy)도 함께 시각화하여 모델의 성능을 더 잘 이해할 수 있습니다.
하이퍼파라미터 조정 및 정확도 시각화를 추가한 코드
# ... (위의 코드 생략)
# 모델 구성
model = Sequential()
model.add(Dense(512, input_dim=784, activation='relu'))
model.add(Dense(10, activation='softmax'))
# 모델 실행 환경 설정
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 모델 최적화 설정
MODEL_DIR = './model_mnist_b/'
if not os.path.exists(MODEL_DIR):
os.mkdir(MODEL_DIR)
modelpath = "./model_mnist_b/{epoch:02d}-{val_loss:.4f}.keras"
checkpointer = ModelCheckpoint(filepath=modelpath, monitor='val_loss', verbose=1, save_best_only=True)
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=10)
# 모델의 실행
history = model.fit(X_train, Y_train, validation_data=(X_test, Y_test), epochs=30, batch_size=200, verbose=1, callbacks=[early_stopping_callback, checkpointer])
# 테스트 정확도 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, Y_test)[1]))
# 테스트셋의 오차
y_vloss = history.history['val_loss']
# 학습셋의 오차
y_loss = history.history['loss']
# 정확도
y_vacc = history.history['val_accuracy']
y_acc = history.history['accuracy']
# 그래프로 표현
x_len = np.arange(len(y_loss))
plt.figure(figsize=(12, 5))
# 손실 그래프
plt.subplot(1, 2, 1)
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker=".", c="blue", label='Trainset_loss')
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.title('Loss over epochs')
# 정확도 그래프
plt.subplot(1, 2, 2)
plt.plot(x_len, y_vacc, marker='.', c="green", label='Testset_accuracy')
plt.plot(x_len, y_acc, marker=".", c="orange", label='Trainset_accuracy')
plt.legend(loc='lower right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('accuracy')
plt.title('Accuracy over epochs')
plt.tight_layout()
plt.show()
Dropout 레이어: 추가하여 과적합을 줄일 수 있습니다.
모델 성능: 정확도 및 손실 그래프를 동시에 시각화하여 모델의 성능을 종합적으로 평가할 수 있습니다.
'AI(인공지능)' 카테고리의 다른 글
MNIST - 이미지의 숫자를 예측하는 과정 : 코드 상세 설명 (0) | 2024.11.11 |
---|---|
TensorFlow(텐서플로) (0) | 2024.10.31 |
댓글
Blog is Powered by 2011
DEVLUV