본문 바로가기

AI/Deep Learning

[딥러닝] Neural Network : FashoinMNIST Classifier - 컴도리돌이

728x90
728x90
 

텐서플로우로 시작하는 딥러닝 기초

부스트코스 무료 강의

www.boostcourse.org

Package Load

import os
import time
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

import tensorflow as tf
from tensorflow.keras import layers
  • numpy: Scientific computing과 관련된 여러 편리한 기능들을 제공해주는 라이브러리.
  • matplotlib.pyplot: 데이터 시각화
  • tensorflow: Tensor Flow를 로드.
  • tensorflow.keras.layers: 모델의 각 Layer들을 만들기 위해 사용.

하이퍼파라미터 세팅

학습에 필요한 하이퍼파라미터의 값을 초기화한다. 하이퍼파라미터는 뉴럴네트워크를 통하여 학습되는 것이 아니라 학습률(laerning rate), 사용할 레이어의 수 등 설계자가 결재해줘야 한다.

 

배치의 크기(batch_size), 학습 할 epoch 수(max_epochs), 학습률(learning_rate)등의 값들을 다음과 같이 임의로 할당.

batch_size = 128
max_epochs = 5
learning_rate = 0.001
num_classes = 10

 

dataset load 및 tf.date.dataset 구축

# Load training and eval data from tf.keras
(train_data, train_labels), (test_data, test_labels) = \
    tf.keras.datasets.fashion_mnist.load_data()

train_data = train_data / 255.
train_data = train_data.reshape([-1, 28 * 28])
train_data = train_data.astype(np.float32)
train_labels = train_labels.astype(np.int32)

test_data = test_data / 255.
test_data = test_data.reshape([-1, 28 * 28])
test_data = test_data.astype(np.float32)
test_labels = test_labels.astype(np.int32)
  • FashionMNIST 데이터는 tf.keras.datasets에서 기본 제공.
  • 아래 코드블록의 5번째 줄은 train_data의 값의 범위인 [0, 255]의 범위를 [0, 1]의 범위로 조절.
  • 6번째 줄은 이미지 형태의 (28(높이), 28(너비)) 데이터를 네트워크의 입력으로 넣기 위해 1차원의 28*28=784 데이터로 변경.
  • 10번째 줄부터 train_data를 변환한 방식으로 test_data를 변환.
 

GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark

A MNIST-like fashion product database. Benchmark :point_down: - GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark

github.com

 

tf.data.Dataset을 이용하여 input pipline 구축

# for train
N = len(train_data)

train_dataset = tf.data.Dataset.from_tensor_slices((train_data,train_labels))
train_dataset = train_dataset.shuffle(100)
train_dataset = train_dataset.batch(batch_size)
train_dataset = train_dataset.repeat(max_epochs)

print(train_dataset)

# for test
test_dataset = tf.data.Dataset.from_tensor_slices((test_data,test_labels))
test_dataset = test_dataset.batch(batch_size)
test_dataset = test_dataset.repeat(max_epochs)

print(test_dataset)
  • tf.data.Dataset.from_tensor_slices API를 이용하여 train_data 및 train_labels데이터를 tf.data.Dataset 형태로 생성.마찬가지로 test_data, test_labels데이터도 tf.data.Dataset 형태로 생성. 
  • tf.data.Dataset.shuffle: 데이터셋을 shuffle.
  • tf.data.Dataset.batch: 데이터셋의 batch_size를 결정.
  • tf.data.Dataset.repeat: 데이터셋을 다 사용하더라도 반복 결정.
 

tf.data.Dataset  |  TensorFlow Core v2.6.0

Represents a potentially large set of elements.

www.tensorflow.org

 

데이터 샘플 시각화

FashionMNIST는 MNIST와 마찬가지로 총 10개의 클래스로 구성되어 있으며 티셔츠, 바지 등 패션과 관련된 아이템들을 28 × 28 크기의 흑백 이미지로 구성한 데이터셋 이다.

아래의 코드 블록은 Fashion-MNIST 데이터를 시각화한다.

labels_map = {0: 'T-Shirt', 1: 'Trouser', 2: 'Pullover', 3: 'Dress', 4: 'Coat',
              5: 'Sandal', 6: 'Shirt', 7: 'Sneaker', 8: 'Bag', 9: 'Ankle Boot'}
columns = 5
rows = 5
fig = plt.figure(figsize=(8, 8))

for i in range(1, columns*rows+1):
    data_idx = np.random.randint(len(train_data))
    img = train_data[data_idx].reshape([28, 28])
    label = labels_map[train_labels[data_idx]]

    fig.add_subplot(rows, columns, i)
    plt.title(label)
    plt.imshow(img, cmap='gray')
    plt.axis('off')
plt.show()

모델 만들기

model = tf.keras.Sequential() # Sequential 모델 생성

model.add(tf.keras.layers.Flatten(input_dim = 784))
model.add(tf.keras.layers.Dense(512,activation="relu"))
model.add(tf.keras.layers.BatchNormalization())
model.add(tf.keras.layers.ReLU())
model.add(tf.keras.layers.Dense(10,activation="softmax"))
  • Dense : 일반적인 완전 연결(densely-connected) 레이어
  • BatchNormalization : 배치 노말라이제이션 레이어
  • ReLU : ReLU 활성화 함수 레이어
 

tf.keras.layers.Dense  |  TensorFlow Core v2.6.0

Just your regular densely-connected NN layer.

www.tensorflow.org

 

tf.keras.layers.ReLU  |  TensorFlow Core v2.6.0

Rectified Linear Unit activation function.

www.tensorflow.org

 

tf.keras.layers.BatchNormalization  |  TensorFlow Core v2.6.0

Layer that normalizes its inputs.

www.tensorflow.org

 

데이터의 일부를 넣어서 모델 체크 및 요약하기

for images, labels in train_dataset.take(1):
  print("predictions: ", model(images[0:3]))
  
model.summary()
predictions:  tf.Tensor(
[[0.21350156 0.13173366 0.09303766 0.02701016 0.10155538 0.05713984
  0.12158073 0.08974813 0.0896612  0.07503174]
 [0.12742934 0.15420572 0.12073153 0.05624721 0.12699616 0.07270162
  0.09469259 0.07258539 0.10605622 0.06835426]
 [0.17587785 0.08923236 0.09938379 0.02737587 0.14121981 0.07377707
  0.09433681 0.09706298 0.14461823 0.05711522]], shape=(3, 10), dtype=float32)
  
  
  Model: "sequential_12"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
flatten_12 (Flatten)         (None, 784)               0         
_________________________________________________________________
dense_238 (Dense)            (None, 512)               401920    
_________________________________________________________________
batch_normalization_115 (Bat (None, 512)               2048      
_________________________________________________________________
re_lu_109 (ReLU)             (None, 512)               0         
_________________________________________________________________
dense_239 (Dense)            (None, 10)                5130      
=================================================================
Total params: 409,098
Trainable params: 408,074
Non-trainable params: 1,024
_________________________________________________________________

 

Loss function 및 optimizer 정의

# model compile with optimizer, loss, metrics

model.compile(optimizer = tf.keras.optimizers.Adam(learning_rate= 0.001), 
              loss = "sparse_categorical_crossentropy", 
              metrics = ["accuracy"])
 

tf.keras.optimizers.Adam  |  TensorFlow Core v2.6.0

Optimizer that implements the Adam algorithm.

www.tensorflow.org

 

tf.keras.Model  |  TensorFlow Core v2.6.0

Model groups layers into an object with training and inference features.

www.tensorflow.org

 

tf.keras.losses.SparseCategoricalCrossentropy  |  TensorFlow Core v2.6.0

Computes the crossentropy loss between the labels and predictions.

www.tensorflow.org

 

Training

model.fit(train_dataset,epochs=10)

###
Epoch 1/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0043 - accuracy: 0.9986
Epoch 2/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0031 - accuracy: 0.9991
Epoch 3/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0036 - accuracy: 0.9988
Epoch 4/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0047 - accuracy: 0.9985
Epoch 5/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0035 - accuracy: 0.9989
Epoch 6/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0039 - accuracy: 0.9988
Epoch 7/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0040 - accuracy: 0.9989
Epoch 8/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0032 - accuracy: 0.9990
Epoch 9/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0037 - accuracy: 0.9989
Epoch 10/10
2345/2345 [==============================] - 10s 4ms/step - loss: 0.0042 - accuracy: 0.9986
<keras.callbacks.History at 0x7fab61885390>
###
 

tf.keras.Model  |  TensorFlow Core v2.6.0

Model groups layers into an object with training and inference features.

www.tensorflow.org

 

output

test_batch_size = 100
batch_index = np.random.choice(len(test_data), size=test_batch_size, replace=False)

batch_xs = test_data[batch_index]
batch_ys = test_labels[batch_index]
y_pred_ = model(batch_xs, training=False)

fig = plt.figure(figsize=(10, 10))
for i, (px, py, y_pred) in enumerate(zip(batch_xs, batch_ys, y_pred_)):
    p = fig.add_subplot(10, 10, i+1)
    if np.argmax(y_pred) == py:
        p.set_title("{}".format(labels_map[py]), color='blue')
    else:
        p.set_title("{}/{}".format(labels_map[np.argmax(y_pred)],
                               labels_map[py]), color='red')
    p.imshow(px.reshape(28, 28))
    p.axis('off')

Summary

  • Multi layer perceptron을 설계할 수 있다.
  • 네트워크에 ReLU, Batch normalization를 적용할 수 있다.
  • tf.data.Dataset을 이용하여 데이터 입력 파이프라인(input pipeline)을 만들 수 있다.
  • 손실 함수(loss function)와 옵티마이져(optimizer)를 정의할 수 있다.
  • 손실(loss)을 측정하고 경사(gradient)를 계산해 모델 파라미터를 업데이트할 수 있다.
  • 학습한 모델의 성능을 테스트할 수 있다.
728x90
728x90