딥러닝 모델의 학습 지표
지표란?
강아지, 고양이, 말을 예측하는 문제면 가 3
MNIST 손글씨 데이터 셋이면 가 10
MSE
를 사용하지 않고 Cross Entropy Error
를 활용Cross Entropy Error
가 MSE
보다 훨씬 효율적이기 때문MSE
를 배우는 이유는
- 회귀 문제를 풀기에 적합
- 단순하게
loss
에 대한 공부가 쉽기 때문에
MSE
를 미분 했을 때 남는 것은 순수한 오차라고 할 수 있는 만 남기 때문에import numpy as np
y = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 60%
t = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # 정답은 2라는 이야기 이다. 클래스의 개수만큼 One Hot Encoding이 되어있는 상태
# 각 클래스 별 순수한 오차
y - t
~~>
array([ 0.1 , 0.05, -0.4 , 0. , 0.05, 0.1 , 0. , 0.1 , 0. ,0. ])
def mean_squared_error(y, t):
return 0.5 * np.sum((y-t)**2)
print('정답을 2로 추정했을 때의 MSE 값( 0.6 ) : {:3.f}' .format(mean_squared_error(y, t)))
~~> 정답을 2로 추정했을 때의 MSE 값( 0.6 ) : 0.098
y = np.array([[0.0, 0.05, 0.8, 0.0, 0.05, 0.0, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 80%
print('정답을 2로 추정했을 때의 MSE값( 0.8 ) : {:.3f}' .format(mean_squared_error(y, t)))
~~> 정답을 2로 추정했을 때의 MSE값( 0.8 ) : 0.027
y = np.array([0.0, 0.8, 0.05 , 0.0, 0.05, 0.0, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 5%, 1번 클래스로의 예측은 80%
print("정답을 1로 추정했을 때의 MSE값( 2로 추정한 확률 : 0.05 ) : {:.3f}".format(mean_squared_error(y, t)))
~~> 정답을 1로 추정했을 때의 MSE값( 2로 추정한 확률 : 0.05 ) : 0.777
y = np.array([0.0, 0.05, 0.8, 0.0, 0.05, 0.0, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 80%
t = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # 정답은 2라는 이야기 이다. 클래스의 개수만큼 One Hot Encoding이 되어있는 상태
print('정답을 2로 추정했을 때의 MSE 값( 0.8 ) : {:.3f}' .format(mean_squared_error(y, t)))
~~> 정답을 2로 추정했을 때의 MSE 값( 0.8 ) : 0.027
y = np.array([0.0, 0.8, 0.05, 0.0, 0.05, 0.0, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 5%, 1번 클래스로의 예측은 80%
t = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # 정답은 2라는 이야기 이다. 클래스의 개수만큼 One Hot Encoding이 되어있는 상태
print('정답을 2로 추정했을 때의 MSE 값( 0.05 ) : {:.3f}' .format(mean_squared_error(y, t)))
~~> 정답을 2로 추정했을 때의 MSE 값( 0.05 ) : 0.777
def cross_entropy_error(y, t):
delta = 1e-7
# ㄴ delta : 아주 작은 값, log 0은 음수 무한대가 되기 때문에 아주 작은 값은 delta를 임의로 더해준다.
return -np.sum(t*np.log(y+delta))
💡 np.log
함수에 0이 대입되면 ( 즉 예측값 , 가 0 이면 ) 음수 무한대가 되어 버린다. 따라서 아주 작은 값인 delta
를 더해준다.
t = np.array([0, 0, 1, 0, 0, 0, 0, 0, 0, 0]) # 정답은 2라는 이야기 이다. 클래스의 개수만큼 One Hot Encoding이 되어있는 상태
y = np.array([0.1, 0.05, 0.6, 0.0, 0.05, 0.1, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 60%
print("정답을 2로 추정했을 때의 CEE값(0.6) : {:.3f}".format(cross_entropy_error(y, t)))
y = np.array([0.1, 0.05, 0.8, 0.0, 0.05, 0.0, 0.0, 0.0, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 80%
print("정답을 2로 추정했을 때의 CEE값(0.8) : {:.3f}".format(cross_entropy_error(y, t)))
y = np.array([0.7, 0.05, 0.1 , 0.0, 0.05, 0.0, 0.0, 0.1, 0.0, 0.0]) # 2번 클래스로의 예측 확률이 10%, 0번 클래스로 예측한 확률이 70%
print("정답을 0로 추정했을 때의 CEE값( 2로 추정한 확률은 0.1 ) : {:.3f}".format(cross_entropy_error(y, t)))
~~>
정답을 2로 추정했을 때의 CEE값(0.6) : 0.511
정답을 2로 추정했을 때의 CEE값(0.8) : 0.223
정답을 0로 추정했을 때의 CEE값( 2로 추정한 확률은 0.1 ) : 2.303