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_())
可以解决上述问题。
问题分析:
先参考这个链接给出的关于叶子变量的描述以及