본문 바로가기
DeepLearning Framework & Coding/Tensorflow 2.X

[코드로 이해하는 딥러닝 2-9] - MNIST를 DNN으로 학습시키기/ReLU

by 노마드공학자 2021. 1. 13.

※ Tensorflow1문법을 2로만 바꾸는것이기에, 코드분석 위주로 진행하고있습니다.

[Tensorflow1 링크종합] https://limitsinx.tistory.com/50

 

 

※ 이 전글에서 정리한 코드/문법은 재설명하지 않으므로, 참고부탁드립니다.

코드만 해석하고 넘어가기에 다소 불친절한 글 일수 있습니다..

   개념적인 부분은 하기 링크에 따로 정리해두어, 참조 부탁드립니다.

https://limitsinx.tistory.com/39

 

[코드로 이해하는 딥러닝 11-EX] - MNIST를 DNN으로 학습해보기/Adam optimizer

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27 [코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 [코드로 이해하는 딥러닝 2] - Tensorflow 변..

limitsinx.tistory.com

https://limitsinx.tistory.com/40

 

[코드로 이해하는 딥러닝 12] - ReLU(Rectified Linear Unit)

[코드로 이해하는 딥러닝 0] - 글연재에 앞서 https://limitsinx.tistory.com/27 [코드로 이해하는 딥러닝 1] - Tensorflow 시작 https://limitsinx.tistory.com/28 [코드로 이해하는 딥러닝 2] - Tensorflow 변..

limitsinx.tistory.com

 

이번에는 머신러닝 학습데이터 중, C언어의 Hello world와 쌍벽인 MNIST 데이터를 가지고

 

DWNN 및 ReLU activation function을 사용하여 학습을 진행해보겠습니다.

 

이 부분에 대한 개념적인 내용은 상기링크 참고부탁드리며, 하기 글은 코드분석 위주로 진행됩니다.

 

 

[코드 전문]

 

import numpy as np

import random

import tensorflow as tf

 

random.seed(777)  # for reproducibility

learning_rate = 0.001

batch_size = 100

training_epochs = 15

nb_classes = 10

 

(x_train, y_train), (x_test2, y_test) = tf.keras.datasets.mnist.load_data()

print(x_train.shape)

 

x_train = x_train.reshape(x_train.shape[0], 28 * 28)

x_test = x_test2.reshape(x_test2.shape[0], 28 * 28)

 

y_train = tf.keras.utils.to_categorical(y_train, nb_classes)

y_test = tf.keras.utils.to_categorical(y_test, nb_classes)

 

tf.model = tf.keras.Sequential()

tf.model.add(tf.keras.layers.Dense(input_dim=784units=256activation='relu'))

tf.model.add(tf.keras.layers.Dense(units=256activation='relu'))

tf.model.add(tf.keras.layers.Dense(units=nb_classes, activation='softmax'))

tf.model.compile(loss='categorical_crossentropy',

                 optimizer=tf.keras.optimizers.Adam(lr=learning_rate), metrics=['accuracy'])

tf.model.summary()

 

tf.model.fit(x_train, y_train, batch_size=batch_size, epochs=training_epochs)

 

# predict 10 random hand-writing data

y_predicted = tf.model.predict(x_test)

for x in range(010):

    random_index = random.randint(0, x_test.shape[0]-1)

    print("index: ", random_index,

          "actual y: ", np.argmax(y_test[random_index]),

          "predicted y: ", np.argmax(y_predicted[random_index]))

 

# evaluate test set

evaluation = tf.model.evaluate(x_test, y_test)

print('loss: ', evaluation[0])

print('accuracy', evaluation[1])

 

 

[코드 분석-1]

Tensorflow 2에서는  mnist load_data를 할때 x_train, x_test를 상기와 같이 코드를 짜주면 알아서 분리해서 저장을 해주고 있습니다.

 

① x_train = x_train.reshape(x_train.shpae[0], 28 * 28)

: x_train.shape[0]을 6만인데, MNIST data가 총 6만개의 이미지인것을 의미합니다.

 

즉, 행이 6만개이고, 열이 28*28개인 array형태로 저장하는것을 의미합니다.

 

② y_train = tf.keras.utils.to_categorical(y_train, nb_classes)

: MNIST는 0~9까지의 이미지 10장을 classification 하는것이므로, nb_classes는 10인데

y_train값을 10개의 클래스에 맞게 매핑(one hot encoding)하는 코드입니다.

 

 

[코드 분석-2]

Adam Optimizer와 categorical_Crossentropy loss function으로 모델링 되어있으며,

input layer는 784(=28*28), output은 256개로 축소시키고 ReLU를 통과시킨후

256 input 256 output,ReLU의 hidden layer를 1번더 통과시키고

마지막으로 10개의 class로 multi classification을 하는 과정입니다.

 

 

[결과값]

약 96%정도의 정확도를 보여주고 있으며, 이정도면 사람이 분류하는 정도라고 보시면 됩니다.

즉, CNN을 쓰지않고 일반적인 Deep and Wide Neural Network로도 충분히 괜찮은 성과를 낼 수 있다는것을 확인할 수 있습니다.

댓글