-
[딥러닝] 문제 종류에 따라 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 _________________________________________________________________
'딥러닝 공부하기' 카테고리의 다른 글
[딥러닝] 이미지 데이터가 부족할 때, 문제점과 해결 방법 (0) 2023.12.27 [딥러닝] CNN 활용하여 MNIST 예제 쉽게 따라하기 (0) 2023.12.27 [딥러닝] 개체명 인식 NER 초간단 실습 (1) 2023.12.21 [딥러닝] LSTM으로 초간단 감정분석 모델 만들어보기 (0) 2023.12.20 [딥러닝] MNIST 텐서플로우 예제 쉽게 따라하기 (1) 2023.12.19