【问题标题】:Pytorch model accuracy testPytorch 模型精度测试
【发布时间】:2019-02-10 01:41:56
【问题描述】:

我正在使用 Pytorch 对一系列图像进行分类。 NN定义如下:

model = models.vgg16(pretrained=True)
model.cuda()
for param in model.parameters(): param.requires_grad = False

classifier = nn.Sequential(OrderedDict([
                           ('fc1', nn.Linear(25088, 4096)),
                           ('relu', nn.ReLU()),
                           ('fc2', nn.Linear(4096, 102)),
                           ('output', nn.LogSoftmax(dim=1))
                           ]))

model.classifier = classifier

标准和优化器如下:

criterion = nn.NLLLoss()
optimizer = optim.Adam(model.classifier.parameters(), lr=0.001)

我的验证函数如下:

def validation(model, testloader, criterion):
    test_loss = 0
    accuracy = 0
    for images, labels in testloader:

        images.resize_(images.shape[0], 784)

        output = model.forward(images)
        test_loss += criterion(output, labels).item()

        ps = torch.exp(output)
        equality = (labels.data == ps.max(dim=1)[1])
        accuracy += equality.type(torch.FloatTensor).mean()

    return test_loss, accuracy

这是引发以下错误的一段代码:

RuntimeError: 输入的维度小于预期

epochs = 3
print_every = 40
steps = 0
running_loss = 0
testloader = dataloaders['test']

# change to cuda
model.to('cuda')

for e in range(epochs):
    running_loss = 0
    for ii, (inputs, labels) in enumerate(dataloaders['train']):
        steps += 1

        inputs, labels = inputs.to('cuda'), labels.to('cuda')

        optimizer.zero_grad()

        # Forward and backward passes
        outputs = model.forward(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()

        running_loss += loss.item()

        if steps % print_every == 0:
            model.eval()
            with torch.no_grad():
                test_loss, accuracy = validation(model, testloader, criterion)

            print("Epoch: {}/{}.. ".format(e+1, epochs),
                  "Training Loss: {:.3f}.. ".format(running_loss/print_every),
                  "Test Loss: {:.3f}.. ".format(test_loss/len(testloader)),
                  "Test Accuracy: {:.3f}".format(accuracy/len(testloader)))

            running_loss = 0

有什么帮助吗?

【问题讨论】:

  • 好吧,我没有看到你的 testloader 定义。似乎您不只是输入正确的形状(应该在第一维有一个批次索引)
  • 正如@kevinkayaks 所说,输入维度存在一些问题。在我看来,其他一切都很好。只需检查您的输入尺寸。

标签: python conv-neural-network pytorch


【解决方案1】:

以防万一它对某人有所帮助。

如果您没有 GPU 系统(假设您正在笔记本电脑上进行开发,最终将在带有 GPU 的服务器上进行测试),您可以使用以下方法进行相同操作:

if torch.cuda.is_available():
        inputs =inputs.to('cuda')
    else:
        inputs = inputs.to('cuda')

另外,如果你想知道为什么会有LogSoftmax,而不是Softmax,那是因为他使用NLLLoss 作为他的损失函数。你可以阅读更多关于softmax的信息here

【讨论】:

    【解决方案2】:

    我需要更改验证功能如下:

    def validation(model, testloader, criterion):
        test_loss = 0
        accuracy = 0
    
        for inputs, classes in testloader:
            inputs = inputs.to('cuda')
            output = model.forward(inputs)
            test_loss += criterion(output, labels).item()
    
            ps = torch.exp(output)
            equality = (labels.data == ps.max(dim=1)[1])
            accuracy += equality.type(torch.FloatTensor).mean()
    
        return test_loss, accuracy
    

    inputs需要转换为'cuda':inputs.to('cuda')

    【讨论】:

      【解决方案3】:

      您可以在下面找到另一种验证方法,如果有人想使用 GPU 构建模型,它可能会有所帮助。首先,我们需要创建设备以使用 GPU 或 CPU。从导入 Torch 模块开始。

      import torch
      import torch.nn as nn
      
      from torch.utils.data import DataLoader
      

      然后创建设备:

      device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
      

      我们将在我们的数据上使用此设备。我们可以用下面的方法来计算我们模型的准确率。

      def check_accuracy(test_loader: DataLoader, model: nn.Module, device):
          num_correct = 0
          total = 0
          model.eval()
      
          with torch.no_grad():
              for data, labels in test_loader:
                  data = data.to(device=device)
                  labels = labels.to(device=device)
      
                  predictions = model(data)
                  num_correct += (predictions == labels).sum()
                  total += labels.size(0)
      
              print(f"Test Accuracy of the model: {float(num_correct)/float(total)*100:.2f}")
      

      【讨论】:

        猜你喜欢
        • 2021-07-16
        • 2023-01-23
        • 2018-04-17
        • 2020-01-29
        • 1970-01-01
        • 2020-05-23
        • 1970-01-01
        • 1970-01-01
        • 2019-03-31
        相关资源
        最近更新 更多