자유 오늘도 혼돈
- CountDooku
- 조회 수 210
- 2024.12.14. 00:26
(빨간줄은 실제로눈 문제 없는 거예요)
오전 내내 accuracy_hist를 계산하는 방법이 이해가 안갔습니다.
(1) 배치 크기가 2이므로 y_batch는 두개의 레이블 (스칼라값)을 가지고 있습니다.
(2) Output layer가 3가지 꽃 품종에 대응하기 위해 3 유닛으로 구성되었으므로, pred는 3개의 유닛에 대한 소프트맥스 함수의 출력결과를 2개 (배치 크기 = 2) 가지고 있습니다.
(3) 열 방향 (dim = 1)으로 가장 큰 숫자의 인덱스 (argmax)를 샘플별로 뽑으면 이 역시 두개의 스칼라값을 가진 1차원 배열이 됩니다.
(4) (1) == (3)이라고 놓으면 pred와 y_batch 내의 같은 위치의 스칼라값끼리 일치하면 True를 출력합니다. .float()을 붙여 True는 1, False는 0으로 바꿉니다.
(5) (4)에서 계산한 모든 원소를 더합니다. 이렇게 하면, 예측값(pred)과 참값(y_batch)가 두개 다 일치하면 합이 2, 둘 중 하나만 일치하면 1, 둘다 틀리면 0이라는, 3가지 값밖에 가질 수 없습니다. 그 값을 accuracy_hist의 해당 인덱스에 업데이트하는데 왜! 어째서! 그 값을 전체 샘플 갯수 (train_dl.dataset)로 나눈 값이
30%도 되고 70%도 되고 그 사이 어떤 연속적인 값을 가질 수 있는지 도저히 이해를 할 수가 없었습니다. 저의 빛… 이었던 gemini도 이 부분을 정확히 짚어서 설명하지 못하고 계속 겉돌기만 하면서 (제 설명이 혼동을 드렸네요 죄송합니다..까지 시전하더군요ㅋㅋ) 일반적인 얘기만 해서, 힌트를 얻지 못했습니다.
점심 먹고 와서 다시 보니 어… for문 안에 for문이 있네요? 한 에포크에 한개 배치가 아니라 한 에포크마다 모든 배치 (100개 샘플 전부 다)를 반복해서 합산하는 거였네요? 어 그러면 말이 되지. 그러면 결국 100개 중에 제대로 맞춘게 몇개인지를 나타내는 숫자가 되니까 의미가 확실하기도 하고, 연속적인 값도 나올 수 있으니까요.
항상 이렇게 하나씩 이해하고 나면 이렇게 컴팩트하게 압축적해서 이쁘게 만드는 저자가 부럽습니다. 저한테 맨땅에 짜오라고 하면 이렇게 이쁘게 못할거거든요. 그리고 저는 이렇게까지 해야 이해가 가는데, 이런 구구절절한 설명을 달아놓지 않는걸 보면 이정도 문법은 업계에선 구구단 같은 건가봅니다.
그리고 역시 뇌가 돌아가려면 밥을 먹어야 합니다.