| VGG16实现Cifar10分类(PyTorch)import os
import ssl
import torch
import torchvision
import torchvision.transforms as transforms
import math
import torch
import torch.nn as nn
if __name__ == '__main__':
    ssl._create_default_https_context = ssl._create_unverified_context
    
    
    
    
    transform = transforms.Compose(
        [transforms.ToTensor(), 
         transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))] 
         )
    trainset = torchvision.datasets.CIFAR10(root='./book/classifier_cifar10/data', 
                                            train=True,
                                            download=True,
                                            transform=transform 
                                            )
    trainloader = torch.utils.data.DataLoader(trainset,
                                              batch_size=4, 
                                              shuffle=True,
                                              num_workers=2 
                                              )
    testset = torchvision.datasets.CIFAR10(root='./book/classifier_cifar10/data',
                                           train=False,
                                           download=True,
                                           transform=transform)
    testloader = torch.utils.data.DataLoader(testset,
                                             batch_size=4,
                                             shuffle=False,
                                             num_workers=2)
    cifar10_classes = ('plane', 'car', 'bird', 'cat', 'deer', 'dog', 'frog', 'horse', 'ship', 'truck')
    
    
    
    
    
    import numpy as np
    dataiter = iter(trainloader) 
    print(trainloader)
    images, labels = dataiter.next()
    images.shape 
    
    torchvision.utils.save_image(images[1],"test.jpg") 
    print( cifar10_classes[labels[3]] )
    cfg = {'VGG16': [64, 64, 'M', 128, 128, 'M', 256, 256, 256, 'M', 512, 512, 512, 'M', 512, 512, 512, 'M']}
    class VGG(nn.Module):
        def __init__(self, net_name):
            super(VGG, self).__init__()
            
            self.features = self._make_layers(cfg[net_name])
            
            self.classifier = nn.Sequential(
                nn.Dropout(),
                nn.Linear(512, 512),  
                nn.ReLU(True),
                nn.Dropout(),
                nn.Linear(512, 512),  
                nn.ReLU(True),
                nn.Linear(512, 10),  
            )
            
            for m in self.modules():
                if isinstance(m, nn.Conv2d):
                    n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels
                    m.weight.data.normal_(0, math.sqrt(2. / n))
                    m.bias.data.zero_()
        def forward(self, x):
            x = self.features(x)  
            x = x.view(x.size(0), -1)
            x = self.classifier(x)  
            return x
        def _make_layers(self, cfg):
            layers = []
            in_channels = 3
            for v in cfg:
                if v == 'M':
                    layers += [nn.MaxPool2d(kernel_size=2, stride=2)]
                else:
                    
                    
                    layers += [nn.Conv2d(in_channels, v, kernel_size=3, padding=1),
                               nn.BatchNorm2d(v),
                               nn.ReLU(inplace=True)]
                    in_channels = v
            return nn.Sequential(*layers)
    net = VGG('VGG16')
    
    
    
    import torch.optim as optim
    
    
    
    criterion = nn.CrossEntropyLoss()  
    optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)  
    
    
    
    for epoch in range(5):  
        train_loss = 0.0
        for batch_idx, data in enumerate(trainloader, 0):
            
            inputs, labels = data  
            optimizer.zero_grad()  
            
            outputs = net(inputs)  
            loss = criterion(outputs, labels)  
            loss.backward()  
            optimizer.step()  
            
            train_loss += loss.item()
            if batch_idx % 2000 == 1999:  
                print('[%d, %5d] loss: %.3f' % (epoch + 1, batch_idx + 1, train_loss / 2000))
                train_loss = 0.0
        print('Saving epoch %d model ...' % (epoch + 1))
        state = {
            'net': net.state_dict(),
            'epoch': epoch + 1,
        }
        if not os.path.isdir('checkpoint'):
            os.mkdir('checkpoint')
        torch.save(state, './checkpoint/cifar10_epoch_%d.ckpt' % (epoch + 1))
    print('Finished Training')
    
    
    
    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 %%' % (
            cifar10_classes[i], 100 * class_correct[i] / class_total[i]))
 训练打印结果
 训练模型训练模型下载地址  
 训练时间比较长,如果不想训练,可以直接下载将下载的jar包解压,并放在根目录下面
 将代码中的步骤四注释即可
 
 |