当批量大小不是 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 default,reduction='mean'
即损失是每个小批量的观察结果的平均值)。
假设我们有 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 default,reduction='mean'
即损失是每个小批量的观察结果的平均值)。