import numpy as np
def sum_squares_error(pred, target):
# 오차제곱합
return 0.5 * np.sum((pred - target) ** 2)
def cross_entropy(pred, target):
# 교차 엔트로피 합
delta = 1e-7 # log 0을 계산할 수 없으므로, 아주 작은 값을 넣음
return -np.sum(target * np.log(pred + delta))
if __name__== "__main__":
target = np.array([0, 0, 1, 0, 0]) # 2가 정답
pred1 = np.array([0.1, 0.05, 0.6, 0.05, 0.2]) # 2 예측
pred2 = np.array([0.6, 0.1, 0.05, 0.2, 0.05]) # 0 예측
for func in [sum_squares_error, cross_entropy]:
print(func.__name__)
error1 = func(pred1, target)
error2 = func(pred2, target)
print(error1)
print(error2)
sum_squares_error
0.10750000000000003
0.6575
cross_entropy
0.510825457099338
2.9957302735559908
참고로 오차제곱합은 모든 벡터를 계산해서 값을 출력합니다.
하지만 교차엔트로피는 타겟 값이 0이면, 그냥 0을 출력하므로 실질적으로 타겟 값이 1인 인덱스와 예측 값의 인덱스가 일치하는 곳만 계산합니다.
(One-Hot Encoding의 경우)
그리고 log 0은 계산할 수 없으므로, 혹시 모르니 1e-7이라는 아주 작은 값을 추가해주도록 합니다.
감사합니다
지적 환영합니다.