如何计算 Vision Transformer 的精度?

问题描述 投票:0回答:2

我是 PyTorch 的新手,想要找到每个纪元的准确性。我知道准确性是正确预测的数量/总样本,但我不知道如何将其集成到我的代码中。:

for epoch in range(1):
epoch_losses = []
model.train()
for step, (inputs, labels) in enumerate(train_dataloader):
    optimizer.zero_grad()
    inputs, labels = inputs.to(device), labels.to(device)
    outputs = model(inputs)
    loss = criterion(outputs, labels)
    loss.backward()
    optimizer.step()
    epoch_losses.append(loss.item())
if epoch % 1 == 0:  # For every epoch
    print(f">>> Epoch {epoch+1} train loss: ", np.mean(epoch_losses))
    epoch_losses = []
    model.eval()
    epoch_losses = []

    for step, (inputs, labels) in enumerate(test_dataloader):
        # Unpack the tuple
        inputs = inputs.to(device)
        labels = labels.to(device)

        outputs = model(inputs)
        loss = criterion(outputs, labels)
        epoch_losses.append(loss.item())
    print(f">>> Epoch {epoch+1} test loss: ", np.mean(epoch_losses))
deep-learning pytorch computer-vision training-data vision-transformer
2个回答
0
投票

既然你说它是一个 5 类问题,你的输出张量应该具有 [1,5] 的形状。对输出张量执行 torch.max。

#This is assuming that the num of classes is in dim 1
_, pred = torch.max(scores, dim=1) 

第一个输出将是值,第二个输出(这就是我们需要的)将是最可能类别的索引。接下来,与您的 Ground Truth 标签进行直接比较。

if pred == labels:
   correct_predictions+=1

然后,对整个 val/train 集进行平均。

这只是一个骨架;您可能需要更改它以适合您的特定设置。


0
投票

要计算 Vision Transformer 模型的准确性,您需要跟踪训练和测试时期的正确预测数量。然后,您可以将正确预测的总数除以样本总数以获得准确度。

以下是如何修改代码以计算每个时期的准确性:

import torch

for epoch in range(num_epochs):
    epoch_losses = []
    correct_predictions = 0
    total_samples = 0
    
    # Training phase
    model.train()
    for step, (inputs, labels) in enumerate(train_dataloader):
        optimizer.zero_grad()
        inputs, labels = inputs.to(device), labels.to(device)
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
        epoch_losses.append(loss.item())
        
        # Calculate accuracy during training
        _, predicted = torch.max(outputs, 1)
        correct_predictions += torch.sum(predicted == labels).item()
        total_samples += labels.size(0)

    train_accuracy = correct_predictions / total_samples
    
    # Validation phase
    model.eval()
    epoch_losses = []
    correct_predictions = 0
    total_samples = 0
    
    with torch.no_grad():
        for step, (inputs, labels) in enumerate(test_dataloader):
            inputs = inputs.to(device)
            labels = labels.to(device)

            outputs = model(inputs)
            loss = criterion(outputs, labels)
            epoch_losses.append(loss.item())
            
            # Calculate accuracy during validation
            _, predicted = torch.max(outputs, 1)
            correct_predictions += torch.sum(predicted == labels).item()
            total_samples += labels.size(0)

    test_accuracy = correct_predictions / total_samples
    
    print(f">>> Epoch {epoch+1} train loss: {np.mean(epoch_losses)} train accuracy: {train_accuracy}")
    print(f">>> Epoch {epoch+1} test loss: {np.mean(epoch_losses)} test accuracy: {test_accuracy}")

在此代码中:

  • correct_predictions
    跟踪正确预测的数量。
  • total_samples
    跟踪样本总数。
  • torch.max(outputs, 1)
    找到沿预测轴的最大值的索引。
  • torch.sum(predicted == labels).item()
    计算批次中正确预测的数量。

最后,通过将正确预测的总数除以样本总数来计算准确性。

© www.soinside.com 2019 - 2024. All rights reserved.