4.2.4 (배치용) 교차 엔트로피 오차 구현하기

반응형

내갸 이 부분부터 도저히 이해가 되지 않았는데

오늘 오후에 드디어 이해해서 적는다 언제 다시 까먹고 멍청해 질지 모르니까

def cross_entropy_error(y, t):
    delta = 1e-7
    if y.ndim == 1:
        t = t.reshape(1, t.size)
        y = y.reshape(1, y.size)
    batch_size = y. shape[0]
    return -np.sum(np.log(y[np.arange(batch_size), t] + delta)) / batch_size

요 친구가 문제의 친구였다.

결정적으로 y[np.arange(batch_size), t]

이 친구가 가장 문제였다.

근데 차근차근 따져 보니 첨부터 이해가 되지 않았다.

reshape(1, y.size)

아니 대충보면 1차원이라면 reshape 하는데 

구글링하니까 reshape가 차원을 변경한단다

1차원인데 1차원으로 바꾼다고???

이개 뭔 소린지

내가 점점 먼청해지는 곤가?? 답답해 미칠지경이었는데 

저 함수 친구도 입력값이 필요하니까

암거나 만들었다.

y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0 ].  # 이 친구는출력 된 확률 값이라 가정했다.

t = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. #책에서 처럼 원-핫 인코딩이 아니라 숫자 레이블로 주었다. 일단은....

y = [0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0 ]
t = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
a = cross_entropy_error(y,t)
print(a)

실행하면 역시나 역시나 오류가 나는데

Traceback (most recent call last):
  File "/Users/anbyeong-ug/Desktop/Hello_Ai/ml.py", line 82, in <module>
    a = cross_entropy_error(y,t)
  File "/Users/anbyeong-ug/Desktop/Hello_Ai/ml.py", line 66, in cross_entropy_error
    if y.ndim == 1:
AttributeError: 'list' object has no attribute 'ndim'

마지막 줄을 보면 리스트라 차원을 확인할 수 없단다.

그래서 리스트 타입인 두 친구 y, t를 배열로 변경했다.

y = np.array([0.1, 0.05, 0.1, 0.0, 0.05, 0.1, 0.0, 0.6, 0.0, 0.0 ])

t = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

그랬더니 성공적이다.

 

cross_entropy_error()를 살펴보면

내 필기에서 말하듯이 배열이라 이제는 차원확인이 가능하고 

reshape를 통해 배열도 행렬로 반환하여

아래 return에서 문법에 오류가없다.

if y.ndim == 1은

배열을 판단하는 것인데 물론 배열이기에 데이터 하나에 대하여 오차를 구하는 이친구는

행렬로 변환하여야 한다.

2차원이상은 향렬의 형태로 적용이 되기에 1차원인지만 확인하는것으로 이해하고 넘어갔다.

물론 내 생각을 정리하는 것이라 충분히 잘못 이해한 것일 수도 있지만 나의 스트레스를 해소?하기 위해 그렇게 이해했다.

사실 이것 때문에 거의 하루종일 고민했다.

y.shape[0]는 (행,렬)로 표현이 되고 

데이터가 2 이상이면 행이 그 숫자를 대변하여 

배치 사이즈를 입력받았다.

 

이제 대망의

return -np.sum(np.log(y[np.arange(batch_size), t] + delta)) / batch_size

을 살펴보면 ㅎㄷㄷ 나를 정말 고통스럽게 했던

나의 진행을 막았던 아주 못된 녀석이다.

np.log는 그냥 계산이니 넘어간다.

문제의 y[np.arange(batch_size), t]

정말 받아들이기 힘들었다.

도대체가 무슨 형태인지 흠..........

np.arange(batch_size)는 배열 생성인건 누구나 안다.

그럼 풀어적으면(배치 사이즈 5 가정)

ex).          y[array([0, 1, 2, 3, 4]), array([2, 7, 0, 9, 4])

이건데 무슨 형태인지 알 수가 없다.

책에서는 y[0,2], y[1,7],..., y[4,4]로 표현 된다길래

그냥 배열의 관점에서 

y[[배열], [배열]]의 형태가 각 요소들로 나누어 인식된다는 것으로 받아들이기로 했다.

y[a, b] 는 예시 코드를 만들어서 확인해보니

a행 b열의 값을 보여줬다

y[np.arange(batch_size), t]

t의 경우 살펴보니 이 친구는 데이터가 몇개가 있던지

무조건 순서대로 0~9의 값을 가진다(mnist의 경우)

그래서 이 t의 정답 레이블은 y출력값의 열적 측면에서 데이터당 정답인 레이블의 위치를 대변할 수 있다.

이 책을 읽으면서 만난 짜증나는 일진 친구였는데 싸우다가 내가 이겼다.

이제 내가 짱이다 ㅋㅋㅋㅋㅋㅋ


하루 종일 싸우다 이겼다.

어딜 찾아봐도 내가 이해할 만큼 쉽게 설병 된 곳이 없어서

나 같은 초보가(바보가) 존재 한다면 도움을 받았으면 해서 적는다.

사실 앞의 글들도 이거 적을르고 밑밥 깐거다.

ㅋㅋㅋㅋㅋㅋ 기본적으로 

작심3일을 버티지 못하고 포기하고 또 작심3일 하는 내가 쉴 경우 대비해 쓰는 글이지만. ㅋㅋㅋㅋㅋㅋㅋ

 

 

 

 

반응형