如何解决PyTorch中‘cannot optimize a non-leaf tensor’优化器错误?
解决PyTorch中"cannot optimize a non-leaf tensor"错误
错误原因
直接对nn.Parameter调用.cuda()会生成非叶子张量——.cuda()操作会创建原CPU张量的GPU副本,这个副本不属于原始的nn.Parameter节点,而优化器只能优化叶子节点张量(即直接创建、未被其他张量操作生成的张量),因此触发报错。
可行解决方案
方案1:先将张量移到GPU,再封装为Parameter
device = torch.device("cuda" if torch.cuda.is_available() else "cpu") weight_1 = nn.Parameter(torch.Tensor(128, 128).to(device)) weight_2 = nn.Parameter(torch.Tensor(128, 128).to(device)) optimizer = optim.Adam([{'params': model.parameters()}, {'params': [weight_1, weight_2]}], lr=1e-5)
方案2:先创建Parameter,再手动更新到GPU
weight_1 = nn.Parameter(torch.Tensor(128, 128)) weight_2 = nn.Parameter(torch.Tensor(128, 128)) # 移动到GPU(两种方式任选其一) weight_1 = weight_1.cuda() weight_2 = weight_2.cuda() # 或者用更通用的to()方法适配多设备 # device = torch.device("cuda" if torch.cuda.is_available() else "cpu") # weight_1 = weight_1.to(device) # weight_2 = weight_2.to(device) optimizer = optim.Adam([{'params': model.parameters()}, {'params': [weight_1, weight_2]}], lr=1e-5)
方案3:将自定义参数加入模型类(推荐)
把自定义参数作为模型的成员变量,调用model.cuda()时会自动将所有参数移到GPU,无需手动管理:
class MyModel(nn.Module): def __init__(self): super().__init__() # 自定义参数 self.weight_1 = nn.Parameter(torch.Tensor(128, 128)) self.weight_2 = nn.Parameter(torch.Tensor(128, 128)) # 其他模型层... model = MyModel().cuda() optimizer = optim.Adam(model.parameters(), lr=1e-5)
内容的提问来源于stack exchange,提问作者Noorulain Islam
相关产品推荐
相关产品推荐

