我有一个网络
y(x)
,我有一个给定的数据集dy(x)
。也就是说,我知道 y
对某个 x
的导数,但我不知道 y
本身。一个最小的例子是:
import torch
# Define network to predict y(x)
network = torch.nn.Sequential(
torch.nn.Linear(1, 50),
torch.nn.Tanh(),
torch.nn.Linear(50, 1)
)
# Define dataset dy(x) = x, which corresponds to y = 0.5x^2
x = torch.linspace(0,1,100).reshape(-1,1)
dy = x
# Calculate loss based on derivative of prediction for y
x.requires_grad=True
y_pred = network(x)
dy_pred = torch.autograd.grad(y_pred, x, grad_outputs=torch.ones_like(y_pred), create_graph=True)[0]
loss = torch.mean((dy-dy_pred)**2)
# This throws an error
gradients = torch.autograd.grad(loss, network.parameters())[0]
在最后一行,它给出了错误
One of the differentiated Tensors appears to not have been used in the graph
,即使参数肯定已经被用来计算损失。有趣的是,当我使用 torch.optim.Adam
和 loss.backward()
的损失时,没有错误发生。我该如何解决我的错误? 注意:定义一个网络来直接预测 dy
不是我实际问题的选项。
我发现问题是最后一个神经元的偏差对损失没有贡献,因此它没有在图中使用。因此,我们必须通过将
bias=False
传递到最后一层来消除这个偏差参数。
# Define network to predict y(x)
network = torch.nn.Sequential(
torch.nn.Linear(1, 50),
torch.nn.Tanh(),
torch.nn.Linear(50, 1, bias=False)
)