pytorch遇到的bug记录—1

1.ValueError: can’t optimize a non-leaf Tensor
主要原因:torch.optim优化的参数必须满足is_leaf = True。

问题来源:我自定义网络的训练参数,如下:

self.alpha = torch.nn.Parameter(torch.zeros(self._k, encoding_length).cuda().requires_grad_())

此时

self.alpha.is_leaf = True

就是说这时的定义还没有问题。但是我后面有需求就把self.alpha重新进行了赋值,就是这个步骤,导致赋值后的self.alpha.is_leaf = False.
从而导致后续该参数送入优化器时出现的上述错误。

解决办法:
先定义如下,

self.alpha = torch.zeros(self._k, encoding_length).cuda()

然后再进行赋值。
最后再把赋值后的self.alpha包装成nn.parameter。

self.alpha = torch.nn.Parameter(self.alpha.cuda().requires_grad_())

可以解决上述问题。

问题分析:
先参考这个链接给出的关于叶子变量的描述以及这篇博客的介绍。
总结一下:
第一,叶子所有requires_grad为False的张量(Tensor) 都为叶张量( leaf Tensor);
第二,requires_grad为True的张量(Tensor),如果是由用户创建的,则它们是叶张量(leaf Tensor). 一旦经过任何运算操作后,就不是叶子张量。

仅供个人记录用,如有错误,谢谢指出。

更新:
如果想对Parameter类型的参数进行赋值,不能直接对self.alpha进行赋值,需要对self.alpha.data进行赋值,这样就不会出现问题

你可能感兴趣的:(pytorch,深度学习,深度学习,pytorch)