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

Des*_*wal 5 loss pytorch loss-function

假设我们有 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

Run Code Online (Sandbox Code Playgroud)

最后一批不是总是应该给我们一个增加的值,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))      
Run Code Online (Sandbox Code Playgroud)

有人可以解释一下乘以batch_size一个好主意吗?我怎么错了?

kHa*_*hit 3

你是对的。通常,对于运行损失,该术语

total_loss+= loss.item()*15
Run Code Online (Sandbox Code Playgroud)

写成(如迁移学习教程中所做的那样)

total_loss+= loss.item()*images.size(0)
Run Code Online (Sandbox Code Playgroud)

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

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