inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

처음하는 딥러닝과 파이토치(Pytorch) 부트캠프 (쉽게! 기본부터 챗GPT 핵심 트랜스포머까지) [데이터분석/과학 Part3]

실제 캐글(Kaggle) 문제 풀고, 제출해보며, 성능 개선 기법 익히기5

실제 캐글(Kaggle) 문제 풀고, 제출해보며, 성능 개선 기법 익히기5 강의에서 질문입니다

해결된 질문

369

vpdtlrdl

작성한 질문수 45

0

실제 캐글(Kaggle) 문제 풀고, 제출해보며, 성능 개선 기법 익히기5 강의에서 질문입니다.

해당 강의 2:50 부분부터 Evaluation 코드에 관해 설명을 해주셨는데요,

with torch.no_grad() 안쪽의 코드에서는

    with torch.no_grad():
        model.eval()
        ret = None

        for img, fileid in data_loader:
            img = img.to(device)
            pred = model(img)
            ids += list(fileid) # ex) [1, 2] + [3, 4] -> [1, 2, 3, 4]

            if ret is None:
                ret = pred.cpu().numpy()

            else:
                ret = np.vstack([ret, pred.cpu().numpy()])

    return ret, ids

 

pred.cpu().numpy()와 같이

detach()를 따로 사용하지 않은 걸 볼 수 있었습니다.

 

detach()의 사용에 관해서 찾아보니,

with torch.no_grad() 블록은 역전파(gradient 계산)를 비활성화 하므로,

pred는 gradient 계산과 관련이 없기에, detach()를 따로 호출하지 않고 numpy 배열로 변환할 수 있다

라는 내용을 찾을 수 있었습니다.

 

그 전에 수업 시간에 보여주신 코드에서는

 

model.eval()

with torch.no_grad():
    for x_minibatch in x_test_batch_list:
        y_minibatch_pred = model(x_minibatch)
        print(len(y_minibatch_pred), y_minibatch_pred.shape)
        y_pred_list.extend(y_minibatch_pred.squeeze().detach().tolist())

이와 같이

with torch.no_grad() 안에서도 detach()를 사용하신 코드들을 볼 수 있었는데요,

Evaluation 단계에서 detach()의 사용이 필수적인 것인지 여쭙고 싶습니다!

머신러닝 딥러닝 인공신경망 pytorch vision-transformer

답변 1

0

잔재미코딩 DaveLee

안녕하세요. 답변 도우미입니다.

PyTorch에서 이 두 기능은 서로 관련이 있지만, 약간 다른 목적으로 사용됩니다.

with torch.no_grad()

- 목적: 모델을 평가할 때(또는 모델을 통해 예측을 할 때) gradient 계산을 비활성화합니다. 이는 메모리 사용량을 줄이고 연산 속도를 빠르게 하는 데 도움이 됩니다.

- 경우: 일반적으로 모델을 평가하는 시점(예: 검증 또는 테스트 데이터에 대한 예측)에서 사용됩니다.

detach()

- 목적: Tensor에서 gradient 정보를 제거합니다. 이는 특정 Tensor를 기존 계산 그래프에서 분리하고, 이후의 연산이 기존 그래프에 영향을 주지 않도록 하는 데 사용됩니다.

- 경우: 학습 중에 중간 결과를 기록하거나, 기존 계산 그래프로부터 독립적인 연산을 수행하고 싶을 때 사용됩니다.

- with torch.no_grad() 블록 내에서 detach()를 사용하는 것은 필수적이지 않습니다. 왜냐하면 with torch.no_grad()가 이미 gradient 계산을 비활성화하기 때문입니다. 그러나 detach()를 사용하는 것이 일반적인 관행일 수 있으며, 특정 상황에서는 필요할 수 있습니다. 예를 들어, 결과 Tensor를 나중에 다른 연산에 사용하고 싶을 때는 detach()를 사용하여 계산 그래프로부터 완전히 분리할 수 있습니다.

따라서, 하나의 방법이 모든 상황에서 절대적으로 옳다고 할 수는 없으며, 상황에 따라 적절한 방법을 선택하시면 됩니다.

감사합니다.

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

0

17

1

강의 필기는 어떻게 하나요?

0

85

1

섹션 5퀴즈 4번 문제 보기 오류로 보임

0

63

1

섹션17 81번이랑 82번 강의가 중복되는 것 같아서 질문드립니다.

0

88

2

강의교안이 안 옵니다

0

80

1

17-2강 Transfer learning 실습 관련 질문

0

134

2

13섹션 강의자료가 없네요^^

0

92

1

강의자료가 없네요.

0

107

2

LSTM 모델 학습 관련한 질문입니다.

0

127

1

MSE LOSS 관련

0

132

1

test시 minibatch 사용?

0

133

1

Average Test loss 계산식 문의

0

101

1

파이토치 설치

0

247

1

[Pytorch 기울기의 누적 곱? 누적 합?]

0

135

1

3d 텐서에서의 축 구분 질문

0

119

1

항상 tensor([0., 0., 0.]) 형식으로만 나오는 이유

0

111

1

강의자료 PDF 다운로드에 관하여

0

132

1

[실무에서 판다스 copy()메서드의 깊은복사 얕은복사 조정 소요가 생길까?]

0

116

1

섹션 다양한 Optimizer 정리하기 중 딥러닝으로 Regression 문제 적용해보기 (House Price Kaggle 문제) 강의에서 오류가 발생합니다.

0

149

1

마지막에 confusion matrix 작성할때

0

157

1

아나콘다를 사용하지 않고 파이토치 사용하는 방법

0

853

1

test data 의 loss 계산식 문의

0

288

1

차원 출력 관련 문의

0

245

1

섹션 7-4 당뇨병

0

388

3