LeNet图像分类网络三(Pytorch)

上一篇博文中,我们已经训练了一个图片分类网络,并且保存了网络的权重参数,现在就可以用验证集的数据来测试网络性能了。

import torch
import torchvision
import torchvision.transforms as transforms #用于图形变换
import matplotlib.pyplot as plt
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
if __name__ == '__main__':
    #################前面是建立网络部分###################
    class Net(nn.Module):
        def __init__(self):
            super(Net, self).__init__()
            self.conv1 = nn.Conv2d(3, 6, 5)
            self.conv2 = nn.Conv2d(6, 16, 5)
            self.fc1 = nn.Linear(400, 120)
            self.fc2 = nn.Linear(120, 84)
            self.fc3 = nn.Linear(84, 10)
        def forward(self, x):
            x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
            x = F.max_pool2d(F.relu(self.conv2(x)), (2, 2))
            x = x.view(-1, self.num_flat_features(x))
            x = F.relu(self.fc1(x))
            x = F.relu(self.fc2(x))
            x = self.fc3(x)
            return x
        def num_flat_features(self, x):
            size = x.size()[1:]
            num_features = 1
            for s in size:
                num_features *= s
            return num_features
    net = Net()
    transform = transforms.Compose(  # 用于串联多个图片变换的操作
        [transforms.ToTensor(),  # 将图片转换为张量形式
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])  # 归一化
    testset = torchvision.datasets.CIFAR10(root='D:/pythonProject/data', train=False,  # 下载测试集的数据
                                             download=True, transform=transform)
    testloader = torch.utils.data.DataLoader(testset, batch_size=4,
                                             shuffle=False, num_workers=2)
    classes = ('plane', 'car', 'bird', 'cat',
               'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
    dataiter = iter(testloader)              #加载验证集的数据
    images, labels = dataiter.next()
    # print images
    def imshow(img):  # 用以展示图片的函数
        img = img / 2 + 0.5  # unnormalize,非规范化
        npimg = img.numpy()  # image转为numpy类
        plt.imshow(np.transpose(npimg, (1, 2, 0)))  # 改变数组的排列顺序,这样才可以展示
        plt.show()  # 显示图片,只用上面那一行是使用不了的
    imshow(torchvision.utils.make_grid(images))              #输出图片
    print('GroundTruth: ', ' '.join('%5s' % classes[labels[j]] for j in range(4)))  #输出正确的类别
    net = Net()     #加载网络
    net.load_state_dict(torch.load('../cifar_net.pth'))         #加载网络参数
    outputs = net(images)  #将验证图片输入网络,得到输出
    _, predicted = torch.max(outputs, 1)
    print('Predicted: ', ' '.join('%5s' % classes[predicted[j]]  #输出网络的预测结果
                                  for j in range(4)))
    #################验证网络在测试集上的准确度#################
    correct = 0
    total = 0
    with torch.no_grad():
        for data in testloader:        #循环加载图片
            images, labels = data
            outputs = net(images)
            _, predicted = torch.max(outputs.data, 1)
            total += labels.size(0)              #总标签
            correct += (predicted == labels).sum().item()  #正确标签
    print('Accuracy of the network on the 10000 test images: %d %%' % (
            100 * correct / total))         #计算准确度并输出
    ##################测试在每个类别上的准确度###########################
    class_correct = list(0. for i in range(10))
    class_total = list(0. for i in range(10))
    with torch.no_grad():
        for data in testloader:
            images, labels = data
            outputs = net(images)
            _, predicted = torch.max(outputs, 1)
            c = (predicted == labels).squeeze()
            for i in range(4):
                label = labels[i]
                class_correct[label] += c[i].item()
                class_total[label] += 1
    for i in range(10):
        print('Accuracy of %5s : %2d %%' % (
            classes[i], 100 * class_correct[i] / class_total[i]))

在这里插入图片描述

首先会输出一组图片的真实值和预测值,可以看出预测效果还是不错的。
在这里插入图片描述
接着输出的是在整个验证集上的准确度,56%虽然不是很高,但是相对于随机准确度10%还是要好很多的。这是由于本例中使用的网络结构比较简单,要是使用更深的神经网络可以达到更好的效果。
在这里插入图片描述
这是分类器在10个类别上的准确度,其中car的识别率最高,deer的识别率最低。

官方文档的链接:https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py

其实pytorch提供的这个例子就是历史上最早的卷积神经网络LeNet的改进版本LeNet-5,它是由Le Cun在1998年提出的,为深度学习在计算机视觉方面的应用奠定了基础。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值