当前位置:   article > 正文

loss.detach().item(), loss.detach(), loss.item()的区别,以及requires_grad=True/False区别

loss.detach()

最近的程序总会在运行了几个epoch之后CUDA out of memory,除了常见的几种解决方法以外,还有一种是在train loss合并的时候,没有选择detach,或者item,导致反向梯度在合并的时候进行了累计。

常见的四种解决方法

在每个epoch之后empty_cache

import torch, gc
gc.collect()
torch.cuda.empty_cache()
  • 1
  • 2
  • 3

但这种方法会让梯度下降的速度变慢,同时在训练的时候也会遇到显存的一些问题,不建议使用。

在测试阶段使用torch.no_grad()和model.eval()

def test(model,dataloader):
    model.eval()
    with torch.no_grad()
        for batch in tqdm(dataloader):
			……
  • 1
  • 2
  • 3
  • 4
  • 5

dataloader中的pin_memory改为False

在创建dataloader的时候,如果使用的是他人的代码,可以检查一下dataloader的pin_memory是否为True,默认值为False。

调小batch_size

如果batch_size = 1之后,仍然会遇到OOM的问题,则需要查看是否是loss的梯度一直在累积,在合并loss的时候需要使用detach或者item进行对标量的提取。

detach,item,requires_grad的区别

当requires_grad = True时

import os
import torch
from torch.autograd import Variable
os.environ["CUDA_VISIBLE_DEVICES"]="4,5,6,7"
cuda = True if torch.cuda.is_available() else False
Tensor = torch.cuda.FloatTensor if cuda else torch.Tensor
a = Variable(torch.tensor([1,2,3]).type(Tensor),requires_grad=True)
b = Variable(torch.tensor([1,3,2]).type(Tensor),requires_grad=True)
criterion = torch.nn.MSELoss()
criterion.cuda()
loss = criterion(a,b)
print('loss = ', loss)
print('loss.data = ', loss.data)
print('loss.item() = ', loss.item())
print('loss.detach() = ', loss.detach())
print('loss.detach().item() = ', loss.detach().item())
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

requires_grad = True

当requires_grad = False时

requires_grad = False

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/494892
推荐阅读
相关标签
  

闽ICP备14008679号