我不确定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如何知道如何为适当的模型计算适当的梯度?