패션 MNIST 데이터셋을 통해서 머신러닝 비지도학습 (군집알고리즘)처럼 데이터를 살펴보자!!

 

딥러닝 대표 라이브러리에는 텐서플로, 케라스가 있다.

케라스 임포트해서 mnist 데이터를 다운받아 보자.

from tensorflow import keras 
(train_input , train_target), (test_input, test_target) =\
	keras.datasets.fashion_mnist.load_data()
    
    
    Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-labels-idx1-ubyte.gz
29515/29515 [==============================] - 0s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/train-images-idx3-ubyte.gz
26421880/26421880 [==============================] - 1s 0us/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-labels-idx1-ubyte.gz
5148/5148 [==============================] - 0s 0s/step
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/t10k-images-idx3-ubyte.gz
4422102/4422102 [==============================] - 0s 0us/step

출력해보자

print(train_input.shape, train_traget.shape)

(60000, 28, 28) (60000,)

훈련 데이터는 60,000의 이미지로 이루어져 있고,

각 이미지는 28x28픽셀임을 알 수 있다.!!

 

타겟 데이터 또한 60,000장이다.!

 

print(test_input.shape, test_target.shape)

(10000, 28, 28) (10000,)

테스트 데이터또한 훈련 데이터와 개수,사이즈가 같다.!

 

그림으로 샘플이 무엇인지 살펴봅시다람쥐.

import matplotlib.pyplot as plt
fig, axs = plt.subplots(1, 10, figsize=(10,10))
for i in range(10):
	axs[i].imshow(train_input[i], cmap='gray_r')
    axs[i].axis('off')
plt.show()

 

리스트함축구문을 사용해서 처음 10 샘플의 타겟값을 리스트 만든 후 출력해보자.

[train_target[i] for i in range(10)]

[9, 0, 0, 3, 0, 2, 7, 2, 5, 5]

이제 unique()함수를 통해 레이블당 샘플 개수를 확인해보자.!

import numpy as np
np.unique(train_target, return_counts=True)

(array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=uint8),
 array([6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000, 6000],
       dtype=int64))

6000개씩 10종류가 있음을 확인할 수 있다.

 

 

로지스틱 회귀로 분류하기

앞서 배운 SGDClassifier (확률적)경사하강법을 사용할 때 처럼 표준화 전처리를 해야함.

흑백 이미지의 경우 0~255의 값을 가지므로, 255으로 나누면 0~1로 표현가능하다.

 

우선 reshape()을 통해 3차원->2차원으로 배열을 바꿔보자,

train_scaled = train_input / 255.0
train_scaled = train_sclaed.reshape(-1, 28*28)

잘 됐는지 확인해보자.

print(train_scaled.shape)

(60000, 784)

 

교차 검증을 통해서 성능을 확인해보자!!!

from sklearn.model_selection import cross_validate
from sklearn.linear_model import SGDClassifier
sc = SGDClassifier(loss='log', max_iter=5, random_state=42)
scores = cross_validate(sc, train_scaled, train_target, n_jobs=-1)
print(np.mean(scores['test_score']))

0.8192833333333333

높지가 않다!!!

 

 

로지스틱 회귀 공식 떠올려보자,,,!

픽셀 784개에 대해서 각각 가중치를 다르게 매겨서 소프트맥수 함수 통과~ 출력 :0~1사이!!

 

뉴런 = z값 ( 출력층의 값) == 유닛

입력층 = 픽셀값 그잡채

 

 

텐서플로와 케라스는 원래 별도의 라이브러리와 같은 개념이였는데,

텐서플로는 구글이 개발, 오픈소스로 공개한 라이브러리 이고, 케라스는 프랑소와라는 사람이 만들었다.

프랑소와가 구글에 합류하고, 케라스 api를 텐서플로에 넣은 후, 텐서플로는 케라스api만 사용하게 되었고,

이후 사실상 tensorflow=keras 같은 개념이라고 볼 수 있을것 같다.

 

 

1. 인공 신경망 만들기

from sklearn.model_selectoin import train_test_split
train_scaled, val_scaled, train_target, val_target
= train_test_split(train_scaled,train_target,test_size=0.2, random_state=42)

인공 신경망 (딥러닝) 에서는 머신러닝 했을때와 다르게 교차 검증 하지 않는다!!!!!!!!!!!!!!

1. 데이터셋 충분히 크기 때문에 교차검증 효과적 X

2. 시간이 너~무 오래걸림

훈려세트에서 20%를 검증세트로 따로 떼어냈다 .  ( test_size= 0.2 )

print(train_scaled.shape, train_target.shape)
(48000, 784) (48000,)

60,000 - ( 60,000 x 0.2 ) = 48,000 정상적으로 나눠졌다.

 

print(val_scaeld.shape, var_target.shape)

(12000, 784) (12000,)

 60,000 x 0.2 = 12,000 정상적으로 나눠짐 !

 

 

이제 인공 신경망을 만들어보자.

dense=밀집한 ==> 입력층의 수많은 784개의 픽셀등을 뜻한다고 생각하면 편하다.

케라스의 Dense클래스를 이용해서 밀집층을 만들자. 매개변수는 뉴런수,함수,입력크기이다.

 

dense = keras.layers.Dense(10, activation = 'softmax', input_shape=(784,))

activation = 출력층에 적용할 함수 (이진분류이면 시그모이드, 다중 분류 소프트맥스)

input_shape = 입력의 크기

 

model = keras.Sequential(dense)

이제 신경망을 만들었다.

MNIST 데이터셋을 분류해보자.

 

훈련하기전 마지막 설정 단계 : model.compile()

손실함수

이진분류 : loss = 'binary_crossentropy'

다중분류 : loss  = 'categoricail_crossentropy'

 

sparse_binary / categoricail_crossentropy => 원-핫 인코딩 안해도 될때 sparse 사용!

 

model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

 

metrics에 대해 알아보자.

케라스는 모델이 훈련할 때 기본으로 에포크마다 손실값을 출력한다.

손실이 줄어드는 것을 보고 훈련이 잘 되는것을 볼 수 있지만 정확도까지 출력해주면 더 좋을것이다.

이를 위해 accuracy를 지정!

 

이제 다 끝났으니 훈련시켜보자.

model.fit(train_scaled, train_target, epochs = 20)

Epoch 1/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.3956 - accuracy: 0.8672
Epoch 2/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.3956 - accuracy: 0.8666
Epoch 3/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.3945 - accuracy: 0.8680
Epoch 4/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.3942 - accuracy: 0.8679
Epoch 5/5
1500/1500 [==============================] - 2s 1ms/step - loss: 0.3929 - accuracy: 0.8688

 

이제 검증세트 모델의 성능을 확인해보자 !!

model.evaluate(val_scaled, val_target)

375/375 [==============================] - 0s 882us/step - loss: 0.4426 - accuracy: 0.8518

검증세트 모델도 훈련데이터세트와 비슷한 accuracy를 나타냄을 볼 수 있다.

 

+ Recent posts