AI/Deep Learning

[Tensorflow 2.x / Keras] 기본 -1 패션 MNIST 데이터 셋 활용 / 인공신경망-1 /단층

Jeong Jeon
반응형

 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) #아까 훈련세트에서 검증세트 따로 떼어낸것

=> 훈련 데이터셋으로 검증 했을때보다 조금 낮은 점수로 마무리되었다. 정상적인 상황이다.

로지스틱스 회귀로만 했던 것보다 인공 신경망을 통한 성능이 더 좋은것도 확인 할 수 있었다.

반응형