Eggs Sunny Side Up
본문 바로가기
Computer Engineering/딥러닝

mlp_활성화, 최적화함수 비교_패션데이터(ing)_다중분류

by guswn100059 2023. 6. 29.
# ex04_mlp_활성화, 최적화함수 비교_패션데이터(ing)_다중분류

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 의류 분류 데이터 불러오기
from tensorflow.keras.datasets import fashion_mnist

data = fashion_mnist.load_data()
data

#((3차원 배열, 1차원 배열), (3차원 배열, 1차원 배열))
# (X_train, y_train), (X_test, y_test)

(X_train, y_train), (X_test, y_test)  = fashion_mnist.load_data()
# 끝의 일반괄호는 알아서 unpacking 되기 때문에 생략해야 함
# train, test 데이터셋은 구분 -> (), ()

# train데이터는 6만장의 이미지가 담겨있음
# 28 * 28 size 이미지
# (이미지개수, 행, 열)
print(X_train.shape, y_train.shape)

# 테스트 데이터는 만장
# 28 * 28 size 이미지
print(X_test.shape, y_test.shape)

# 이미지 1장 확인해보기
# 100번째 이미지 접근
X_train[100].max()

# 픽셀 안의 숫자 범위 : 0~255
# 색감 차원으로 치면 1(행, 열), 흑백이미지
# 0(검은색) << 255(흰색)

# 이미지로 출력
plt.imshow(X_train[100], cmap='gray')
plt.show() # 가방이미지

# 이미지 출력해보기
for i in range(1, 101, 5):
  print(y_train[i])
  plt.imshow(X_train[i], cmap='gray')
  plt.show()

# 답데이터 확인
# 다중분류 클래스 10 -> 출력층 units
np.unique(y_train, return_counts=True)

# 원핫인코딩
y_train_oh = pd.get_dummies(y_train)
y_test_oh = pd.get_dummies(y_test)
# from tensorflow.keras.utils import to_categorical 도 있음

# 크기확인
# 클래스개수 10개여서 컬럼의 개수가 10개로 생성
y_train_oh.shape, y_test_oh.shape

y_train_oh.head()

### 활성화함수, 최적화함수 비교
  - 1. 중간층 활성화 : sigmoid, 최적화 : sgd
  - 2. 중간층 활성화 : relu, 최적화 : sgd
  - 3. 중간층 활성화 : relu, 최적화 : adam
    - 각각의 신경망을 설계하고 결과를 비교해보자!

# 뼈대 구축하는 도구
from tensorflow.keras import Sequential
# 층 내용 정의, 2차원->1차원
from tensorflow.keras.layers import Dense, Flatten
# 최적화함수 불러와서 매개변수 값 설정하는 도구
from tensorflow.keras.optimizers import SGD, Adam

# 모델 생성 함수 정의
# 활성화함수, 최적화함수를 매개변수로 연결
def create_model(acti, opti) :
  # 뼈대구축
  model = Sequential()
  # 입력층 2->1차원으로 펴주기, Flatten
  model.add(Flatten(input_shape=(28, 28)))
  # 중간층 units=200,100,50
  # activation = acti
  model.add(Dense(200, activation=acti))
  model.add(Dense(100, activation=acti))
  model.add(Dense(50, activation=acti))
  # 출력층, 다중분류에 대해서 적기
  # 클래스의 개수만큼 units 설정
  model.add(Dense(10, activation='softmax'))
  # compile
  model.compile(loss='categorical_crossentropy',
                optimizer = opti,
                metrics=['accuracy'])
  return model # 생성한 모델 반환

# fit 함수 정의
# 모델명만 넣어주면 fit 진행하는 코드 작성
# estimator 예측기
def fit_model(estimator):
  h=estimator.fit(X_train, y_train_oh,
                  validation_split=0.3,
                  epochs=30,
                  batch_size=64)
  return h

# 1. sig + sgd
model1 = create_model(acti='sigmoid', opti=SGD(learning_rate=0.01))
# 요약
# model1.summary()
h1 = fit_model(model1)

# 2. relu + SGD(learning_rate=0.01)
# 모델 생성
model2 = create_model(acti='relu', opti=SGD(learning_rate=0.01))
# model2.summary()
# 모델 학습
h2 = fit_model(model2)

# 3. relu + Adam(learning_rate=0.001)
# 모델 생성
model3 = create_model(acti='relu', opti=Adam(learning_rate=0.001))
# 모델 학습
h3 = fit_model(model3)

# 3종류 모델 시각화하여 비교해보기
plt.figure(figsize=(10, 3))

# model1 : sigmoid + SGD -> acc, val_acc
plt.plot(range(1,31), h1.history['accuracy'], label='sig+SGD')
plt.plot(range(1,31), h1.history['val_accuracy'], label='val_sig+SGD')

# model2 : relu + SGD -> acc, val_acc
plt.plot(range(1,31), h2.history['accuracy'], label='relu+SGD')
plt.plot(range(1,31), h2.history['val_accuracy'], label='val_relu+SGD')

# model3 : relu + Adam -> acc, val_acc
plt.plot(range(1,31), h3.history['accuracy'], label='relu+Adam')
plt.plot(range(1,31), h3.history['val_accuracy'], label='val_relu+Adam')

plt.legend() # 범례 표시
plt.show()
# 최적화 함수 학습률은 사람이 개입되어 설정 가능 -> 적당한 값 설정 필요
# relu + adam은 다른 활성화함수와 최적화함수의 조합보다 빠르게, 더 좋은 성능으로 w,b를 찾아줌
# => 빠르고 좋은 모델(학습)

### 최적화 모델 찾기
  - 모델 체크 포인트 : 모델 저장
  - 얼리스탑핑 : 학습을 조기에 중단(과대적합 해소, 시간낭비 방지)

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping
import os # 폴더 생성
# 드라이브 model 폴더에 저장
# /content/drive/MyDrive/Colab Notebooks/DeepLearning

model_dir = '/content/drive/MyDrive/Colab Notebooks/DeepLearning/model/'
# 만약 해당 폴더가 없다면 생성
# os.path.exists(model_dir) : 해당 경로에 폴더가 존재하는지?
# 존재한다면 => True, 존재하지 않는다면 => False
if not os.path.exists(model_dir):
  # 폴더 X -> 생성
  os.mkdir(model_dir)

# 베스트 모델의 파일명 설정
# 정규식 표현법 {변수명:출력형태}
# {epoch:03d} : 반복횟수 변수값을 가져와서 정수형 3자리로 표시
# {val_accuracy:.2f} : 검증 정확도 변수값을 가져와서 소수점 2째자리까지 표시
# 파일명의 형태 : fashion_{epoch:03d}_{val_accuracy:.2f}.hdf5
file_path = model_dir + "fashion_{epoch:03d}_{val_accuracy:.2f}.hdf5"

# 베스트 체크 포인트 정의
f_mckp = ModelCheckpoint(filepath = file_path, # 파일 경로 설정
                         monitor='val_accuracy', # 해당 값을 기준으로 모델 저장
                         save_best_only=True, # monitor 값이 최고점을 갱신했을 때만 저장
                         verbose=1) # 모델 개선 및 저장 메세지 표시


# 2. 조기 학습 중단
f_early = EarlyStopping(monitor='val_accuracy',
                        # monitor의 값의 개선을 몇 번이나 기다려 줄 것인지 설정
                        patience=5)

# => 모델 학습시 val_accuracy가 5번의 반복을 진행할 동안 개선이 되지 않으면
# 학습을 중단시키겠음!

# 모델 생성, 학습 (모델 저장, 조기학습 중단 연결)
# 'relu', 'Adam'
model4 = create_model('relu', 'adam')

# 학습, 50번 반복, 배치사이즈 64, 검증데이터분리 30%
h4 = model4.fit(X_train, y_train_oh,
                epochs=50,
                validation_split=0.3,
                batch_size=64,
                callbacks=[f_mckp, f_early]) # 모델 저장, 조기학습중단 연결

# /content/drive/MyDrive/Colab Notebooks/DeepLearning/model/fashion_009_0.87.hdf5
# 저장된 모델 불러오기
from tensorflow.keras.models import load_model

#  불러오기
best_model = load_model(model_dir + 'fashion_009_0.87.hdf5')
# 모델 평가
best_model.evaluate(X_test, y_test_oh) # 약 86%

# 모델 요약 정보
best_model.summary()

'Computer Engineering > 딥러닝' 카테고리의 다른 글

OpenCV01_이미지로드  (0) 2023.07.03
mlp_손글씨숫자 이미지_다중분류  (0) 2023.06.29
iris 데이터_다중분류  (0) 2023.06.27
페암데이터 이진분류  (0) 2023.06.27
딥러닝 기초  (0) 2023.06.26

댓글