- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在关注 PyTorch tutorial它使用 Huggingface Transformers 库中的 BERT NLP 模型(特征提取器)。有两段我不明白的梯度更新相关代码。
(1) torch.no_grad()
该教程有一个类,其中 forward()
函数创建一个 torch.no_grad()
阻止对 BERT 特征提取器的调用,如下所示:
bert = BertModel.from_pretrained('bert-base-uncased')
class BERTGRUSentiment(nn.Module):
def __init__(self, bert):
super().__init__()
self.bert = bert
def forward(self, text):
with torch.no_grad():
embedded = self.bert(text)[0]
(2)
param.requires_grad = False
在同一教程中还有另一部分卡住了 BERT 参数。
for name, param in model.named_parameters():
if name.startswith('bert'):
param.requires_grad = False
我什么时候需要(1)和/或(2)?
with torch.no_grad requires_grad = False Parameters Ran
------------------ --------------------- ---------- ---
a. Yes Yes 3M Successfully
b. Yes No 112M Successfully
c. No Yes 3M Successfully
d. No No 112M CUDA out of memory
有人可以解释一下发生了什么吗? 为什么我收到
CUDA out of memory
对于(d)而不是(b)?两者都有 112M 的可学习参数。
最佳答案
这是一个较旧的讨论,多年来略有变化(主要是由于 with torch.no_grad()
作为一种模式的目的。可以在 on Stackoverflow already 中找到一个很好的答案,也可以回答您的问题。
但是,由于原始问题大不相同,因此我不会将其标记为重复,特别是由于关于内存的第二部分。no_grad
的初步解释给出 here :
with torch.no_grad()
is a context manager and is used to prevent calculating gradients [...].
requires_grad
另一方面使用
to freeze part of your model and train the rest [...].
requires_grad
您只是在禁用部分网络,而
no_grad
根本不会存储任何梯度,因为您可能将它用于推理而不是训练。
a)
和 b)
根本不存储任何梯度,这意味着无论参数数量如何,您都可以使用更多的内存,因为您不会保留它们以用于潜在的向后传递。 c)
必须为以后的反向传播存储前向传播,但是,只存储了有限数量的参数(300 万),这使得这仍然可以管理。 d)
但是,需要存储所有 1.12 亿个参数的前向传递,这会导致内存不足。 关于python - PyTorch torch.no_grad() 与 requires_grad=False,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63785319/
来自 docs : requires_grad – Boolean indicating whether the Variable has been created by a subgraph con
我想卡住我的一些模型。按照官方文档: with torch.no_grad(): linear = nn.Linear(1, 1) linear.eval() print(li
pytorch更新完后合并了Variable与Tensor torch.Tensor()能像Variable一样进行反向传播的更新,返回值为Tensor Variable自动创建tensor,且
当我使用 PyTorch 创建神经网络时,使用 torch.nn.Sequential 方法定义层,参数似乎默认为 requires_grad = False。但是,当我训练这个网络时,损失会减少。如
当我使用 PyTorch 创建神经网络时,使用 torch.nn.Sequential 方法定义层,参数似乎默认为 requires_grad = False。但是,当我训练这个网络时,损失会减少。如
我不能使用带有 requires_grad 参数的 torch.Tensor()(torch 版本:0.4.1) 没有 requires_grad : x = torch.Tensor([[.5, .
我在训练 MNIST 数据时收到此错误,csv 文件来自 Kaggle。有人可以告诉我哪里错了吗?这是我的代码。 PyTorch的版本是0.4.0。 import numpy as np import
我正在关注 PyTorch tutorial它使用 Huggingface Transformers 库中的 BERT NLP 模型(特征提取器)。有两段我不明白的梯度更新相关代码。 (1) torc
张量b 和c 的requires_grad 为True。但是张量 d 的 requires_grad 是 False。我很好奇为什么会发生这种变化,因为输入的所有 requires_grad 都是 T
Pytorch 0.4.0 引入了 Tensor 和 Variable 类的合并。 在此版本之前,当我想从一个 numpy 数组创建一个带有 autograd 的 Variable 时,我会执行以下操
我是一名优秀的程序员,十分优秀!