
학습목표
- 손글씨 데이터를 분류하는 딥러닝모델 설계
- 다중분류 딥러닝 설계
- 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

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차원

# 신경망 모델 설계
# 뼈대생성
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'])
loss : 학습과정 중 모델의 잘못된 정도를 측정하는 수치
optimizer : 최적화 함수 -> w,b을 최적화해나가는 알고리즘
metrics : 평가지표
# 모델 학습
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()

