gpt4 book ai didi

PyTorch:如何检查训练期间某些权重是否未更改?

转载 作者:行者123 更新时间:2023-12-04 15:18:05 28 4
gpt4 key购买 nike

如何检查在 PyTorch 训练期间某些权重是否未更改?
据我了解,一种选择可以是在某些时期转储模型权重并检查它们是否在权重迭代中发生变化,但也许有一些更简单的方法?

最佳答案

有两种方法可以解决这个问题:
第一的

        for name, param in model.named_parameters():
if 'weight' in name:
temp = torch.zeros(param.grad.shape)
temp[param.grad != 0] += 1
count_dict[name] += temp
此步骤在您的 loss.backward() 之后进行进入培训模块。 count_dict[name]字典跟踪梯度更新。您可以在训练开始之前以这种方式对其进行初始化:
    for name, param in model.named_parameters():
if 'weight' in name:
count_dict[name] = torch.zeros(param.grad.shape)
现在,另一种方法是注册一个钩子(Hook)函数,然后创建钩子(Hook)函数,如果需要,您甚至可以在其中更新或修改渐变。这不是跟踪权重更新所必需的,但是如果你想对梯度做一些事情,它会派上用场。
假设,在这里我随机稀疏梯度。
def hook_fn(grad):
'''
Randomly sparsify the gradients
:param grad: Input gradient of the layer
:return: grad_clone - the sparsified FC layer gradients
'''
grad_clone = grad.clone()
temp = torch.cuda.FloatTensor(grad_clone.shape).uniform_()
grad_clone[temp < 0.8] = 0
return grad_clone
在这里,我为模型提供了钩子(Hook)。
for name, param in model.named_parameters():
if 'weight' in name:
param.register_hook(hook_fn)
因此,这可能只会为您稀疏梯度,您可以通过这种方式跟踪钩子(Hook)函数本身的梯度:
def hook_func(module, input, output):
temp = torch.zeros(output.shape)
temp[output != 0] += 1
count_dict[module] += temp
虽然,我不建议这样做。这在可视化正向传递特征/激活的情况下通常很有用。而且,输入和输出可能会混淆,因为梯度和参数的输入和输出是相反的。

关于PyTorch:如何检查训练期间某些权重是否未更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63962561/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com