토니의 연습장
loss 값 저장 및 출력 본문
model 로 train 및 test 한 후에 train/test loss value 를 출력하고자 할 때, PyTorch 텐서(requires_grad=True) 상태에서 바로 NumPy 배열로 변환하려고 하기 때문에 발생합니다. Matplotlib에서 데이터를 플롯할 때는 numpy(), item(), 또는 해당 텐서를 분리(detach())해서 넘겨주어야 합니다. 이렇게 하면 텐서 자체를 유지하면서도 NumPy로 변환할 수 있습니다.
loss_values.append(loss.detach().numpy())
# 혹은 CPU로 먼저 보낼 경우
loss_values.append(loss.detach().cpu().numpy())
그런데 가장 출력 등의 용도로 사용하기 위해 간단하고 편리한 방법은, 스칼라 텐서의 경우 가능한 방법으로 loss.item() 을 사용하면 Python의 float으로 추출할 수 있습니다.
# 1. Loop data
for epoch in range(epochs):
...
# 3. Calculate Loss
loss = loss_fn(y_pred, y_train)
...
# 6. Optimizer Step
optimizer.step()
# Testing
...
test_loss = loss_fn(test_pred, y_test)
if epoch % 10 == 0:
epoch_count.append(epoch)
# loss.item()으로 float로 변환
loss_values.append(loss.item())
test_loss_values.append(test_loss.item())
print(f"Epoch:{epoch}|Train loss:{loss.item()}|Test loss:{test_loss.item()}")
print(model_0.state_dict())
-> 추후 plot 시에 오류 발생하지 않음
결론
- 손실값이 스칼라인 경우 → loss.item() 사용을 권장합니다.
- 배치 형태의 텐서를 그래프화할 경우 → .detach().cpu().numpy() 로 변환 후 사용.
위 방법으로 손실값을 파이썬 숫자나 넘파이 배열로 변환하면 Matplotlib에 문제없이 전달되어 그래프를 그릴 수 있습니다.
'AI 일반 > 모델, 아키텍처, 구현' 카테고리의 다른 글
causal mask (1) | 2025.05.28 |
---|---|
Model workflow (1) | 2025.01.14 |
출력 정밀도 변환 클래스 정의 (CastOutputToFloat) (5) | 2024.11.14 |
Conv2d / ConvTranspose2d (0) | 2024.09.19 |
Fine Tuning (Transfer Learning의 한 종류) (1) | 2024.08.28 |