【问题标题】:ValueError: Can't optimize a non-leaf Tensor,but requires_grad is trueValueError:无法优化非叶张量,但 requires_grad 为真
【发布时间】:2021-07-06 14:38:10
【问题描述】:

我正在尝试使用 torch.optim.adam 优化 self.parameters()。这是原始代码:

    def learning_rate_adjust(self, args):
      self.learning_rate *= 0.8
      self.train_op = torch.optim.Adam(self.parameters(), lr=self.learning_rate, weight_decay=args.l2_reg)

但是当我运行这段代码时,这里是错误:

Traceback (most recent call last):
   File "main.py", line 37, in <module>
      train(args, loader, train_set_length, test_seq, item_attr_set, [], [])
   File "E:\ACAM\0324ACAM-model-master\ACAM-model\code\train.py", line 62, in train
      net.learning_rate_adjust(args)
   File "E:\ACAM\0324ACAM-model-master\ACAM-model\code\model.py", line 160, in learning_rate_adjust
      self.train_op = torch.optim.Adam(self.parameters(), lr=self.learning_rate, weight_decay=args.l2_reg)
   File "D:\Anaconda3\envs\bio\lib\site-packages\torch\optim\adam.py", line 42, in __init__
      super(Adam, self).__init__(params, defaults)
   File "D:\Anaconda3\envs\bio\lib\site-packages\torch\optim\optimizer.py", line 51, in __init__
      self.add_param_group(param_group)
   File "D:\Anaconda3\envs\bio\lib\site-packages\torch\optim\optimizer.py", line 202, in 
      add_param_group
      raise ValueError("can't optimize a non-leaf Tensor")
ValueError: can't optimize a non-leaf Tensor

所以我尝试查看 self.parameters() 的列表,我发现 list(self.parameters())[9] 是一个非叶张量,然后像其他一些类似的问题一样,我打印了代码喜欢:

print('9',list(self.parameters())[9].requires_grad)
>>>true
print('9',list(self.parameters())[9].is_leaf)
>>>false

所以我不知道如何更改我的代码,请帮助我。T T

【问题讨论】:

  • 您好,您可以添加一些代码 sn-p 来显示self 对象是如何创建的吗?否则,很难指出错误。此外,这是一个有用的线程供您阅读:stackoverflow.com/questions/65301875/…
  • 先谢谢!看了这个链接还是看不懂怎么修改,其他代码在下面的cmets中。

标签: python optimization pytorch


【解决方案1】:

这是关于模型的代码:

class KAAM(torch.nn.Module):
   def __init__(self, args, ent_embed, attr_embed, item_attr_set, loader, use_user_attn=True,use_item_attn=True, use_pretrain=True):
       super(KAAM,self).__init__()
       self.Super_parameter_construct(args, loader, use_user_attn, use_item_attn, use_pretrain)
       self.variable_construct(args, ent_embed, item_attr_set, attr_embed)
       self.optimizer(args)
       for name, p in self.named_parameters():
           if 'set' not in name:
              p.requires_grad = True

然后关于优化器:

def optimizer(self,args):
    self.loss_func = torch.nn.CrossEntropyLoss()
    self.learning_rate, l2_reg = args.learning_rate, args.l2_reg
    self.train_op = torch.optim.Adam(self.parameters(), lr=self.learning_rate, weight_decay=l2_reg)

当我训练时,对于我的 epoch 中的一些 k,我将调整学习率(learning_rate_adjust),这是我首先问的问题代码。

【讨论】:

    猜你喜欢
    • 2020-09-03
    • 2021-04-24
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2017-12-08
    相关资源
    最近更新 更多