损失函数如何知道在PyTorch中要计算哪种模型的梯度?

我不确定PyTorch如何将损失函数链接到我希望对其进行计算的模型。损失与模型之间永远没有明确的参考,例如模型参数与优化器之间的参考。

例如,我想在同一数据集上训练2个网络,因此我想利用一次遍历数据集。 PyTorch如何将适当的损失函数链接到适当的模型。这是参考代码:

import torch
from torch import nn,optim
import torch.nn.functional as F
from torchvision import datasets,transforms
import shap

# Define a transform to normalize the data
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,),(0.5,)),])
# Download and load the training data
trainset = datasets.MNIST('~/.pytorch/MNIST_data/',download=True,train=True,transform=transform)
trainloader = torch.utils.data.DataLoader(trainset,batch_size=64,shuffle=True)

model = nn.Sequential(nn.Linear(784,128),nn.ReLU(),nn.Linear(128,64),nn.Linear(64,10),nn.LogSoftmax(dim=1))

model2 = nn.Sequential(nn.Linear(784,nn.LogSoftmax(dim=1))

# Define the loss
criterion = nn.NLLLoss()
criterion2 = nn.NLLLoss()

optimizer = optim.SGD(model.parameters(),lr=0.003)
optimizer2 = optim.SGD(model2.parameters(),lr=0.003)

epochs = 5
for e in range(epochs):
    running_loss = 0
    running_loss_2 = 0
    for images,labels in trainloader:
        # flatten MNIST images into a 784 long vector
        images = images.view(images.shape[0],-1) # batch_size x total_pixels

        # Training pass
        optimizer.zero_grad()
        optimizer2.zero_grad()

        output = model(images)
        loss = criterion(output,labels)
        loss.backward()
        optimizer.step()


        output2 = model2(images)
        loss2 = criterion2(output2,labels)
        loss2.backward()
        optimizer2.step()

        running_loss += loss.item()
        running_loss_2 += loss2.item()

    print(f"Training loss 1: {running_loss/len(trainloader)}")
    print(f"Training loss 2: {running_loss_2/len(trainloader)}")
    print()

再一次,当调用loss.backward()loss2.backward()时,pytorch如何知道如何为适当的模型计算适当的梯度?

beautytai 回答:损失函数如何知道在PyTorch中要计算哪种模型的梯度?

每当您使用模型参数之一(或任何具有属性torch.tensor的{​​{1}})执行 forward 操作时,pytorch都会构建一个计算图。当您对该图的后代进行操作时,该图将被扩展。在您的情况下,您有一个名为requires_grad==True的{​​{1}},它将具有一些可训练的nn.module,因此pytorch将从您的model一直到损失为止建立一个图形执行前进操作。然后在向后通过期间反向遍历该图,以将梯度传播回参数。对于图形上方的代码中的model.parameters()

model.parameters()

当您调用loss时,pytorch反向遍历此图以达到所有可训练的参数(在这种情况下,仅适用于model.parameters() --> [intermediate variables in model] --> output --> loss ^ ^ | | images labels )并为每个参数更新loss.backward()model.parameters()然后依靠在反向传递过程中收集的此信息来更新参数。 对于param.grad,故事是相似的。

pytorch tutorials官方是一个很好的资源,可提供有关此信息的更深入信息。

本文链接:https://www.f2er.com/3103946.html

大家都在问