DL [04] 다중분류 실습(손글씨데이터)

totwo·2024년 9월 5일
post-thumbnail

학습목표

  • 손글씨 데이터를 분류하는 딥러닝모델 설계
  • 다중분류 딥러닝 설계
    • 0~9까지 손글씨 데이터를 학습, 예측
    • 10개의 class를 가진다
 # 기본 라이브러리 불러오기
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 불러오기
# keras에서 제공해주는 손글씨 데이터 불러오기
from tensorflow.keras.datasets import mnist
# 훈련용, 테스트용 데이트로 이미 나누어져 들어가 있음
# 바로 변수에 대입
(X_train,y_train),(X_test,y_test) = mnist.load_data()
# 데이터 크기 확인
X_train.shape, y_train.shape
# 총 6만개의 학습 데이터
# 28*28 픽셀을 가지는 데이터
# 픽셀 : 사진의 정보를 가지는 최소 단위




💡 10개 중요

# 문제데이터 -> 손글씨 데이터 확인
plt.imshow(X_train[0],cmap='gray')
# 흑백사진
# 얼마나 검정인가 흰색인가에 대한 정보를 가지는 데이터
# 0 : 검은색, 255 : 흰색
print(y_train[0]) # 5

💠 MLP 모델링

  • multilayer perceptron
  • 입력층의 구조, 출력층의 구조 설계
  • 학습능력을 위한 중간층의 깊이 고려
  • loss, optimizer 설정
  • 학습결과 시각화
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Flatten
# Flatten : 2차원의 사진 데이터를 선형모델이 처리할 수 있는 1차원 데이터로 변경
# 현재 우리의 데이터 2차원 (28*28) -> 1차원
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer, Flatten
# Flatten : 2차원의 사진 데이터를 선형모델이 처리할 수 있는 1차원 데이터로 변경
# 현재 우리의 데이터 2차원 (28*28) -> 1차원

🤍 Softmax


업로드중..

# 신경망 모델 설계
# 뼈대생성
model = Sequential()
# 입력층
model.add(InputLayer(shape=(28,28))) # 28*28 2차원 데이터
model.add(Flatten()) # 2차원 형태의 사진데이터를 1차원으로 변경(선형모델학습을 위함)
# 중간층(은닉층)
model.add(Dense(units=8, activation='sigmoid'))
model.add(Dense(units=16, activation='sigmoid'))
model.add(Dense(units=8, activation='sigmoid'))
# 출력층 -> 출력데이터의 형태 지정
model.add(Dense(units=10, activation='softmax')) # 클래스의 개수만큼 출력 개수 지정
# 출력층에서의 활성화함수의 역할 : 출력데이터의 형태 변경
# 분류 : 확률값을 출력
# 다중분류 -> 클래스 개수만큼의 확률값이 출력
# softmax함수 : 클래스의 개수만큼의 결과값이 출력 -> 총합이 1인 확률로 변경
# 모델 학습방법 및 평가방법 설정
model.compile(loss = "categorical_crossentropy",
              optimizer='adam',
              metrics=['accuracy'])

예측 데이터에 따른 출력층 구성

  • 회귀 (1개의 연속값)
    • units = 1, activation = 'Linear' (defalut)
  • 이진분류 (1개의 확률값 0~1)
    • units = 1, activation = 'sigmoid'
  • 다중분류 (클래스 개수만큼의 확률값 : 총합이 1)
    • units = 클래스개수, activation = 'softmax'

학습방법 및 평가방법 설정

  • loss : 학습과정 중 모델의 잘못된 정도를 측정하는 수치

    • 회귀 : mse
    • 이진분류 : binary_crossentropy
    • 다중분류 : categorical_crossentropy
  • optimizer : 최적화 함수 -> w,b을 최적화해나가는 알고리즘

    • 종류가 다양함
    • SGD, adam, momentum .. 등
    • 각 함수의 특징 수업예정
  • metrics : 평가지표

    • 분류 : 정확도 (accuracy)
    • 회귀 : mse (평균제곱오차)
# 모델 학습
model.fit(X_train, y_train, validation_split=0.2, epochs=20)

⚠ 문제발생
오류 확인해보니 정답 데이터의 shape가 일치하지 않음
shape가 다르면 학습이 불가
y_train 데이터를 확인해보니 1개의 결과값(클래스 중 1개를 출력)
모델링의 출력결과 : 10개 클래스에 대한 확률값

해결방법 2가지
[방법1] 1개의 정답 데이터의 형태를 10개의 확률값으로 변경
[방법2] compile 학습방법을 정의하는 부분에서 loss = 'sparse_categorical_crossentropy'

# [방법1] 1개의 정답 데이터의 형태를 10개의 확률값으로 변경
from tensorflow.keras.utils import to_categorical
cate_y_train = to_categorical(y_train)

# 범주형 정답데이터를 확률값으로 변경해줌
cate_y_train.shape


h = model.fit(X_train, cate_y_train, validation_split=0.2, epochs=20)
# [방법2] compile 학습방법을 정의하는 부분에서 loss = 'sparse_categorical_crossentropy'
# sparse를 붙여서 사용 / 더 선호함
# 알아서 들어오는 데이터를 확률값으로 변경하여 비교
model.compile(loss = 'sparse_categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
# 학습 결과 시각화
plt.figure(figsize=(5,5))
plt.plot(range(1,21), h.history['loss'], label='train_loss')
plt.plot(range(1,21), h.history['val_loss'], label='val_loss')
plt.legend() # 범례표시
plt.show()


profile
Hello, World!

0개의 댓글