Deep learning Pytorch中每个历元的精度

Deep learning Pytorch中每个历元的精度,deep-learning,neural-network,pytorch,conv-neural-network,Deep Learning,Neural Network,Pytorch,Conv Neural Network,我正在努力计算Pytorch中CNN分类器训练函数中每个历元的精度 在我运行这个脚本之后,它总是打印出0、0.25或0.75,这显然是错误的。我猜问题在于get_精度函数的输入(输出和标签),因为它们不是整个历元的累积值,但不确定如何修复 理想情况下,我想打印出每个历元的训练和测试精度 def get_accuracy(pred, actual): assert len(pred) == len(actual) total = len(actual) _, predicted =

我正在努力计算Pytorch中CNN分类器训练函数中每个历元的精度

在我运行这个脚本之后,它总是打印出0、0.25或0.75,这显然是错误的。我猜问题在于get_精度函数的输入(输出和标签),因为它们不是整个历元的累积值,但不确定如何修复

理想情况下,我想打印出每个历元的训练和测试精度

def get_accuracy(pred, actual):
  assert len(pred) == len(actual)

  total = len(actual)
  _, predicted = torch.max(pred.data, 1)
  correct = (predicted == actual).sum().item()
  return correct / total


def train_model(model):
    for epoch in range(epochs):
        running_loss = 0.00
        for i, data in enumerate(trainloader, 0):
            inputs, labels = data
            inputs, labels = inputs.to(device), labels.to(device)

            optimizer.zero_grad()

            outputs = cnn(inputs)

            loss = criterion(outputs, labels) 
            loss.backward() 
            optimizer.step() 

            running_loss += loss.item() #calculates loss of the batch in average

        running_loss /= len(trainloader)

        training_accuracy = get_accuracy(outputs, labels)
        test_accuracy = 'todo'

        print('='*10,'iteration: {0}'.format(epoch+1),'='*10,)
        print('\n Loss: {0} \n Training accuracy:{1}% \n Test accuracy: {2}%'.format(running_loss, training_accuracy, test_accuracy))

    print('Finished Training')

首先,你的输入和输出不会在整个历元内累加,而计算精度时只考虑火车装载机的最后一次迭代如果你想计算精度,那么你有两个选择

  • 在每次迭代后手动累积输入和输出,然后计算精度
  • 计算每次迭代的精度,并在打印前在一个历元内求平均值

  • 首先,你的输入和输出不会在整个历元内累加,而计算精度时只考虑火车装载机的最后一次迭代如果你想计算精度,那么你有两个选择

  • 在每次迭代后手动累积输入和输出,然后计算精度
  • 计算每次迭代的精度,并在打印前在一个历元内求平均值

  • 我假设您希望计算多类情况下的精度(因此您的类的形式为
    [0,1,2,3,…,N]

    您使用的是
    maximum
    ,而它应该是
    argmax
    ,例如:

    def accuracy(predictions, labels):
        classes = torch.argmax(predictions, dim=1)
        return torch.mean((classes == labels).float())
    
    当您返回最大概率(或非标准化概率)时,此返回索引具有最大值。由于概率几乎从不等于
    1
    ,因此您应该始终具有0精度(高达
    float
    精度,它有时可能非常接近
    0
    1
    ,因此可能会“命中”)

    例如
    0.9!=2
    并且您永远无法预测类
    2
    ,但您可能会意外地预测类
    1
    0.99999999~=1

    这个函数应该在内部循环中调用,就像计算损耗一样,因此它应该是:

    for epoch in range(epochs):
        running_loss = 0.00
        running_accuracy = 0.00
        for i, data in enumerate(trainloader, 0):
            inputs, labels = data inputs, labels = inputs.to(device), labels.to(device)
            optimizer.zero_grad() 
            outputs = cnn(inputs) 
            loss = criterion(outputs, labels)
            loss.backward() 
            optimizer.step() 
            running_loss += loss.item()
            running_accuracy += accuracy(outputs, labels)
        running_loss /= len(trainloader)
        running_accuracy /= len(trainloader)
    

    测试和验证也是一样,只需将您的模型切换到评估模式(通过
    model.eval()
    )并使用torch.no_grad():上下文管理器禁用梯度)

    我假设您希望计算多类情况下的精度(因此您的类的形式为
    [0,1,2,3,…,N]

    您使用的是
    maximum
    ,而它应该是
    argmax
    ,例如:

    def accuracy(predictions, labels):
        classes = torch.argmax(predictions, dim=1)
        return torch.mean((classes == labels).float())
    
    当您返回最大概率(或非标准化概率)时,此返回索引具有最大值。由于概率几乎从不等于
    1
    ,因此您应该始终具有0精度(高达
    float
    精度,它有时可能非常接近
    0
    1
    ,因此可能会“命中”)

    例如
    0.9!=2
    并且您永远无法预测类
    2
    ,但您可能会意外地预测类
    1
    0.99999999~=1

    这个函数应该在内部循环中调用,就像计算损耗一样,因此它应该是:

    for epoch in range(epochs):
        running_loss = 0.00
        running_accuracy = 0.00
        for i, data in enumerate(trainloader, 0):
            inputs, labels = data inputs, labels = inputs.to(device), labels.to(device)
            optimizer.zero_grad() 
            outputs = cnn(inputs) 
            loss = criterion(outputs, labels)
            loss.backward() 
            optimizer.step() 
            running_loss += loss.item()
            running_accuracy += accuracy(outputs, labels)
        running_loss /= len(trainloader)
        running_accuracy /= len(trainloader)
    
    测试和验证也是一样,只需将您的模型切换到评估模式(通过
    model.eval()
    )并使用torch.no_grad():上下文管理器禁用梯度)