Data_study/Deep Learning

[Deep_learning] Multiclass_Classifiers 구현

onsemiro 2022. 7. 12. 03:04

Multiclass Classifiers는 앞 글에서 배운 Binary Classifiers와 다르게 다양한 class로 구별하려 할 때 사용한다.

sigmoid와 softmax의 개념들을 공부해서 알겠듯이, Multiclass Classifiers는 softmax를 layer로 활용하여 분류한다.

 

Softmax Layers

 

IO of softmax

우선 softmax의 input과 output을 확인해보자.

import tensorflow as tf

from tensorflow.keras.layers import Activation

logit = tf.random.uniform(shape = (1,5),minval=-10, maxval=10)

softmax_value = Activation('softmax')(logit)
print(softmax_value)
softmax_sum = tf.reduce_sum(softmax_value,axis=1) #축은 오른쪽 방향으로 향하며 더한다.
 
print("Logits :",logit.numpy())
print("Probabilities :",softmax_value.numpy())
print("Sum of softmax values :",softmax_sum) #probabilities를 다 더하면, 1이 나올 것이다.

 

softmax는 이론에서 배웠듯이 전 layer의 출력값을 logit으로 받아서 연산을 다음 layer 자체에서 진행한다.

logit & probabilities & sum of softmax values

 

랜덤으로 1행 5열의 logit을 세팅하고,

logit을 activation 함수중 softmax에 넣어 연산시켜 softmax_value를 얻었다.

그리고 softmax_value의 특징으로 모두 합하면, 1이라는 점을 확인할 수 있었다.

 

 

Softmax in Dense Layers

이제 Dense Layer에 넣어서 진행해보자.

여기서 인지해야하는 것은 마지막 layer는 분류하고 싶은 class의 개수만큼 neuron을 가지고 있어야 한다.

import tensorflow as tf

from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Activation

logit = tf.random.uniform(shape = (8,5),minval=-10, maxval=10)
dense = Dense(units = 8, activation = "softmax")
print(logit)
Y = dense(logit)
print(Y)
print(tf.reduce_sum(Y, axis = 1))

softmax Dense Layers

Dense layer에서도 볼 수 있듯이, probabilites의 각 행들을 각각 다 더하면 1씩 나온다는 것을 확인할 수 있다.

 

 

Multi-class Classifiers

 

위에서 학습한 softmax의 개념을 multi-class Classifiers에 활용해보자.

 

dense layers는 쌓아 올리지만, 마지막 layer에는 softmax layer로 구성하여 진행한다.

import tensorflow as tf

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense

class TestModel(Model):
    def __init__(self):
        super(TestModel,self).__init__()
        
        self.dense1 = Dense(units=8,activation="relu")
        self.dense2 = Dense(units=5,activation="relu")
        self.dense3 = Dense(units=3,activation="softmax")
    
    def call(self,X):
        print("X :{}\n{}\n".format(X.shape,X.numpy()))
        
        X= self.dense1(X)
        print("A1 :{}\n{}\n".format(X.shape,X.numpy()))
        
        X= self.dense2(X)
        print("A2 :{}\n{}\n".format(X.shape,X.numpy()))
        
        X= self.dense3(X)
        print("Y :{}\n{}\n".format(X.shape,X.numpy()))
        print("Sum of vectors: {}\n".format(tf.reduce_sum(X,axis = 1)))
        
        
model = TestModel()

X = tf.random.uniform(shape = (8,5),minval=-10,maxval=10)
Y = model(X)

아래는 출력 값.    *****각 데이터들의 shape를 확인해보자.*****

X :(8, 5)
[[ 5.8201838   8.689625    6.29101    -6.4356256   7.0250244 ]
 [-3.067627   -4.575901   -5.185468    0.1555109  -3.6201859 ]
 [ 9.738228   -5.2151036   6.5975685  -7.008815    1.0058231 ]
 [-6.6605783   4.8422165   2.3565435  -1.8858051   6.9234505 ]
 [ 0.21056938  6.214506   -4.6397734   1.3649158  -1.6912384 ]
 [ 7.6004753   2.776003    3.707407    8.090155    4.5494843 ]
 [-2.4836159  -1.5401287   2.9075813  -3.5951638  -2.6777983 ]
 [-7.4796534   5.244734   -0.34971428 -6.8714285   8.38879   ]]

A1 :(8, 8)
[[ 6.5897384   0.          4.9387116   0.          5.728498    0.
   0.          0.        ]
 [ 0.          0.          0.          2.4021602   0.          0.76295394
   3.9392114   0.5909818 ]
 [ 6.969769    4.223093    0.          0.          0.          1.0489982
   0.          0.8475483 ]
 [ 0.          0.          0.          0.          0.4556886   0.
   0.          4.516868  ]
 [ 0.          0.          5.3609123   0.          2.967144    0.
   2.380903    0.        ]
 [ 4.223317    7.4638686   5.3080425   0.         10.99218     1.0518494
   0.          0.        ]
 [ 0.          0.          0.          3.4543273   0.          1.4309348
   1.6070049   0.69152606]
 [ 0.          0.          0.          0.          0.          0.
   0.03716399  5.7290893 ]]

A2 :(8, 5)
[[5.954919   4.5589724  3.224318   0.         2.8242807 ]
 [0.         0.73251915 1.3408163  0.         0.985862  ]
 [1.9867371  3.3015442  1.735158   0.         3.0949697 ]
 [0.         1.8017914  0.         0.         2.5218337 ]
 [3.1874049  0.         1.9378774  0.         0.        ]
 [4.3264904  3.131473   0.         0.         0.        ]
 [0.         1.4844667  1.2144346  0.         2.1687894 ]
 [0.         2.0374405  0.         0.         3.2582822 ]]

Y :(8, 3)
[[0.03066766 0.8282625  0.14106981]
 [0.3316225  0.22711232 0.44126523]
 [0.24264884 0.44384277 0.3135084 ]
 [0.5215983  0.21826233 0.2601394 ]
 [0.181401   0.36157966 0.45701933]
 [0.00856389 0.9659701  0.02546604]
 [0.43512216 0.17882568 0.3860522 ]
 [0.6229705  0.14405702 0.2329725 ]]

Sum of vectors: [1. 1. 1. 1. 1. 1. 1. 1.]

 

 

처음 입력 데이터가 (8,5)였지만, dense layers로 인해 (8,8) -> (8,5) -> (8,3)으로 변화되는 shape를 확인할 수 있었다.

 

그리고 마지막에 한 행에 있는 값들을 모두 합한 것들은 각각 1 임도 확인할 수 있다.

 

3가지의 class 중 분류를 한다면 1행은 2번째 class가 82%로 높은 수치로 지목했다고 볼 수 있는 것이다.

 

마지막에 나오는 저 값들이 확률이라고 단정 지을 수는 없다.

 

이 부분은 불확실성(uncertainty)의 개념과 over-confidence의 개념들로 설명이 된다.

3 class 이외의 다른 class의 데이터를 입력하였는데, 3가지 class 중 비슷한 class로 분류를 한다면 매우 난감한 상황일 것이다.

이런 부분을 over-confidence라고 한다.

그렇기에, 이런 상황을 대비하기 위해 딥러닝에서 불확실성(uncertainty)을 고려해야 한다.

 

자세한 내용은 아래 링크에서 잘 설명해주신다.

https://gaussian37.github.io/dl-concept-bayesian_neural_network/

반응형