我有一个 pytorch 变量,用作模型的可训练输入。在某些时候,我需要手动重新分配此变量中的所有值。
如何在不中断与损失函数的连接的情况下做到这一点?
假设当前值是[1.2, 3.2, 43.2],我只是想让它们变成[1,2,3].
在我问这个问题的时候,我还没有意识到 PyTorch 没有像 Tensorflow 或 Keras 那样的静态图。
在 PyTorch 中,训练循环是手动进行的,您需要在每个训练步骤中调用所有内容。(没有用于稍后提供数据的占位符 + 静态图的概念)。
因此,我们不能“破坏图形”,因为我们将使用新变量再次执行所有进一步的计算。我担心发生在 Keras 中的问题,而不是 PyTorch。
我想实现一个(元)可训练步长。我用这篇文章尝试过:
https://discuss.pytorch.org/t/how-does-one-have-the-parameters-of-a-model-not-be-leafs/70076/17
并与更高的图书馆(https://github.com/facebookresearch/higher)没有运气......
我试过:
eta = torch.tensor([0.5], requires_grad=True).view(1)
inner_opt = torch.optim.Adam(child_model.parameters(), lr=eta)
#meta_params = itertools.chain(child_model.parameters(),eta.parameters())
meta_params = itertools.chain(child_model.parameters())
meta_opt = torch.optim.Adam(meta_params, lr=1e-3)
# do meta-training/outer training minimize outerloop: min_{theta} sum_t L^val( theta^{T} - eta* Grad L^train(theta^{T}) )
nb_outer_steps = 10 # note, in this case it's the same as number of meta-train steps (but it's could not be the same depending how you loop through the val set)
for outer_i, (outer_inputs, outer_targets) in enumerate(testloader, 0):
meta_opt.zero_grad()
if outer_i …Run Code Online (Sandbox Code Playgroud)