pytroch 中的反向传播是如何完成的?何时使用torch.no_grad,以及何时何地计算梯度?

How is the backward propagation is done in pytroch? When to use torch.no_grad, also when and where is the gradinte calcuated?

提问人:Ahmed Gado 提问时间:8/26/2023 最后编辑:molbdniloAhmed Gado 更新时间:8/26/2023 访问量:17

问:

我在 pytorch 中有这个训练循环。和loss_fn = nn.CrossEntropyLoss()optim = torch.optim.Adam(net.parameters(), lr=lr)


    for X, y in train_dataloader:

        X = X.to(device)

        y = y.to(device)

        optim.zero_grad()

        pred = net(X)

        loss = loss_fn(pred, y)

        train_loss += loss.item() * X.size(0)

        pred = torch.argmax(pred, dim= -1)

        train_correct += (pred == y).float().sum()

        with torch.no_grad():

            loss.backward()

            optim.step()

现在它工作正常,模型运行良好,并获得 0.99 的精度。

我的问题是,如果无法计算可训练权重的梯度,为什么会起作用。如果没有,它将是完全相同的训练循环,并可能输出相同的输出。我知道这不会改变渐变,对吧?但从权重中减去梯度。那么为什么要使用.loss.backward()with torch.no_gradwith torch.no_grad()optim.step()with torch.no_grad

Python PyTorch 神经网络 反向传播

评论


答: 暂无答案