我是 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))
既然你说它是一个 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 集进行平均。
这只是一个骨架;您可能需要更改它以适合您的特定设置。
要计算 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()
计算批次中正确预测的数量。最后,通过将正确预测的总数除以样本总数来计算准确性。