내갸 이 부분부터 도저히 이해가 되지 않았는데
오늘 오후에 드디어 이해해서 적는다 언제 다시 까먹고 멍청해 질지 모르니까
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일 하는 내가 쉴 경우 대비해 쓰는 글이지만. ㅋㅋㅋㅋㅋㅋㅋ
'밑바닥 부터 시작하는 딥러닝' 카테고리의 다른 글
맥에서 [아나콘다 제거]로 다시 머신러닝 공부 시작 (0) | 2023.06.19 |
---|---|
열심히 했지만 음..... 노잼 그래서.. (0) | 2021.06.18 |
3.6 손글씨 숫자 인식 from dataset.mnist import load_mnist (0) | 2021.05.26 |
Visual Studio Code 밑바닥부터 시작하는 딥러닝위한 설정 (0) | 2021.05.26 |
맥에서 딥러닝 시작하기 (0) | 2021.05.26 |