MNIST데이터 셋중 패션 MNIST 데이터셋을 활용하여 Keras를 공부해보려고한다.
머신러닝 살짝 공부하다가 딥러닝으로 넘어온케이스... 헷갈리는 부분도 많지만 다시 복습하면 더 잘 와닿겠지!
딥러닝 부터는 코드를 직접 적으려고 한다.
1). 데이터셋 불러와 훈련세트, 테스트세트로 분류하기
from tensorflow import keras
(train_input, train_target), (test_input,test_target) = keras.datasets.fashion_mnist.load_data()
2). 데이터셋 구조 확인
print(train_input.shape,train_target.shape)
==> (60000, 28, 28) (60000,)
print(test_input.shape,test_target.shape)
==> (10000, 28, 28) (10000,)
잘나누어 진것을 확인 할 수 있다.
3). 데이터셋에 들어있는 그림이 어떤것들인지 확인해 보자
#그림 확인
import matplotlib.pyplot as plt
fid, axs = plt.subplots(1,10, figsize=(10,10))#1개의 행과 10개의 열로 지정, 사이즈는 10x10
for i in range(10):
axs[i].imshow(train_input[i], cmap='gray_r')
axs[i].axis('off')
plt.show()

각 그림별 클래스를 확인해보자 => 9번째와 10번째 그림은 같은 클래스인지, 다른클래스인지 확인!
#각 그림별 클래스 확인
print([train_target[i] for i in range(10)])
==>[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]
클래스를 확인해보니 9번째와 10번째는 같은 클래스의 이미지라는것을 확인 할 수있다.
그렇다면 클래스는 어떻게 지정되어 있는 것인가? 데이터셋에는 별도로 클래스레이블이 지정되어있지 않는다고 하지만, 공식홈페이지에서의 순서는 다음과 같다.
- 0:티셔츠, 1:바지, 2:스웨터, 3:드레스, 4:코트, 5:샌달, 6:셔츠, 7:스니커즈, 8:가방, 9:앵클부츠
4). SGDClassifier를 사용하기위해 데이터셋의 배열을 변환한다. 2차원배열->1차원배열
train_scaled = train_input/255.0 #데이터는 0~255로 되어있어 0~1사이의 값으로 만들기위해 나눠준다.
print(train_scaled.shape)
train_scaled = train_input.reshape(-1,28*28)# -1 : 첫번째 차원은 그대로두고 나머지 차원만 바꾼다.
print(train_scaled.shape)
==>(60000, 28, 28)
==>(60000, 784)
쉽게 보면 28*28픽셀로 되어있던 데이터를 합쳐서 784로 만든것이다.
5). 로지스틱회귀로 분류 및 교차검증으로 성능확인
from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
#max_iter=5일때
sc = SGDClassifier(loss='log',max_iter=5,random_state=42)#logistics 손실함수 적용
score = cross_validate(sc,train_scaled,train_target, n_jobs=-1) #n_jobs : 병렬실행에 사용할 CPU 코어수를 지정(-1이면 모든 코어사용) 기본 : 1
print(np.mean(score['test_score']))
==> 0.7734375
# max_iter=20 일때
==> 0.7809375000000001
훈련 반복회수를 늘린다고해서 성능이 월등히 나아지는것은 아니다.
이제 성능을 향상시킬수있다고 보는 인공 신경망을 본격적으로 만들어보려고 한다.
6). 인공신경망을 만들기 전 훈련세트에서 검증세트를 별도로 분리한다.
from sklearn.model_selection import train_test_split
#훈련세트에서 검증세트와 훈련세트로 나눈다. 검증세트 20%로 지정
train_scaled, val_scaled, train_target, val_target = train_test_split(train_scaled,train_target,test_size=0.2, random_state=42)
7). Dense 층을 만들어준다.
#dense layer => z출력층 10개 클래스에 대한 뉴런
dense = keras.layers.Dense(10,activation='softmax',input_shape=(784,)) #순서대로 뉴런갯수, 뉴런출력에 적용할 함수, 입력크기
print(train_scaled.shape)
==>(38400, 784)
다중분류이기때문에 softmax함수 적용하였다. softmax함수적용하면?? => 각 클래스별 z값을 확률로 구할수 있다.
**이진분류라면 sigmoid 로 쓰면된다.
784는 우리가 데이터셋에서 1차원배열로 만들어준 픽셀데이터이다.
이 784개의 입력값을 각각의 뉴런이 받는다.
8). 시퀀스 모델에 우리가 만든 dense 객체 전달 및 훈련전 설정
#시퀀스 클래스에 미리만들어놓은 dense객체를 전달한것이 모델.
model = keras.Sequential(dense)
#keras 모델 훈련전 설정단계
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')#crossentropy= 다중분류 손실함수, accuray : 정확도 까지 출력
9). 훈련 => 반복 5회
model.fit(train_scaled,train_target, epochs=5)

훈련이 반복 될수록 정확도 : 0.7922로 향상, 손실 : 15.2323으로 점점 줄어드는것을 확인할 수있다.
10). 모델 성능 평가
#모델 성능 평가
model.evaluate(val_scaled,val_target) #아까 훈련세트에서 검증세트 따로 떼어낸것

=> 훈련 데이터셋으로 검증 했을때보다 조금 낮은 점수로 마무리되었다. 정상적인 상황이다.
로지스틱스 회귀로만 했던 것보다 인공 신경망을 통한 성능이 더 좋은것도 확인 할 수 있었다.
'AI > Deep Learning' 카테고리의 다른 글
[Tensorflow 2.x / Keras] 기본 -3 MNIST 셋 활용 / 인공신경망-3 / Relu + Optimizer (0) | 2021.01.21 |
---|---|
[Tensorflow 2.x / Keras] 기본 -2 패션 MNIST 데이터 셋 활용 / 인공신경망-2 / 다층 (0) | 2021.01.20 |
[Tensorflow2.x] CheckPoint란? (0) | 2021.01.14 |
[Tensorflow2.x] Linear Regression(선형회귀) 란? (0) | 2021.01.14 |
[Tensorflow2.x / Keras] 손글씨 숫자 분류를 위한 신경망 만들기 (0) | 2021.01.11 |