То, что у вас есть, похоже, будет работать, если вы сделали это после loss.backward()
и до optimizer.step()
(что относится к общему использованию этих имен переменных).Тем не менее, это кажется немного запутанным.Кроме того, если ваши веса являются значениями с плавающей запятой, то сравнение их с ровно нулем, вероятно, является плохой идеей , мы могли бы ввести эпсилон, чтобы учесть это.Тем не менее, я думаю, что следующее немного более чистое решение
# locate zero-value weights before training loop
EPS = 1e-6
locked_masks = {n: torch.abs(w) < EPS for n, w in n.named_parameters() if n.endswith('weight')}
...
for ... #training loop
...
optimizer.zero_grad()
loss.backward()
# zero the gradients of interest
for n, w in m.named_parameters():
if w.grad is not None and n in locked_masks:
w.grad[locked_masks[n]] = 0
optimizer.step()