简单易懂Pytorch实战实例VGG深度网络

  

模型VGG,数据集cifar。对照这份代码走一遍,大概就知道整个pytorch的运行机制。
  

  

来源
  

  

定义模型:

        “在Pytorch VGG11/13/16/19。”   进口火炬   进口火炬。神经网络是神经网络   从火炬。autograd导入变量         cfg={   “VGG11”: [64,“M”, 128,“M”, 256年,256年,“M”, 512年,512年,“M”, 512年,512年,“M”),   “VGG13”: [64、64、“M”, 128年,128年,“M”, 256年,256年,“M”, 512年,512年,“M”, 512年,512年,“M”),   “VGG16”: [64、64、“M”, 128年,128年,“M”, 256年,256年,256年,“M”, 512年,512年,512年,“M”, 512年,512年,512年,“M”),   “VGG19”: [64、64、“M”, 128年,128年,“M”, 256年,256年,256年,256年,“M”, 512年,512年,512年,512年,“M”, 512年,512年,512年,512年,“M”),   }      #模型需继承nn.Module   类VGG (nn.Module):   #初始化参数:   def __init__(自我,vgg_name):   超级(VGG自我). __init__ ()   自我。特点=self._make_layers (cfg [vgg_name])   自我。分类器=nn。线性(512年,10)      #模型计算时的前向过程,也就是按照这个过程进行计算   def向前(自我,x):=self.features (x)=out.view (out.size (0) 1)=self.classifier(出)   返回了      def _make_layers(自我,cfg):   层=[]   in_channels=3   在cfg x:   如果x==癕”:   层+=(nn。MaxPool2d (kernel_size=2,步=2)   其他:   层+=(nn。Conv2d (in_channels x, kernel_size=3,填充=1),   nn.BatchNorm2d (x)   nn.ReLU(原地=True)]   in_channels=x   层+=(nn。AvgPool2d (kernel_size=1,跨步=1)   返回nn.Sequential(*层)      #净=VGG (“VGG11”)   # x=torch.randn(2、3、32岁,32)   #打印(净(变量(x)) .size ())      之前      

定义训练过程:

        “火车CIFAR10 PyTorch。”   从__future__进口print_function      进口火炬   进口火炬。神经网络是神经网络   进口火炬。optim是optim   进口torch.nn。功能和F   进口torch.backends。cudnn作为cudnn      进口torchvision   进口torchvision。变换,变换      进口操作系统   进口argparse      从模型导入*   从进口progress_bar跑龙套   从火炬。autograd导入变量      #获取参数   解析器=argparse。ArgumentParser(描述=' PyTorch CIFAR10训练”)   解析器。add_argument (- lr,默认=0.1,type=浮动,帮助=学习速率)   解析器。add_argument(“——简历”,- r, action=皊tore_true”,帮助=从检查点恢复)   args=parser.parse_args ()      use_cuda=torch.cuda.is_available ()   best_acc=0 #最好的测试精度   start_epoch=0 #从时代0或最后一个检查点的时代      #获取数据集,并先进行预处理   打印('==比;准备数据…”)   #图像预处理和增强   transform_train=transforms.Compose ([   变换。RandomCrop(32,填充=4),   transforms.RandomHorizontalFlip (),   transforms.ToTensor (),   transforms.Normalize ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),   ])      transform_test=transforms.Compose ([   transforms.ToTensor (),   transforms.Normalize ((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),   ])      小火车=torchvision.datasets.CIFAR10(根='。/数据”,火车=True,下载=True,变换=transform_train)   装载量=torch.utils.data。DataLoader(小火车,batch_size=128,洗牌=True, num_workers=2)      testset=torchvision.datasets.CIFAR10(根='。/数据”,火车=False,下载=True,变换=transform_test)   试验载荷=torch.utils.data。DataLoader (testset batch_size=100,洗牌=False, num_workers=2)      类=(“飞机”,“车”,“鸟”、“猫”、“鹿”、“狗”、“青蛙”,“马”,“船”,“卡车”)      #继续训练模型或新建一个模型   如果args.resume:   #负载检查点。   打印('==比;从检查点恢复…”)   断言os.path.isdir(“检查点”)、“错误:没有检查点目录发现!”   检查点=torch.load(“。/检查点/ckpt.t7”)   网=检查点(“净”)   best_acc=检查点(acc的)   start_epoch=检查点(“时代”)   其他:   打印('==比;建筑模型. .”)   网=VGG (“VGG16”)   #=净ResNet18 ()   #=净PreActResNet18 ()   #=净GoogLeNet ()   #=净DenseNet121 ()   #=净ResNeXt29_2x64d ()   #=净MobileNet ()   #=净MobileNetV2 ()   #=净DPN92 ()   #=净ShuffleNetG2 ()   #=净SENet18 ()      #如果GPU可用,使用GPU   如果use_cuda:   #参数和缓冲GPU   net.cuda ()   #使用GPU并行   网=torch.nn。DataParallel(净device_ids=范围(torch.cuda.device_count () 1))   #加快略   cudnn。基准=True         #定义度量和优化   标准=nn.CrossEntropyLoss ()   优化器=optim.SGD (net.parameters (), lr=参数。lr,动量=0.9,weight_decay=5)的军医      #训练阶段   def火车(时代):   打印(‘\ nEpoch: % d %时代)   #切换到训练模式   net.train ()   train_loss=0   正确的=0   总=0   #批数据   batch_idx,(输入,目标)列举(装载量):   #将数据移到GPU上   如果use_cuda:   输入目标=inputs.cuda (), targets.cuda ()   #先将优化器梯度先置为0   optimizer.zero_grad ()   #变量表示该变量属于计算图的一部分,此处是图计算的开始处。图的叶变量   输入目标=变量(输入),变量(目标)   #模型输出=净输出(输入)   #计算损失,图的终点处   损失=标准(输出、目标)   #反向传播,计算梯度   loss.backward ()   #更新参数   optimizer.step ()   #注意如果你想统计损失,切勿直接使用损失相加,而是使用损失。数据[0]。因为损失是计算图的一部分,如果你直接加损失,代表全损同样属于模型一部分,那么图就越来越大   train_loss +=loss.data [0]   #数据统计   _,预测=torch.max(输出。数据,1)   +=总targets.size (0)   正确的+=predicted.eq (targets.data) .cpu () .sum ()      progress_bar (batch_idx len(装载量)的损失:%。3 f | Acc: %。3 f % % (% d/% d)”   % (train_loss/(batch_idx + 1), 100。*正确/总、正确、总)      #测试阶段   def测试(时代):   全球best_acc   #先切到测试模型   net.eval ()   test_loss=0   正确的=0   总=0   batch_idx,(输入,目标)列举(试验载荷):   如果use_cuda:   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

简单易懂Pytorch实战实例VGG深度网络