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一个好主意吗?我怎么错了?
你是对的。通常,对于运行损失,该术语
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'损失是每个小批次的观察结果的平均值)。
| 归档时间: |
|
| 查看次数: |
3158 次 |
| 最近记录: |