当批量大小不是 train_size 的一个因素时,将 loss().item 乘以 batch_size 以获得批量损失是个好主意吗?

Is it a good idea to Multiply loss().item by batch_size to get the loss of a batch when batch size is not a factor of train_size?

假设我们有 100 张图像和 15 个批次大小的问题。除了最后一批包含 10 张图像之外,我们在所有批次中都有 15 张图像。

假设我们的网络训练为:

network = Network()
optimizer = optim.Adam(network.parameters(),lr=0.001)

for epoch in range(5):

    total_loss = 0

    train_loader = torch.utils.data.DataLoader(train_set,batch_size=15) 

    for batch in train_loader: 
        images,labels = batch

        pred = network(images)
        loss = F.cross_entropy(pred,labels)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        total_loss+= loss.item()*15

最后一批不是应该总是给我们一个增加的值 loss 因为我们将乘以 15 而我们应该在最后一批中乘以 10?是不是应该 total_loss+= loss.item()*len(images) 代替 15 或 batch_size??

我们可以使用

for every epoch:
    for every batch:
        loss = F.cross_entropy(pred,labels,reduction='sum')
        total_loss+=loss.item()

    avg_loss_per_epoch = (total_loss/len(train_set))      

谁能解释一下乘以 batch_size 是个好主意,我哪里错了?

是的,你是对的。通常,对于 运行 损失项

total_loss+= loss.item()*15

改为(如 transfer learning tutorial 中所做的那样)

total_loss+= loss.item()*images.size(0)

其中 images.size(0) 给出了当前的批量大小。因此,它将为最后一批给出 10(在你的情况下)而不是硬编码的 15。 loss.item()*len(images)也对!

在您的第二个示例中,由于您使用的是 reduction='sum',损失不会像默认情况下那样除以批量大小(因为 by defaultreduction='mean' 即损失是每个小批量的观察结果的平均值)。