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

2024. 6. 28. 18:05Deep Learning

 

✅ 목표

  • 패션 데이터를 가지고 활성화 함수, 최적화 함수를 변경시키면서 결과를 확인해보자
# 필요한 라이브러리 불러오기

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 패션 데이터 불러오기
# 데이터 import

from tensorflow.keras.datasets import fashion_mnist

# 데이터 객체 생성

data = fashion_mnist.load_data()

# 데이터 분할

X_train = data[0][0]
X_test = data[1][0]
y_train = data[0][1]
y_test = data[1][1]
X_train.shape, X_test.shape, y_train.shape, y_test.shape

# 데이터 확인

X_train
# 하나의 2차원 배열 -> 이미지 1장(x / y) -> 2차원 배열
# 이미지의 갯수까지 포함하면 1차원이 추가 되어서 3차원 배열

# 정답 데이터 확인하기

y_train
# 1차원의 배열 / 숫자로 값이 이뤄졌다

# 정답 고유 값을 살펴보자 - 10개의 정답(다중 분류)

np.unique(y_train)

  • 📌 데이터 정리
    • 0 : 티셔츠
    • 1 : 트라우저(바지)
    • 2 : 단추가 없는 스웨터
    • 3 : 드레스
    • 4 : 코트
    • 5 : 샌들
    • 6 : 셔츠
    • 7 : 스니커즈
    • 8 : 가방
    • 9 : 앵클 부츠
# 이미지 출력해 보기

plt.imshow(X_train[1], cmap='gray')

plt.imshow(X_train[10000], cmap='gray')
print(y_train[10000])

# 반복문을 통해서 여러 이미지를 뽑아 내보자

for i in range(1, 50, 2) :
    plt.imshow(X_train[i], cmap='gray')
    plt.show()

 

 

✅ 이미지 전처리

  • MLP(다층 퍼셉트론)으로 신경망을 구현할 경우, 이미지를 1차원으로 펴서 넣어줘야 한다.
  • 1차원으로 펴진 이미지의 픽셀은 각각 뉴런에 들어가서 학습이 진행된다.

# 이미지를 1차원으로 바꿔주는 방법 - 2가지
# 1-1. reshape : 함수를 이용해서 직접 형태를 바꿔주는 방법
# 1-2. Flatten : 신경망에 층을 추가해서 1차원으로 변형 시켜주는 방법
# 1-1 reshape

X_train_reshape = X_train.reshape(60000, -1) # -1 -> 784, 28*28, 28**2
X_test_reshape = X_test.reshape(10000, -1)

X_train_reshape.shape, X_test_reshape.shape

# 정답 데이터 전처리
# 정답 데이터 종류 : 10개 (다중 분류)

# 다중 분류를 진행 할 때 정답 데이터 -> 원핫 인코딩

# 원핫 인코딩 진행방법
# 1. pd.get_dummies() -> pandas
# 2. to_categorical() -> tensorflow

# to_categorical 사용해보기
# to_categorical import

from tensorflow.keras.utils import to_categorical
# 정답 데이터 원핫 인코딩 진행

y_train_oh = to_categorical(y_train)
y_test_oh = to_categorical(y_test)

 

✅ 활성화 함수 / 최적화 함수 별로 성능 비교

  1. 중간층 활성화 함수 : sigmoid / 최적화함수 : SGD
  2. 중간층 활성화 함수 : sigmoid / 최적화 함수 : Adam
  3. 중간층 활성화 함수 : relu / 최적화 함수 : Adam
  4. 중간층 활성화 함수 : tanh / 최적화 함수 : SGD
# 신경망을 구현하기 위한 재료 import

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
# 최적화 함수 하이퍼 파라미터 변경을 위해 optimizer import

from tensorflow.keras.optimizers import SGD, Adam
# 모델 생성 함수 정의
# 활성화 함수 / 최적화 함수는 매개변수 값으로 연결
# acti = 활성화 함수, opti = 최적화 함수

def create_model(acti, opti) :
    model = Sequential()

    # 입력층 구성 - Flatten(데이터를 1차원으로 펴줌)
    model.add(Flatten(input_shape=(28, 28)))

    # MLP층 쌓아주기
    model.add(Dense(units = 200, activation=acti))
    model.add(Dense(units = 100, activation=acti))
    model.add(Dense(units = 50, activation=acti))

    # 출력층 쌓기
    model.add(Dense(units = 10, activation='softmax'))

    # 모델 컴파일
    model.compile(optimizer=opti, loss='categorical_crossentropy', metrics=['accuracy'])

    return model
# fit 함수 정의
# 모델명만 넣어주면 학습을 진행하는 코드를 작성

def fit_model(estimator) :
    h = estimator.fit(X_train, y_train_oh, validation_split=0.2, batch_size = 64)

    return h
# 1. sigmoid + SGD

model1 = create_model(acti='sigmoid', opti=SGD(learning_rate=0.01))

h_1 = fit_model(model1)

# 2. sigmoid + Adam

model2 = create_model(acti='sigmoid', opti=Adam(learning_rate=0.001))

h2 = fit_model(model2)

# 3. relu + Adam

model3 = create_model(acti='relu', opti=Adam(learning_rate=0.001))

h3 = fit_model(model3)

# 4. tanh + SGD

model4 = create_model(acti='tanh', opti=SGD(learning_rate=0.01))

h4 = fit_model(model4)

# 4종류의 모델 학습 시각화
plt.figure(figsize = (15,5))

# model1
plt.plot(h1.history['accuracy'], label = 'sigmoid+SGD')

# model2
plt.plot(h2.history['accuracy'], label = 'sigmoid+Adam')

# model3
plt.plot(h3.history['accuracy'], label = 'relu+Adam')

# model4
plt.plot(h4.history['accuracy'], label = 'tanh+SGD')

plt.legend()

plt.show()

'Deep Learning' 카테고리의 다른 글

CNN(Convolutional Neural Network)  (0) 2024.07.05
모델저장 학습중단 과적합  (0) 2024.07.01
iris 데이터 다중 분류 실습  (0) 2024.06.27
폐암 데이터 이진 분류  (0) 2024.06.26
학생 수학 성적 예측  (0) 2024.06.26