关于计算loss

一、

def train(model, device, train_loader, optimizer, epoch):
    model.train()
    for batch_idx, (data, target) in enumerate(train_loader):
        data, target = data.to(device), target.to(device)
        optimizer.zero_grad()
        output = model(data)
        loss = F.nll_loss(output, target)
        loss.backward()
        optimizer.step()
        if(batch_idx+1)%30 == 0: 
            print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format(
                epoch, batch_idx * len(data), len(train_loader.dataset),
                100. * batch_idx / len(train_loader), loss.item()))
for epoch in range(1, EPOCHS + 1):
    train(model, DEVICE, train_loader, optimizer, epoch)

Train Epoch: 1 [14848/60000 (25%)] Loss: 0.272529
Train Epoch: 1 [30208/60000 (50%)] Loss: 0.235455
Train Epoch: 1 [45568/60000 (75%)] Loss: 0.101858
上述计算的是一个迭代步的loss

二、
当数据量大,每10迭代输出一次loss时,
每一轮的迭代次数是len(dataset) // batch_size


   for epoch in range(Start_iter,Freeze_epoch):
       if epoch%2 == 0:
           adjust_learning_rate(optimizer,lr,0.7,epoch)
       loc_loss = 0
       conf_loss = 0
       for iteration,batch in enumerate(gen):
           if iteration >= epoch_size:
               break
           images,targets = batch[0],batch[1]
           with torch.no_grad():
               if Cuda:
                   images = Variable(torch.from_numpy(images).type(torch.FloatTensor)).cuda()
                   targets = [Variable(torch.from_numpy(ann).type(torch.FloatTensor)).cuda() for ann in targets]
               else:
                   images = Variable(torch.from_numpy(images).type(torch.FloatTensor))
                   targets = [Variable(torch.from_numpy(ann).type(torch.FloatTensor)) for ann in targets]

           # 前向传播
           out = net(images)
           # 梯度清零
           optimizer.zero_grad()
           # 计算loss
           loss_l,loss_c = criterion(out,targets)
           loss = loss_l + loss_c
           # 反向传播
           loss.backward()
           optimizer.step()

           # 加上
           loc_loss += loss_l.item()
           conf_loss += loss_c.item()

           print('\nEpoch:'+str(epoch+1) + '/' + str(Epoch))
           print('iter:' + str(iteration) + '/' + str(epoch_size) +
                 ' || Loc_Loss: %.4f || Conf_Loss: %.4f ||'% (loc_loss/(iteration+1),conf_loss/(iteration+1)),end=' ')

loc_loss 和conf_loss 是每迭代一次,累计一次,每一轮都置为0.

loc_loss/(iteration+1)求的是每轮中前iteration+1的平均loss,计算的是每迭代次的

loss.item() pytorch中,.item()方法 是得到一个元素张量里面的元素值
具体就是 用于将一个零维张量转换成浮点数。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值