Data Analysis & ML/Deep Learning

[Deep Learning][딥러닝] 딥러닝 구현

YSY^ 2020. 9. 22. 14:36

MNIST 이미지 분류

  • MNIST(Modified National Institute of Standards and Technology) database
  • 흑백 손글씨 숫자 0-9까지 10개의 범주로 구분해놓은 데이터셋
  • 하나의 이미지는 28 * 28 pixel 의 크기
  • 6만개의 Train 이미지와 1만개의 Test 이미지로 구성됨.
import tensorflow as tf
from tensorflow import keras

tf.__version__  #'2.1.0'
keras.__version__ #'2.2.4-tf'

텐서플로우는 GPU를 사용하는 2.0이상 버전을 설치해야함

# MNIST dataset 조회
(train_image, train_label), (test_image, test_label) = keras.datasets.mnist.load_data()

type(train_image), type(train_label)  #(numpy.ndarray, numpy.ndarray)

# 데이터셋의 0번축은 항상 데이터 개수.
# 1축: 높이(height), 2축: 너버(width)
train_image.shape, test_image.shape  # ((60000, 28, 28), (10000, 28, 28))

train_label.shape, test_label.shape # ((60000,), (10000,))
import matplotlib.pyplot as plt
plt.figure(figsize=(15,5))
for idx in range(5):
    plt.subplot(1,5, idx+1)
    plt.imshow(train_image[idx], cmap='Greys')
    plt.axis('off')

 

신경망 구현

network : 전체 모델 구조 만들기

model = keras.models.Sequential()
model.add(keras.layers.Flatten(input_shape=(28,28)))
model.add(keras.layers.Dense(256, activation='relu'))
model.add(keras.layers.Dense(128, activation='relu'))
model.add(keras.layers.Dense(10, activation='softmax'))

2828256 + 256 = 200960

컴파일 단계

  • 구축된 모델에 추가 설정
  • 손실함수
  • Optimizer(최적화 함수)
  • 평가지표
model.compile(optimizer="adam", loss="categorical_crossentropy", metrics=['accuracy'])

데이터 준비

X

  • 28 by 28 행렬(2D 텐서) 형태의 이미지를 28*28 의 Vector(1d 텐서)로 변환
  • 0 ~ 1 사이의 값으로 정규화 시킨다.

y

  • one hot encoding 처리
  • tensorflow.keras 의 to_categorical() 함수 이용
import numpy as np
np.max(train_image), np.min(train_image) #(1.0, 0.0)

# X를 정규화
train_image = train_image/255
test_image = test_image/255

# Y를 one hot encoding
train_label = keras.utils.to_categorical(train_label)
test_label = keras.utils.to_categorical(test_label)

train_label.shape, test_label.shape # ((60000, 10), (10000, 10))

학습 (fit)

model.fit(train_image, train_label,
          epochs=10,  #60000개 데이터셋(총데이터셋)을 10번 반복해서 학습시켜라.
          validation_split=0.3,
          batch_size=100
         )

 

테스트셋 평가

분류

  • predict()
    • 각 클래스 별 확률 반환
  • predict_class()
    • 클래스(범주값) 반환
    • tensorflow 2.3 부터 deprecated 됨
  • 이진 분류(binary classification)
    • numpy.argmax(model.predict(x) > 0.5).astype("int32")
  • 다중클래스 분류(multi-class classification)
    • numpy.argmax(model.predict(x), axis=-1)
test_image[0].shape  # (28, 28)

test_image[0][np.newaxis,...].shape #(1, 28, 28)

model.predict(test_image[0][np.newaxis,...])
# ==> array([[1.1705486e-19, 4.5926505e-20, 3.4147051e-17, 3.3313310e-17,
        4.9706317e-21, 5.3647841e-21, 4.0810197e-27, 1.0000000e+00,
        4.5106268e-21, 3.6231668e-10]], dtype=float32)

model.predict_classes(test_image[0][np.newaxis,...])
# array([7], dtype=int64)






728x90
반응형