본문 바로가기
DL

softmax 함수

by geewon_v 2023. 11. 27.

 

 

소프트맥스 함수

출력층에서 사용되는 함수이다.

다중 클래스 분류 모델을 만들 때 사용한다.
결과를 확률로 해석할 수 있게 변환해주는 함수로 높은 확률을 가지는 class로 분류한다.
이는 결과값을 정규화시키는 것으로도 생각할 수 있다. 






 

 

 

 

이항분류 = sigmoid

다항분류 = softmax

 

 

 

 

label은 one_hot encoding 해준다.

 

 

 

from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.optimizers import Adam 
from keras.callbacks import EarlyStopping, ModelCheckpoint
import pandas as pd 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from tfpack1.tf7linearmodel import new_pred

np.random.seed(1)

# dataset 작성 
xdata = np.random.random((1000,12))     # 임의의 과목에 대한 시험 점수라 가정 
ydata = np.random.randint(5,size=(1000,1))     # 시험 과목은 5개 국어:0 ~ 체육:4라고 가정 
print(xdata[:2])    # feature
print(ydata[:2])    # label
ydata = to_categorical(ydata, num_classes=5 )
print(ydata[:2])
print([np.argmax(i) for i in ydata[:2]])

model = Sequential()
model.add(Dense(units=32, input_shape=(12,), activation='relu'))
model.add(Dense(units=16, activation='relu'))
model.add(Dense(units=5, activation='softmax'))
print(model.summary())

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

history = model.fit(xdata, ydata, epochs=1000, batch_size=32, verbose=2, shuffle=True)
print('모델 평가 :', model.evaluate(xdata, ydata, batch_size=32, verbose=0))

# 시각화
plt.plot(history.history['loss'], label='loss')
plt.xlabel('epochs')
plt.legend()
plt.show()

plt.plot(history.history['accuracy'], label='accuracy')
plt.xlabel('epochs')
plt.legend()
plt.show()

# 기존 값으로 분류 예측
print('예측 값: ', model.predict(xdata[:5])) 
print('예측 값: ', [np.argmax(i) for i in model.predict(xdata[:5])])
print('실제 값: ', ydata[:5])
print('실제 값: ', [np.argmax(i) for i in ydata[:5]])

print()

x_new = np.random.random([1,12])
print(x_new)
new_pred = model.predict(x_new)
print('분류 결과 : ', new_pred)
print('분류 결과 합 : ', np.sum(new_pred))
print('분류 결과 : ', np.argmax(new_pred))

# 시험 과목은 5개 국어:0 ~ 체육:4라고 가정
kwamok = np.array(['국어','영어','수학','과학','체육'])
print('예측값 :', kwamok[np.argmax(new_pred, axis=-1)])
print('실제값 :', kwamok[np.argmax(x_new, axis=-1)])

 

 

 

 

예측 값:  [[0.0049897  0.09782635 0.76440924 0.0510099  0.08176483]
 [0.5240844  0.13038172 0.13436493 0.17755787 0.03361109]
 [0.02071039 0.17249607 0.06056168 0.09994956 0.6462824 ]
 [0.4503509  0.28622675 0.05149255 0.01998496 0.19194482]
 [0.27250355 0.55922943 0.02669953 0.048224   0.09334352]]

1/1 [==============================] - ETA: 0s
1/1 [==============================] - 0s 30ms/step
예측 값:  [2, 0, 4, 0, 1]
실제 값:  [[0. 0. 1. 0. 0.]
 [1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 1.]
 [0. 1. 0. 0. 0.]]
실제 값:  [2, 0, 4, 4, 1]

[[0.99873806 0.01294349 0.71052984 0.13255429 0.99291639 0.14973301
  0.57583561 0.64729965 0.74251176 0.57901775 0.52428147 0.85870666]]

1/1 [==============================] - ETA: 0s
1/1 [==============================] - 0s 34ms/step
분류 결과 :  [[2.5154047e-02 6.3741606e-01 1.9249927e-01 1.4493047e-01 2.5362030e-07]]
분류 결과 합 :  1.0000001
분류 결과 :  1
예측값 : ['영어']
실제값 : ['국어']

 

# 시각화 

 

 

'loss'

 

 

 

 

 

 

 

'accuracy'

 

 

 

 

 

 

 

 

[출처]

https://jjeongil.tistory.com/977

https://syj9700.tistory.com/38

'DL' 카테고리의 다른 글

CNN  (0) 2023.11.28
이미지 분류 : MNIST  (0) 2023.11.28
TensorFlow 2.0을 사용하여 Keras 모델을 생성하는 3가지 방법  (0) 2023.11.24
활성화 함수 - 시그모이드(Sigmoid) / 렐루(Relu) 함수  (1) 2023.11.23
Keras란?  (1) 2023.11.22