DL [07] 패션데이터 분류실습

totwo·2024년 9월 5일
post-thumbnail

목표

  • 데이터를 다운받아 딥러닝 신경망 모델 학습 및 예측, 평가과정을 거치자
  • 다양한 방법을 사용하여 (중간층의 활성화함수와 최적화함수) 최적의 조합을 찾아보는 학습 진행
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras.datasets import fashion_mnist
(X_train,y_train), (X_test,y_test) = fashion_mnist.load_data()

# 패션이미지 출력
plt.imshow(X_train[10],cmap='gray')
print(y_train[10]) # 0

# 정답데이터 확인
# class 개수 10개
np.unique(y_train) 

<데이터 정보>

[실습1] sigmoid + SGD 조합

  • 중간층 성능
    • 5개층 (64,128,256,128,64)
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import InputLayer, Dense, Flatten

# 신경망 모델 설계
model1 = Sequential()
model1.add(InputLayer(shape=(28,28)))
model1.add(Flatten())
model1.add(Dense(units=64, activation='sigmoid'))
model1.add(Dense(units=128, activation='sigmoid'))
model1.add(Dense(units=256, activation='sigmoid'))
model1.add(Dense(units=128, activation='sigmoid'))
model1.add(Dense(units=64, activation='sigmoid'))
model1.add(Dense(units=10, activation='softmax'))
# 학습방법 및 평가방법 설정
model1.compile(loss='sparse_categorical_crossentropy',
                optimizer='SGD', # 확률적경사하강법
                metrics=['accuracy'])
# 모델학습
h1 = model1.fit(X_train, y_train, validation_split=0.2, batch_size=64, epochs=20)

# 왜 학습이 제대로 되지 않는지 확인
# 1. 중간층의 활성화함수 sigmoid -> 기울기 소실 문제 발생 

# 학습결과 시각화
plt.figure(figsize=(5,5))
plt.plot(range(1,21), h1.history['loss'], label='train_loss', color='lightgreen')
plt.plot(range(1,21), h1.history['val_loss'], label='val_loss', color='lightpink')
plt.title('sigmoid + SGD')
plt.legend() # 범례표시
plt.show()

[실습2] relu + SGD 조합

  • 중간층 성능
    • 5개층 (64,128,256,128,64)
# 신경망 모델 설계
model2 = Sequential()
model2.add(InputLayer(shape=(28,28)))
model2.add(Flatten())
model2.add(Dense(units=64, activation='relu'))
model2.add(Dense(units=128, activation='relu'))
model2.add(Dense(units=256, activation='relu'))
model2.add(Dense(units=128, activation='relu'))
model2.add(Dense(units=64, activation='relu'))
model2.add(Dense(units=10, activation='softmax'))
# 학습방법 및 평가방법 설정
model2.compile(loss='sparse_categorical_crossentropy',
               optimizer=SGD(learning_rate=0.001), # 확률적경사하강법 
               # SGD 기본 학습률 : 0.01 학습률이 크면 학습이 제대로 되지 않는 경우 있음
               # 활성화함수 -> sigmoid 오차가 소실되었는데 relu로 바꿔주면서 오차 소실이 X
               # 오차가 그대로 전달되다 보니 변동이 큼 + 학습률 큼
                metrics=['accuracy'])
# 모델학습
h2 = model2.fit(X_train, y_train, validation_split=0.2, batch_size=64, epochs=20)    

# 학습결과 시각화
plt.figure(figsize=(5,5))
plt.plot(range(1,21), h2.history['loss'], label='train_loss', color='lightgreen')
plt.plot(range(1,21), h2.history['val_loss'], label='val_loss', color='lightpink')
plt.title('relu + SGD')
plt.legend() # 범례표시
plt.show()

[실습3] relu + Adam 조합

  • 중간층 성능
    • 5개층 (64,128,256,128,64)
# 신경망 모델 설계
model3 = Sequential()
model3.add(InputLayer(shape=(28,28)))
model3.add(Flatten())
model3.add(Dense(units=64, activation='relu'))
model3.add(Dense(units=128, activation='relu'))
model3.add(Dense(units=256, activation='relu'))
model3.add(Dense(units=128, activation='relu'))
model3.add(Dense(units=64, activation='relu'))
model3.add(Dense(units=10, activation='softmax'))
# 학습방법 및 평가방법 설정
model3.compile(loss='sparse_categorical_crossentropy',
                optimizer=Adam(), 
               # Adam 기본 학습률=0.001
                metrics=['accuracy'])
# 모델학습
h3 = model3.fit(X_train, y_train, validation_split=0.2, batch_size=64, epochs=20) 

# 학습결과 시각화
plt.figure(figsize=(5,5))
plt.plot(range(1,21), h3.history['loss'], label='train_loss', color='lightgreen')
plt.plot(range(1,21), h3.history['val_loss'], label='val_loss', color='lightpink')
plt.title('relu + Adam')
plt.legend() # 범례표시
plt.show()

시각화

# 정확도 기준으로 시각화
plt.plot(h1.history['accuracy'], label='sig+sgd train acc')
plt.plot(h1.history['val_accuracy'], label='sig+sgd train acc')
plt.plot(h2.history['accuracy'], label='relu+sgd train acc')
plt.plot(h2.history['val_accuracy'], label='relu+sgd train acc')
plt.plot(h3.history['accuracy'], label='relu+adam train acc')
plt.plot(h3.history['val_accuracy'], label='relu+adam train acc')

plt.legend()
plt.show()

profile
Hello, World!

0개의 댓글