我有一些 Pytorch 代码演示了 Pytorch 中的梯度计算,但我完全困惑计算了什么以及如何使用它。这篇文章演示了它的用法,但就反向传播算法而言,它对我来说没有意义。看看下面示例中 in1 和 in2 的梯度,我意识到 in1 和 in2 的梯度是损失函数的导数,但我的理解是更新还需要考虑实际损失值?损失值用在哪里?我在这里错过了什么吗?
in1 = torch.randn(2,2,requires_grad=True)
in2 = torch.randn(2,2,requires_grad=True)
target = torch.randn(2,2)
l1 = torch.nn.L1Loss()
l2 = torch.nn.MSELoss()
out1 = l1(in1,target)
out2 = l2(in2,target)
out1.backward()
out2.backward()
in1.grad
in2.grad
Run Code Online (Sandbox Code Playgroud) class A
{
public:
A(){std::cout << "hello\n";}
};
class B
{
A object;
public:
B(A aObject){ object = aObject;}
};
int main() {
A object;
B bObject(object);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,似乎我构造了两次A类,因为在我的控制台上"hello"被打印两次.所以我的问题是我究竟是在为A调用我的构造函数以及如何使它停止所以我只构造一次A,同时仍然将A对象传递给B.