01. 모델 살펴보기
0. 사용할 패키지 불러오기
from keras.utils import np_utils
// Keras : 파이썬으로 작성된 오픈 소스 신경망 라이브러리
// Tensorflow : 머신러닝을 위한 엔드 투 엔드 오픈소스 플랫폼 / 다양한 작업에 대해 데이터 흐름 프로그래밍을 위한 오픈소스 소프트웨어 라이브러리
from keras.datasets import mnist
// MNIST(Modified National Institute of Standards and Technology database) : 손으로 쓴 숫자들로 이루어진 대형 데이터베이스
from keras.models import Sequential
from keras.layers import Dense, Activation
// Dense layer : 머신러닝에 가장 기본적인 층으로 서로 연속적인 상관관계가 있는 데이터가 아니라면 이 층을 통해 학습시킬 수 있음.
import numpy as np
//Numpy(Numerical Python) : C언어로 구현된 파이썬 라이브러리 / 행렬이나 일반적으로 대규모 다차원 배열을 쉽게 처리할 수 있도록 지원하는 라이브러리
from numpy import argmax
1. 데이터셋 생성하기 // 데이터셋 : 특정한 작업을 위해서 데이터를 관련성 있게 모아놓은 것
# 훈련셋과 시험셋 불러오기
(x_train, y_train), (x_test, y_test) = mnist.load_data()
# 데이터셋 전처리 // 전처리 : 특정 분석에 적합하게 데이터를 가공하는 작업
// reshape 함수 : 행렬 크기를 바꾸는 함수 -> 이 함수를 통해 (784*1=784)1차원 이미지 데이터로 만들어 1차원 배열이 6만개 있는 2차원 배열로 만든다.
// astype : 타입을 바꾸는 함수 -> float(실수화)된 후 255로 나누어짐
x_train = x_train.reshape(60000, 784).astype('float32') / 255.0
x_test = x_test.reshape(10000, 784).astype('float32') / 255.0
# 원핫인코딩 (one-hot encoding) 처리
// 원-핫 인코딩 : 단어 집합의 크기를 벡터차원으로 하고, 표현하고 싶은 단어의 인덱스에 1의 값을 부여한 후 다른 인덱스에는 0을 부여하는 단어의 벡터표현방식
원-핫 인코딩 과정
1) 각 단어에 고유한 인덱스 부여
2) 표현하고 싶은 단어의 인덱스 위치에 1을 부여, 다른 단어의 인덱스 위치에 0 부여
y_train = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)
# 훈련셋과 검증셋 분리
x_val = x_train[:42000] # 훈련셋의 30%를 검증셋으로 사용
x_train = x_train[42000:]
y_val = y_train[:42000] # 훈련셋의 30%를 검증셋으로 사용
y_train = y_train[42000:]
2. 모델 구성하기
model = Sequential()
// input_dim : 입력 뉴런의 수를 설정
// activation : 활성화 함수를 설정
1) linear : 디폴트 값, 입력뉴런과 가중치로 계산된 결과값이 그대로 출력으로 나옵니다.
2) relu : rectifier 함수, 은익층에 주로 쓰입니다.
3) sigmoid : 시그모이드 함수, 이진 분류 문제에서 출력층에 주로 쓰입니다.
4) softmax : 소프트맥스 함수, 다중 클래스 분류 문제에서 출력층에 주로 쓰입니다.
//Dense 레이어는 입력 뉴런 수에 상관없이 출력 뉴런 수를 자유롭게 설정할 수 있기 때문에 출력층으로 많이 사용됨
model.add(Dense(units=64, input_dim=28*28, activation='relu'))
model.add(Dense(units=10, activation='softmax'))
3. 모델 학습과정 설정하기
// 모델을 학습시키기 전에 compile()메소드를 통해서 학습 방식에 대한 환경설정을 해야함
입력받는 3개의 인자
1) 정규화기 (optimizer) : 훈련과정 설정, 최적화 알고리즘 설정(adam, sgd, rmsprop, adagrad 등)
2) 손실 함수 (loss function) : 모델이 최적화에 사용되는 목적 함수(mse, categorical_crossentropy, binary_crossentropy 등)
3) 평가지표 (metric) : 훈련을 모니터링 하기 위해 사용(분류- accuracy, 회귀- mse, rmse, r2, mae, mspe, mape, msle 등)
사용자가 메트릭을 정의해서 사용할 수도 있음
model.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])
4. 모델 학습시키기
// fix은 model.compile에서 지정한 방식으로 학습을 진행 -> metrics를 반환하여 기록을 살펴볼 수 있음.
fix함수의 return 값으로 히스토리 객체를 얻을 수 있음
1) 매 epoch 마다 훈련 손실값(loss)
2) 훈련 정확도(acc)
3) 검증 손실 값(val_loss)
4) 검증 정확도 (val_acc)
model.fit(x_train, y_train, epochs=5, batch_size=32, validation_data=(x_val, y_val))
5. 모델 평가하기 //준비된 시험셋으로 학습한 모델을 평가하는 단계
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=32)
print('')
print('loss_and_metrics : ' + str(loss_and_metrics))
6. 모델 사용하기
// predict() : 예측할 때 반환값은 수치, 샘플이 각 유형에 속하는 확률을 나타냄.
// predict_classes() : 예측할 때 분류 색인, 즉 해당 견본이 속한 라벨을 되돌려 줌.
xhat_idx = np.random.choice(x_test.shape[0], 5)
xhat = x_test[xhat_idx]
yhat = model.predict_classes(xhat)
for i in range(5):
print('True : ' + str(argmax(y_test[xhat_idx[i]])) + ', Predict : ' + str(yhat[i]))
================================================================================
오류 :
AttributeError Traceback (most recent call last)
in
46 xhat_idx = np.random.choice(x_test.shape[0], 5)
47 xhat = x_test[xhat_idx]
---> 48 yhat = model.predict_classes(xhat)
49
50 for i in range(5):
AttributeError: 'Sequential' object has no attribute 'predict_classes'
================================================================================
해결 :
yhat = model.predict_classes(xhat) 주석처리
1번 yhat = np.round(yhat).astype(int) or
2번 yhat = np.argmax(model.predict(xhat), axis=-1) 추가
2번이 좀 더 정확함
================================================================================
실행결과 : 실행시킬 때마다 바뀜
Epoch 1/5
563/563 [==============================] - 1s 2ms/step - loss: 1.1554 - accuracy: 0.7247 - val_loss: 0.6443 - val_accuracy: 0.8452
Epoch 2/5
563/563 [==============================] - 1s 2ms/step - loss: 0.5104 - accuracy: 0.8701 - val_loss: 0.4725 - val_accuracy: 0.8723
Epoch 3/5
563/563 [==============================] - 1s 2ms/step - loss: 0.4096 - accuracy: 0.8904 - val_loss: 0.4118 - val_accuracy: 0.8855
Epoch 4/5
563/563 [==============================] - 1s 2ms/step - loss: 0.3642 - accuracy: 0.8996 - val_loss: 0.3776 - val_accuracy: 0.8930
Epoch 5/5
563/563 [==============================] - 1s 2ms/step - loss: 0.3364 - accuracy: 0.9066 - val_loss: 0.3568 - val_accuracy: 0.8986
loss_and_metrics : [0.3319035768508911, 0.906499981880188]
ex)
True : 5, Predict : 5
True : 4, Predict : 4
True : 9, Predict : 9
True : 1, Predict : 1
True : 9, Predict : 7
================================================================================
깃허브 소스 : https://github.com/SeungHyunny/machine-learning02