ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [딥러닝] 문제 종류에 따라 output layer 설계(Compile)하는 법
    딥러닝 공부하기 2023. 12. 19. 14:09

    우리가 풀어야 하는 문제가 회귀인지, 이진분류인지, 다중분류인지에 따라 output layer의 퍼셉트론 갯수와 output layer의 활성화 함수, 손실함수가 달라집니다. 손실함수는 또한 평가 지표로 연결됩니다.

     

    활성화함수의 그래프나 공식을 생각해보면 어떤 문제에서 활용해야 하는지 자연스럽게 외워집니다.

    - 이진분류에서는 시그모이드를 쓰는데 그 이유는 0과 1로 바꿔줘야 하기 때문입니다. 그래프를 생각하면 0과 1로 분류하기 쉽죠?

    - 다중분류는 softmax 함수를 사용하는데 입력 벡터의 각 요소를 지수 함수로 변환하고, 각 요소를 모든 요소의 합으로 나누어 확률 분포를 생성합니다. 합이 1이 되도록 하기 위해서이죠.

    - 회귀문제는 아무것도 건들 필요가 없습니다! 회귀 공식을 생각하면 가중치와 독립변수를 곱해서 더한 그 값 자체로 의미있는 것이니까요!

     

    또한 optimizer는 Adam, Adagrad, RMSProp 등 제일 성능 좋은 것을 사용하면 되지만, 회귀와 분류 모델의 성능 지표(metrics)는 다릅니다. 회귀 문제는 MSE, RMSE, MAE, R² 등을 사용하고, 분류문제는 정확도, 정밀도, 재현율, F1 score, roc-auc 등을 사용합니다.

     

    이것을 정리해서 모델을 compile 할 때, 무엇을 사용해야하는지 정리해보도록 하겠습니다.

    import tensorflow as tf
    from tensorflow.keras import models, layers, losses
    
    # 간단한 Sequential 모델 생성
    model = Sequential()
    model.add(Dense(units=64, activation='relu', input_dim=784, kernel_initializer='he_uniform'))
    model.add(layers.Dropout(0.2)) # Dropout-layer
    model.add(Dense(units=10, activation='softmax'))

     

    1. 회귀 output layer

    # Regression
    model.add(layers.Dense(units=1, activation=None))
    model.compile(optimizer='adam',
                  loss=losses.mean_squared_error,
                  metrics=['mean_squared_error'])

     

    2. 이진 분류 output layer

    # Binary Classification 1 (Softmax를 적용하는 경우, recommended)
    model.add(layers.Dense(units=2, activation='softmax'))
    model.compile(optimizer='adam',
                  loss=losses.categorical_crossentropy,
                  metrics=['accuracy'])
    # Binary Classification 2 (Sigmoid를 적용하는 경우)
    # 선형결합 결과에 대해 sigmoid function의 output을 계산해주면, binary_crossentropy가 이를 음성 & 양성 확률로 변환하여 처리해줍니다.
    model.add(layers.Dense(units=1, activation='sigmoid')) 
    model.compile(optimizer='adam',
                  loss=losses.binary_crossentropy, 
                  metrics=['accuracy'])

     

    3. 다중 분류 output layer

    # Multi-class classification
    # Label이 One-hot 형태일 경우
    model.add(layers.Dense(units=10, activation='softmax'))
    model.compile(optimizer='adam',
                  loss=losses.categorical_crossentropy, # <- Label이 One-hot 형태일 경우
                  metrics=['accuracy'])
    # Multi-class classification
    # Label이 One-hot 형태가 아닐 경우
    model.add(layers.Dense(units=10, activation='softmax'))
    model.compile(optimizer='adam',
                  loss=losses.sparse_categorical_crossentropy, # <- Label이 One-hot 형태가 아닐 경우
                  metrics=['accuracy'])

     

     

    ※ compile 후 모델 구조 확인하기

    또한 TensorFlow에서 Compile 하고 나서 보통 "model.summary()" 를 활용하여 모델의 구조를 확인합니다. (보통 데이터프레임 맨 처음에 df.describe(), df.info() 확인하듯이요! )

    "model.summary()" 메서드를 호출하면 모델의 층(layer) 구성, 각 층의 출력 크기, 파라미터 수 등을 확인할 수 있습니다.

    model.summary()
    
    # Result
    Model: "sequential"
    _________________________________________________________________
     Layer (type)                Output Shape              Param #   
    =================================================================
     dense (Dense)               (None, 256)               200960    
                                                                     
     batch_normalization (BatchN  (None, 256)              1024      
     ormalization)                                                   
                                                                     
     activation (Activation)     (None, 256)               0         
                                                                     
     dropout (Dropout)           (None, 256)               0         
                                                                     
     dense_1 (Dense)             (None, 256)               65792     
                                                                     
     batch_normalization_1 (Batc  (None, 256)              1024      
     hNormalization)                                                 
                                                                     
     activation_1 (Activation)   (None, 256)               0         
                                                                     
     dropout_1 (Dropout)         (None, 256)               0         
                                                                     
     dense_2 (Dense)             (None, 10)                2570      
                                                                     
    =================================================================
    Total params: 271,370
    Trainable params: 270,346
    Non-trainable params: 1,024
    _________________________________________________________________
Designed by Tistory.