tortor.nograd()会影响模型精度



我收到一个错误"CUDA内存不足";然后在代码中添加torch.nograd((函数。这会影响我的准确性吗?

for iters in range(args.iterations):
with torch.no_grad():
encoded, encoder_h_1, encoder_h_2, encoder_h_3 = encoder(
res, encoder_h_1, encoder_h_2, encoder_h_3)
with torch.no_grad():
code = binarizer(encoded)
with torch.no_grad():
output, decoder_h_1, decoder_h_2, decoder_h_3, decoder_h_4 = decoder(
code, decoder_h_1, decoder_h_2, decoder_h_3, decoder_h_4)
res = res - output.detach()
codes.append(code.data.cpu().numpy())
torch.cuda.empty_cache()
print('Iter: {:02d}; Loss: {:.06f}'.format(iters, res.data.abs().mean()))

torch.no_grad()只是禁用对以后计算梯度所需的任何计算的跟踪。

在纯推理模式下,它不会对准确性产生任何影响,因为那里不需要梯度。当然,你不能在训练期间使用它,因为我们需要梯度来训练和优化。

一般来说,如果你进行推理,你总是想将网络设置为评估模式并禁用梯度。这节省了运行时间和内存消耗,并且不会影响准确性。

回答类似的问题,解释eval()no_grad()https://discuss.pytorch.org/t/model-eval-vs-with-torch-no-grad/19615/2

torch.no_grad()基本上跳过了对权重的梯度计算。这意味着您不会更改指定图层中的任何权重。如果您在预训练模型中进行训练,则可以在除完全连接层或分类器层之外的所有层上使用torch.no_grad()

如果你从头开始训练你的人际网络,这不是一件好事。你应该考虑减少层次或在训练中应用torch.no_grad()。下面给出了一个例子。

for iters in range(args.iterations):
if iters % 2 == 0:
with torch.no_grad():
encoded, encoder_h_1, encoder_h_2, encoder_h_3 = encoder(
res, encoder_h_1, encoder_h_2, encoder_h_3)
else:
with torch.no_grad():
encoded, encoder_h_1, encoder_h_2, encoder_h_3 = encoder(
res, encoder_h_1, encoder_h_2, encoder_h_3)

这是一个简短的例子。这可能会让你的训练时间更长,但你可以在不减少层次的情况下训练你的网络。这里重要的是,你不应该在每次迭代或历元更新所有层。网络的某些部分应该按照指定的频率进行更新。注:这是的实验方法

根据PyTorch文档:

当您确信不会调用Tensor.backward((时,禁用梯度计算对推理很有用。它将减少计算的内存消耗,否则计算需要_grad=True

所以这取决于你打算做什么。如果你正在训练你的模型,那么是的,这会影响你的准确性。

最新更新