在 Pytorch 中冻结单个权重
Freezing Individual Weights in Pytorch
下面的问题不是的重复 ,因为这个问题旨在从训练中冻结张量的一个子集,而不是整个层。
我正在尝试 PyTorch 实现彩票假设。
为此,我想冻结模型中为零的权重。以下是正确的实现方式吗?
for name, p in model.named_parameters():
if 'weight' in name:
tensor = p.data.cpu().numpy()
grad_tensor = p.grad.data.cpu().numpy()
grad_tensor = np.where(tensor == 0, 0, grad_tensor)
p.grad.data = torch.from_numpy(grad_tensor).to(device)
如果您在 loss.backward()
之后和 optimizer.step()
之前(指的是这些变量名称的常见用法),您所拥有的似乎可以工作。这么一说,好像有点绕了。此外,如果您的权重是浮点值,那么 comparing them to exactly zero is probably a bad idea,我们可以引入一个 epsilon 来解决这个问题。 IMO 以下内容比您提出的解决方案更清晰:
# locate zero-value weights before training loop
EPS = 1e-6
locked_masks = {n: torch.abs(w) < EPS for n, w in model.named_parameters() if n.endswith('weight')}
...
for ... #training loop
...
optimizer.zero_grad()
loss.backward()
# zero the gradients of interest
for n, w in model.named_parameters():
if w.grad is not None and n in locked_masks:
w.grad[locked_masks[n]] = 0
optimizer.step()
下面的问题不是
我正在尝试 PyTorch 实现彩票假设。
为此,我想冻结模型中为零的权重。以下是正确的实现方式吗?
for name, p in model.named_parameters():
if 'weight' in name:
tensor = p.data.cpu().numpy()
grad_tensor = p.grad.data.cpu().numpy()
grad_tensor = np.where(tensor == 0, 0, grad_tensor)
p.grad.data = torch.from_numpy(grad_tensor).to(device)
如果您在 loss.backward()
之后和 optimizer.step()
之前(指的是这些变量名称的常见用法),您所拥有的似乎可以工作。这么一说,好像有点绕了。此外,如果您的权重是浮点值,那么 comparing them to exactly zero is probably a bad idea,我们可以引入一个 epsilon 来解决这个问题。 IMO 以下内容比您提出的解决方案更清晰:
# locate zero-value weights before training loop
EPS = 1e-6
locked_masks = {n: torch.abs(w) < EPS for n, w in model.named_parameters() if n.endswith('weight')}
...
for ... #training loop
...
optimizer.zero_grad()
loss.backward()
# zero the gradients of interest
for n, w in model.named_parameters():
if w.grad is not None and n in locked_masks:
w.grad[locked_masks[n]] = 0
optimizer.step()