图片分类用的就是卷积神经网络加上全连接神经网。具体流程如下:

        首先导包,导入pytorch相关包。

import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np

        接着定义数据预处理函数transform = transforms.Compose函数,接着定义批处理图片的数量batch_size = 4个。然后我们需要下载数据和设置数据加载器,可以从官网上下载到本地,也可以在定义数据集的时候进行下载。注意:第一次下载的时候把download的值设为true,接下来就不用下载了,否则会报很多没用的输出信息,影响我们的程序执行和我们的判断。下载好数据集分为训练集和测试集,便于我们进行测试。

transform = transforms.Compose(
    [transforms.ToTensor(),
     transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))])

batch_size = 4

trainset = torchvision.datasets.CIFAR10(root='./data', train=True,
                                        download=False, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=batch_size,
                                          shuffle=True, num_workers=2)

testset = torchvision.datasets.CIFAR10(root='./data', train=False,
                                       download=False, transform=transform)
testloader = torch.utils.data.DataLoader(testset, batch_size=batch_size,
                                         shuffle=False, num_workers=2)

classes = ('plane', 'car', 'bird', 'cat',
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

        接着定义图像输出函数,再定义神经网络Net模型,这里参考的是pytorch官网的模型。再定义好损失函数和优化器我们的模型就准备好了。

def imshow(img):
    img = img / 2 + 0.5     # unnormalize
    npimg = img.numpy()
    plt.imshow(np.transpose(npimg, (1, 2, 0)))
    plt.show()

        接下来就是开始训练了。注意:步骤需要写入到     if __name__ == '__main__':里面,否则不执行。从训练集中获取数据,接着将损失函数梯度置成零,通过模型获取预测值,获得损失率,接着反向传播,最后将得到的损失率累加起来计算平均损失率。循环上面这个过程每隔2000批量打印一次。循环完毕后将训练模型信息保存到文件中,便于下一次直接测试。从测试集取出一个批处理图片进行测试,显示真实结果和预测结果的信息。接下来就是测试集的测试了,除了不用计算梯度其他都还和上面训练差不多测试完毕后输出测试集10000个图片的准确率,再打印一下每个类型图片的准确率。

if __name__ == '__main__':

    # get some random training images
    dataiter = iter(trainloader)
    images, labels = dataiter.next()
    
    # show images
    imshow(torchvision.utils.make_grid(images))
    # print labels
    print(' '.join(f'{classes[labels[j]]:5s}' for j in range(batch_size)))

        这里我用了一个小办法,就是将训练的模型保存起来下次在加载再训练,结果发现并没用,训练的次数多了程序就已经记住答案,你训练的是准确了但是测试的时候还会发现准确率不增反降。。。。就又给加载模型的文件注释了!