# softmax function
import numpy as np
a = np.array([0.3, 2.9, 4.0])
exp_a = np.exp(a) # 지수 함수
print('exp_a : ', exp_a)
sum_exp_a = np.sum(exp_a)
print('sum_exp_a : ', sum_exp_a)
y = exp_a / sum_exp_a
print('y : ', y)
def softmax(a):
exp_a = np.exp(a) # 지수 함수
sum_exp_a = np.sum(exp_a) # 지수 함수의 합
y = exp_a / sum_exp_a # 결과
return y
exp_a : [ 1.34985881 18.17414537 54.59815003] sum_exp_a : 74.1221542101633 y : [0.01821127 0.24519181 0.73659691]
# 개선 전의 softmax function
a = np.array([1010, 1000, 990])
print('개선 전 : ', np.exp(a) / np.sum(np.exp(a))) # overflow error
# 개선된 softmax function
c = np.max(a) # 입력 신호 중 최댓값을 C로 선정
a -= c
print('개선 후 : ', np.exp(a) / np.sum(np.exp(a)))
개선 전 : [nan nan nan] 개선 후 : [9.99954600e-01 4.53978686e-05 2.06106005e-09]
C:\Users\hyosun\AppData\Local\Temp\ipykernel_10612\3128829623.py:3: RuntimeWarning: overflow encountered in exp print('개선 전 : ', np.exp(a) / np.sum(np.exp(a))) # overflow error C:\Users\hyosun\AppData\Local\Temp\ipykernel_10612\3128829623.py:3: RuntimeWarning: invalid value encountered in true_divide print('개선 전 : ', np.exp(a) / np.sum(np.exp(a))) # overflow error
a = np.array([0.3, 2.9, 4.0])
y = softmax(a)
print(y)
print(np.sum(y))
[0.01821127 0.24519181 0.73659691] 1.0
분류에서는 분류하고자 하는 class 수로 설정
위 그림에서 출력층 뉴런은 차례로 숫자 0~9에 대응