inflearn logo
강의

講義

知識共有

実務密着型 PyTorch コンピュータビジョン:CNNから最新のDETRまで完全ガイド

実習 - 転移学習モデル作成(COVID-19 X-Ray検出)

섹션2 코드 관련하여 질의드립니다.

60

jyj1206

投稿した質問数 4

0

안녕하세요 강사님

 

섹션 2의 CNN 실습(100_CIFAR10_CNN.ipynb) 관련하여 질문드립니다.

아래 코드에서는 train_loss에 배치별 loss를 누적한 뒤,  for문이 끝나면 train_loss /= len(train_data) 로 평균을 계산하고 있습니다.

그런데 loss.item()은 이미 각 배치에서 평균이 적용된 스칼라 값입니다. 

따라서 다시 전체 데이터 개수(len(train_data))로 나누면 이중으로 평균이 계산되는 것 같습니다.

 

그래서 저는 train_loss += loss.item() * x.size(0) 형태로  배치 손실의 합계를 누적한 뒤, 마지막에 전체 데이터 수로 나누는 방식이보다 정확하다고 생각하는데, 혹시 어떻게 생각하실까요?

 

좋은 강의 제공해주셔서 감사합니다.

 

    for x, y in train_loader:  # 훈련 데이터셋을 배치 단위로 순회
        x, y = x.to(device), y.to(device)  # 배치 데이터를 현재 디바이스로 이동

        optimizer.zero_grad()  # 이전 그라디언트를 초기화
        z = model(x)  # 모델을 통해 예측값 계산
        loss = criterion(z, y)  # 예측값과 실제 레이블 간의 손실 계산
        train_loss += loss.item()  # 손실 누적
        y_pred = z.argmax(1)  # 가장 높은 예측값의 인덱스를 정답으로 선택
        train_acc += (y_pred == y).sum().item()  # 정확히 예측된 개수 누적

        loss.backward()  # 손실에 대한 그라디언트 계산
        optimizer.step()  # 모델의 가중치 업데이트

    train_loss /= len(train_data)  # 평균 훈련 손실 계산
    train_acc /= len(train_data)   # 평균 훈련 정확도 계산
    LOSS.append(train_loss)
    ACC.append(train_acc)

pytorch 컴퓨터-비전 cnn

回答 2

0

YoungJea Oh

맞습니다. 현재 코드는 train_loss /= len(train_loader) 로 수정해서 batch 갯수로 나누어야 합니다. accuracy 는 현재 처럼 train_acc /= len(train_data) 나누면 됩니다.

batch size 가 다른 경우 제안하신 대로 코딩하는 것이 가장 정확한 방법이지만 손실값을 계산하는 목적은 그 값이 줄어들고 있는지 비교하는 목적이므로 매우 정확한 값을 계산하지 않아도 지장 없습니다.

교재에서도 train_loss /= len(train_loader) 로 수정해 놓았습니다.

좋은 지적 감사합니다.

0

jyj1206

  1. train_loss += loss.item() * x.size(0) -> train_loss /= len(train_data)

  2. train_loss += loss.item() -> train_loss /= len(train_loader)


친절히 답변 주셔서 감사합니다. 강사님께서 말씀하신 2번 방법과 제가 전달드린 1번 방식도 가능하다는걸까요?
1번 방식의 경우 전체 개별 loss를 모두 구해 전체 데이터셋으로 나눠주는 방식입니다.

1

YoungJea Oh

수강생께서 제시하신 방식이 더 정확합니다. 하지만 제 방식도 일반적으로 많이 사용되는 방식입니다. 둘 다 큰 문제 없는 이유는 평균적인 손실값은 학습이 잘 되고 있는지 모니터링하기 위한 목적이므로 아주 정밀한 계산이 아니어도 별 문제 없기 때문입니다. 제시하신 대로 사용하셔도 전혀 문제 없습니다. 감사합니다.

0

communityai8509

안녕하세요, 인프런 AI 인턴입니다.

질문해 주신 내용은 딥러닝 모델 훈련 시 손실(loss)의 계산 방법에 관한 깊이 있는 논의로, 많은 학습자들이 헷갈려할 수 있는 부분입니다. loss.item() 메서드는 손실 값을 실제 값으로 반환하며, 각 배치에서의 평균 손실을 나타냅니다.

현재 코드에서는 train_loss에 각 배치별 손실 값을 누적하고 train_loss /= len(train_data)로 처리하고 있습니다. 하지만, 말씀하신 대로 각 배치의 데이터 수를 고려하여 train_loss += loss.item() * x.size(0)로 변경하여 전체 배치의 손실을 계산한 다음, 최종적으로 전체 데이터 수로 나누면 더 정확한 평균 손실을 계산할 수 있습니다.

이는 특히 배치 크기가 다를 수 있는 경우나 데이터에 가중치를 두고 싶을 경우 효율적인 방법입니다. 따라서 제안하신 방식을 사용하는 것은 일관성과 신뢰도를 높이는 올바른 접근입니다.

해당 주제와 관련해 이미 논의된 비슷한 내용을 좀 더 확인하고 싶으시다면 다음과 같은 링크를 참고해 보세요:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

import torch가 안되는 경우는 어떻게 하나요?

0

15

1

소리가 겹쳐서 들려요

0

19

2

[개정판] 딥러닝 컴퓨터 비전 완벽 가이드 먼저? 구현하며 배우는 Transformer 먼저?

0

30

1

수업자료

0

23

2

전 강의와 전혀 이어지지가 않음

0

30

1

pytorch local 설치 옵션에 conda 가 없습니다.

0

38

3

강의 환경설정 질문

0

39

2

강화학습저장 및 로드

0

57

1

Custom Dataset에서의 polygon 정보 관련

0

83

3

paperswithcode 서비스 종료 관련 문의

0

209

2

질문있습니다.

0

59

2

수업 하실 때 활용하시는 강의 자료를 제공 받을 수 있는지 문의 드립니다

0

68

2

cvat.ai 보안 수준이 궁금합니다

0

80

2

Embedding 모델 fine tuning 관련 질문

0

71

2

코드에 오타가 있는 것 같습니다

0

53

2

코드 오타가 있는것 같습니다.

0

68

2

캐클 nucleus 챌린지 runpod 실습 코드 에러 질문드립니다.

0

95

3

수업 자료도 없고 아무 것도 없는데 어떻게 시작하나요?

0

75

2

코드(3-7. 계층적 데이터 분석) 중에 질문이 있습니다.

0

57

2

추론 결과의 Precision(또는 mAP) 평가 방법

0

85

2

흑백 이미지 resnet 전이학습 분류 질문 있어요

0

56

2

실습 강의 화질이 너무 안좋아요

0

94

1

객체 인식에 대한 질문이 있습니다.

0

53

1

Fast R-CNN 강의 관련 질의사항입니다.

0

65

1