【PyTorch教程】P25 pytorch中现有模型

P25 pytorch中现有模型

  • 位置:
    【PyTorch教程】P25 pytorch中现有模型_第1张图片

  • 预训练的意思pretrain,是已经在ImageNet数据集上训练好的:progress是对下载的管理:
    【PyTorch教程】P25 pytorch中现有模型_第2张图片

  • 使用的dataset,ImageNet:需要安装scipy库:

【PyTorch教程】P25 pytorch中现有模型_第3张图片

  • 点开这个ImageNet看里面的信息:
    【PyTorch教程】P25 pytorch中现有模型_第4张图片

  • 里面的重要信息:
    【PyTorch教程】P25 pytorch中现有模型_第5张图片

  • 转而使用已经训练好的model:
    【PyTorch教程】P25 pytorch中现有模型_第6张图片

  • 上图:false意思是不下载已经在ImageNet里面训练好的模型,即conv、pooling layers里面的那些参数,而true就要下载他们。
    对比二者的参数:

【PyTorch教程】P25 pytorch中现有模型_第7张图片
【PyTorch教程】P25 pytorch中现有模型_第8张图片

  • 使用vgg16,用在CIFAR数据集上,进行分类:
    Vgg16训练时,用的是ImageNet数据集,它把数据分为1000个类,而CIFAR把数据分为10类,那么就有两种做法,来利用vgg16来处理 CIFAR数据集:1、vgg16后面加一个新的线性层,使1000映射到10;2、直接把vgg16最后的输出层改为10类:这里的add_module是集成 - 在pytorch当中的方法了,直接用:
    下图是第一种方法:
    【PyTorch教程】P25 pytorch中现有模型_第9张图片

  • 还有下面这种写法,可以把新添加的层,放在classifier的框架底子,变成classifier的子集,原来是在大的框架vgg的直属下面:
    【PyTorch教程】P25 pytorch中现有模型_第10张图片

  • 下面是第二个方法:替换原来的输出类型数:图中圈2:
    【PyTorch教程】P25 pytorch中现有模型_第11张图片

可以运行的代码

# -*- coding: utf-8 -*-

import torchvision

train_data = torchvision.datasets.ImageNet("../data_image_net", split='train', download=True,
                                           transform=torchvision.transforms.ToTensor())

from torch import nn

vgg16_false = torchvision.models.vgg16(pretrained=False)
vgg16_true = torchvision.models.vgg16(pretrained=True)

# print(vgg16_true)

'''
print的结果:

VGG(
  (features): Sequential(
    (0): Conv2d(3, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (1): ReLU(inplace=True)
    (2): Conv2d(64, 64, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (3): ReLU(inplace=True)
    (4): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (5): Conv2d(64, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (6): ReLU(inplace=True)
    (7): Conv2d(128, 128, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (8): ReLU(inplace=True)
    (9): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (10): Conv2d(128, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (11): ReLU(inplace=True)
    (12): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (13): ReLU(inplace=True)
    (14): Conv2d(256, 256, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (15): ReLU(inplace=True)
    (16): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (17): Conv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (18): ReLU(inplace=True)
    (19): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (20): ReLU(inplace=True)
    (21): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (22): ReLU(inplace=True)
    (23): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (24): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (25): ReLU(inplace=True)
    (26): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (27): ReLU(inplace=True)
    (28): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (29): ReLU(inplace=True)
    (30): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  )
  (avgpool): AdaptiveAvgPool2d(output_size=(7, 7))
  (classifier): Sequential(
    (0): Linear(in_features=25088, out_features=4096, bias=True)
    (1): ReLU(inplace=True)
    (2): Dropout(p=0.5, inplace=False)
    (3): Linear(in_features=4096, out_features=4096, bias=True)
    (4): ReLU(inplace=True)
    (5): Dropout(p=0.5, inplace=False)
    (6): Linear(in_features=4096, out_features=1000, bias=True)    # 由于 imagenet 数据集,他的分类结果是 1000,所以这里out_features 值为1000
  )                                                                # 要想用于 CIFAR10 数据集, 可以在网络下面多加一行,转成10分类的输出         
)
'''

train_data = torchvision.datasets.CIFAR10('../dataset', train=True, transform=torchvision.transforms.ToTensor(),
                                          download=True)

# vgg16_true.add_module('add_linear',nn.Linear(1000, 10))
# 要想用于 CIFAR10 数据集, 可以在网络下面多加一行,转成10分类的输出,这样输出的结果,跟下面的不一样,位置不一样

vgg16_true.classifier.add_module('add_linear', nn.Linear(1000, 10))
# 层级不同
# 如何利用现有的网络,改变结构
print(vgg16_true)

# 上面是添加层,下面是如何修改VGG里面的层内容
print(vgg16_false)
vgg16_false.classifier[6] = nn.Linear(4096, 10)  # 中括号里的内容,是网络输出结果自带的索引,套进这种格式,就可以直接修改那一层的内容
print(vgg16_false)


'''
这个教程,可以自己修改别人已经写好了的模型,或者在里面添加自己的需求
'''

完整目录

  • P6-P7 数据加载
  • P8-9 Tensorboard使用
  • P10-11 Transform的用法
  • P12-13 常用的tranforms
  • P14 torchvision中的数据集的使用
  • P15 dataloader的使用
  • P16 nn.Module
  • P17 卷积
  • P18 卷积层使用
  • P19 池化
  • P20 ReLU
  • P21线性层和其它层
  • P22 squential和小实战
  • P23 loss function
  • P24 优化器
  • P25 pytorch中现有模型
  • P26 网络模型的保存和加载
  • P27、28、29 完整的模型套路
  • P30 GPU加速
  • P31 GPU加速_2
  • P32 完整的模型验证套路
  • P33 github的使用

你可能感兴趣的:(Python/Pycharm,深度学习/PyTorch,图像处理,计算机视觉,图像处理,深度学习,pytorch)