ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Tensorflow Multilayer Perceptron 예시 코드(MLP, MNIST DataSet)
    Data Science/Tensorflow 2022. 10. 24. 23:13
    반응형

    1. 기본 세팅

    1.1 라이브러리

    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    import random
    import os

    1.2 랜덤시드 고정

    매번 동일한 결과를 가져오기 위한 랜덤시드 고정

    random.seed(1)
    np.random.seed(1)
    tf.random.set_seed(1)

    1.3 GPU 세팅

    os.environ["CUDA_VISIBLE_DEVICES"]="0"
    gpus = tf.config.experimental.list_physical_devices('GPU')
    if gpus:
        try:
            tf.config.experimental.set_memory_growth(gpus[0], True)
        except RuntimeError as e:
            print(e)

    2. Data Load

    본 포스팅에서 사용되는 MNIST 데이터셋은 손으로 쓰여진 0~9 숫자들의 이미지를 가지는 데이터셋이다.

    출처 위키백과 MNIST 데이터베이스

    tf.keras.datasets.mnist.load_data()를 통해서 MNIST 데이터셋을 받아올 수 있다.

    train set 60000개, test set 10000개의 이미지로 구성되어 있다.

    각 이미지는 28*28 픽셀로 이루어져있으며, 각 픽셀에는 해당하는 색정보가 숫자로 들어있다.

    (색정보는 0~255의 숫자로 표현된다.)

    (x_train, y_train),(x_test, y_test) = tf.keras.datasets.mnist.load_data()
    
    print(x_train.shape) #=> (60000, 28, 28)
    print(y_train.shape) #=> (60000,)
    print(x_train[0].shape) #=> (28, 28)
    
    print(x_test.shape) #=> (10000, 28, 28)

    3. 데이터 전처리(Data Preprocessing)

    3.1 데이터 형타입 변환

    float16, float32, float64에서 뒤의 숫자는 저장용량을 의미한다. (16bits, 32bits, 64bits)

    float32를 사용할시 64대비 적은 메모리용량을 차지하며 연산속도가 빨라진다.

    반면, 그만큼의 자세한 숫자표시를 할수 없기에 해결하고자하는 문제가 필요로하는 정확성과 가용한 하드웨어 자원을 고려하여 선택하면 된다.

    x_train = tf.cast(x_train,tf.float32)
    x_test = tf.cast(x_test,tf.float32)

    3.2 class 수 및 데이터 수 파악

    num_classes = len(set(y_train)) # MNIST는 10개의 class를 가진다.
    print(num_classes) #=> 10
    
    num_features = x_train.shape[1]*x_train.shape[2] # 28*28 이미지는 이미지당 784개의 피처를 가진다.
    print(num_features) #=> 784

    3.3 이미지 평탄화(Flatten images)

    이미지 데이터를 MLP에 넣기 위해서는 한 이미지가 하나의 array로 표현되어야 한다.

    reshape를 사용하여 이미지 평탄화를 수행한다.

    x_train = tf.reshape(x_train,[-1, num_features])
    x_test = tf.reshape(x_test,[-1, num_features])
    
    print(x_train.shape) #=> TensorShape([60000, 784])
    # 기존에 (60000, 28, 28) 차원에서 (60000, 784) 차원으로 변경되었다.

    3.4 Scaling

    MNIST 데이터는 픽셀별로 0~255의 숫자가 들어있기에, 255로 나누게되면 Min-Max Scaling과 동일한 효과를 낼수 있다.

    x_train = x_train / 255.
    x_test = x_test / 255.

    4. 모델 생성 및 학습

    4.1 모델 생성

    from tensorflow.keras import Model, layers
    
    class NeuralNet(Model): # tensorflow의 Model을 상속받는다
        def __init__(self):
            super(NeuralNet, self).__init__() # 상속
            
            # 256개의 ouput을 내는 Dense Layer 생성, 활성화함수 Relu
            self.fc1 = layers.Dense(256, activation=tf.nn.relu) 
            # 128개의 ouput을 내는 Dense Layer 생성, 활성화함수 Relu
            self.fc2 = layers.Dense(128, activation=tf.nn.relu) 
            # 10개의 ouput을 내는 Dense Layer 생성
            self.out = layers.Dense(num_classes) 
    
        def call(self, x, is_training=False): # 입력 x, MNIST 기준 x는 784개의 피처로 이루어짐 
    
            x = self.fc1(x) # layer1 : 784개의 피처가 fc1을 통과해 256개가 됨(Relu 적용)
            x = self.fc2(x) # layer2 : 256개의 피처가 fc2를 통과해 128개가 됨(Relu 적용)
            x = self.out(x) # out_layer : 128개의 피처가 out를 통과해 10개가 됨
            if not is_training: # 학습이 아닌 검증일경우 softmax를 씌워 class정보 반환
                x = tf.nn.softmax(x) 
            return x
    
    neural_net = NeuralNet()

    4.2 모델 컴파일(Model Complie)

    Tensorflow의 Model class를 상속받았기 때문에 complie을 통해서 모델 학습을 위한 손실함수, 최적화함수, 평가지표를 설정할수 있다.

    학습률(learning rate)는 최적화함수에서 설정 가능하다.

    neural_net.compile(loss = 'sparse_categorical_crossentropy', # 손실함수 설정
                       optimizer = tf.keras.optimizers.SGD(learning_rate=0.01), # 최적화 함수 설정
                       metrics = ['accuracy']) # 평가지표 설정

    4.3 모델 학습

    validation_data에는 validation set이 들어가야하지만, 해당포스팅에서는 별도로 준비하지 않아서 test set을 넣었다.

    history = neural_net.fit(x_train, y_train, 
                             epochs=5, # 반복학습 횟수
                             batch_size=64, # 1epoch에 모든 데이터를 한번에 돌리는게 아닌, batch로 나누어 돌림
                             validation_data=(x_test, y_test)) # 검증셋

    그림에서 총 5번의 반복학습이 이루어진것을 확인할수 있다.

    938/938의 의미는 총 938개의 batch로 나누어져 학습된것을 알수 있다.

    history 변수에 모델의 학습이력이 저장되어 추후 확인 가능하다.

    history.history

     

    5번 반복학습동안의 train/validation의 loss 및 accuracy를 확인할수 있다.

    5. 모델 테스트

    test set에 대한 loss와 accuracy를 반확한다.

    neural_net.evaluate(x_test, y_test)

    반응형

    댓글

Designed by Tistory.