pytorch 에서 왜 zero 를 사용 하 는 지grad()경사도 제거

pytorch 에서 왜 zerograd()경사도 제거
backward()함 수 를 호출 하기 전에 경사도 를 0 으로 해 야 합 니 다.경사도 가 0 이 되 지 않 으 면 pytorch 에 서 는 지난번 에 계 산 된 경사도 와 이번 계산 한 경사도 를 누적 합 니 다.
이러한 논리의 장점 은 우리 의 하드웨어 제한 이 더 큰 bachsize 를 사용 할 수 없 을 때 작은 bachsize 의 경사도 평균 치 를 여러 번 계산 하여 대체 하 는 것 이 더욱 편리 하고 나 쁜 점 은 당연히 매번 경사도 를 제거 해 야 한 다 는 것 이다.

optimizer.zero_grad()
output = net(input)
loss = loss_f(output, target)
loss.backward()
보충:Pytorch 는 왜 매 라운드 batch 마다 optimizer.zero 를 설정 해 야 합 니까?grad
CSDN 에 이 유 를 쓴 사람 이 있 지만 사실은 번 거 롭 게 썼 다.
pytorch 의 backward()함수 의 계산 에 따 르 면 네트워크 파 라 메 트릭 이 피드백 을 할 때 경사도 는 교체 되 는 것 이 아니 라 축 적 된 것 입 니 다.그러나 모든 batch 에 서 는 두 개의 batch 의 경사도 를 혼합 하여 축적 할 필요 가 없 기 때문에 각 batch 마다 zero 를 설정 해 야 합 니 다.grad 됐어 요.
사실 여기 서 보충 할 수 있 는 것 은 모든 batch 가 원래 의 경사도 를 제거 하 는 것 이 아니 라,예 를 들 어 두 개의 batch 가 다시 경사도 를 제거 하 는 것 이다.이것 은 변 형 된 batch 를 향상 시 키 는 것 이다.size 방법,컴퓨터 하드웨어 에는 안 되 지만 batchsize 는 목표 검출 모델 의 훈련 과 같은 높 은 영역 을 설정 해 야 할 수도 있다.
이 점 에 대해 서 는참고
backward()에 대한 계산 은참고
보충:pytorch 구덩이 밟 기 노트 의 w.grad.data.zero ()
pytorch 를 사용 하여 여러 선형 회 귀 를 실현 할 때 grad 업데이트 시 매번 연산 후 지난번 의 경사도 기록 을 비우 고 다음 과 같은 방법 을 사용 해 야 합 니 다.

w.grad.data.zero_()
b.grad.data.zero_() 
그러나 실행 프로그램 은 다음 과 같은 오 류 를 보고 합 니 다.

오류 보고,grad 는 data 라 는 속성 이 없습니다.
이 유 는 시스템 에서 w 의 grad 값 을 none 으로 초기 화 하 는 것 입 니 다.첫 번 째 경사도 계산 은 none 값 에서 오 류 를 보고 하 는 것 입 니 다.자연히 data 속성 이 없습니다.
수정 방법:판단 문 구 를 추가 하고 두 번 째 순환 부터 가이드 연산 을 수행 합 니 다.

for i in range(100):
    y_pred = multi_linear(x_train)
    loss = getloss(y_pred,y_train)
    if i != 0:
        w.grad.data.zero_()
        b.grad.data.zero_()
    loss.backward()
    w.data = w.data - 0.001 * w.grad.data
    b.data = b.data - 0.001 * b.grad.data
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

좋은 웹페이지 즐겨찾기