pytorch 统计参数梯度

https://www.jb51.net/article/177479.htm

https://blog.csdn.net/weixin_44058333/article/details/92691656

   params = list(net.named_parameters())  # get the index by debuging
    for i in range(len(params)):
        print(i,params[i][1].data.sum(),params[i][0])  # data

打印文件:

  params = list(net.named_parameters())  # get the index by debuging

    param_str="\n"
    for i in range(len(params)):
        param_str += ( params[i][0] + ";")  # data
    with open("param_file.txt", 'a+') as f_write:
        f_write.write(param_str)
    param_str = "\n"
    for i in range(len(params)):
        param_str+=(str(float(params[i][1].data.sum()))+";")  # data

隐藏层梯度:

我们在训练神经网络时, 有时会发现自己的网络学习不到东西,loss不下降或者下降很慢,这时除了检查修改学习率以外还有可能是碰见了梯度消失的问题。检查是否发生梯度消失最好的方法其实就是将梯度值打印出来,这里就讲讲如何在pytorch中打印出隐藏层的参数。

利用pytorch中register_hook函数可以打印出梯度,下面官方文档对这个函数的例子:

>>> v = Variable(torch.Tensor([0, 0, 0]), requires_grad=True)
>>> h = v.register_hook(lambda grad: grad * 2)  # double the gradient
>>> v.backward(torch.Tensor([1, 1, 1]))
>>> v.grad.data

在这个例子中,v是输入,这里计算的是v的梯度。如果要打印出隐藏层的梯度,则v应该是隐藏层的参数。那么接下来就是要选择出需要打印梯度的那一层的参数。

for item in net.named_parameters():
    if item[0] == 'fc.2.fc.weight':
        h = item[1].register_hook(lambda grad: print(grad))
发布了2608 篇原创文章 · 获赞 920 · 访问量 506万+

猜你喜欢

转载自blog.csdn.net/jacke121/article/details/103776250
今日推荐