MNIST的训练集一共**60000**个,我设置**mini-batch=128**,分成**469批**
train_dataset = mnist.MNIST('./data', train=True, transform=transform, download=False)
test_dataset = mnist.MNIST('./data', train=False, transform=transform)
print(train_dataset)
train_loader = DataLoader(train_dataset, batch_size=train_batch_size, shuffle=True)
test_loader = DataLoader(test_dataset, batch_size=test_batch_size, shuffle=False)[/code]
我看教程给的代码,里面loss的计算如下
out = model(img)
loss = criterion(out, label)
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss += loss.item()
_, pred = out.max(1)
num_correct = (pred == label).sum().item()
acc = num_correct / img.shape[0]
train_acc += acc
最后输出
print('epoch:{},Train Loss:{:.4f}, Train Acc: {:.4f},Test Loss: {:.4f}, Test Acc: {:.4f}'.format(epoch, train_loss / len(train_loader), train_acc / len(train_loader),eval_loss / len(test_loader), eval_acc / len(test_loader))
其中len(train_loader)=**469**,损失函数使用的是交叉熵函数,每个循环的loss都是当前批次的loss总和,没有除以N。我想请问为什么最后输出的loss不是除以6000/128,而是len(train_loader),毕竟6000不能被128整除,所以最后一个批次的数量是达不到128的,那么这一批的loss肯定也只是6000-128*468=**96**个数据的和,这样再除以469的话难免会有一些误差。acc也是同理
我特地找了下pytorch官方的案例,里面是把所有数据的loss加起来,最后除以总数,如下
test_loss += F.nll_loss(output, target, reduction='sum').item() # sum up batch loss
pred = output.argmax(dim=1, keepdim=True) # get the index of the max log-probability
correct += pred.eq(target.view_as(pred)).sum().item()
test_loss /= len(test_loader.dataset)
print('\nTest set: Average loss: {:.4f}, Accuracy: {}/{} ({:.0f}%)\n'.format(
test_loss, correct, len(test_loader.dataset),
100. * correct / len(test_loader.dataset)))
我这里的代码是来自《Python深度学习:基于Pytorch》,是不是在最后的计算方法上不够严谨呢,还是说这点误差可以忽略不计
大家都是怎么计算loss和acc的呢