首页 > 解决方案 > PyTorch 在没有直接关联时使用优化器更新值

问题描述

我正在使用 Chumpy 库从给定的 3D 对象中获取一些值。但是,这个过程在 CPU 上,对我的任务来说太慢了。

我想做的是使用诸如 Adam 之类的优化器来迭代地获取这些值。我的例子如下:

model = my_values # my values, this is Chumpy object
template_mesh_v = my_ground_truth # numpy array
betas = torch.nn.Parameter(torch.zeros(model.betas[300:].shape[0]).float()) # this is what I need
optimizer = torch.optim.Adam(
            [betas],
            lr=1.0,
            weight_decay=0.0001
        )

iters = 4000
for k in range(iters):
    model.betas[300:] = betas.detach().numpy()

    loss = (torch.tensor(template_mesh_v) - torch.tensor(model.r, requires_grad=True)).sum(1).mean()  
                                                                                                         
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

以下是发生的情况:当我更新 model.betas 时,model.r 值也会通过 Chumpy 更新(但我不确定 Chumpy 如何更新这些值)。从损失函数可以看出,我需要的是通过获取正确的 beta 值使 model.r 尽可能接近 template_mesh_v 值。我对 model.r 值不感兴趣,只对 beta 值感兴趣。我只使用 model.r 值来计算损失,因为它们在某种程度上依赖于 beta 值。

I have to call .detach() on betas values before assigning it to model.betas, otherwise Chumpy raises error. I know that gradients don't go through beta values, so betas.grad is actually None.

Am I approaching this problem in a wrong way? I want to iteratively update beta values, which updates model.r values.

Thanks.

标签: machine-learningdeep-learningpytorchadam

解决方案


推荐阅读