# 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()
댓글