P25 现有网络模型的使用及修改

模型的默认下载位置:
在这里插入图片描述

一、看文档

在这里插入图片描述
在这里插入图片描述
找到这个数据集 在torch.datasets
在这里插入图片描述
在这里插入图片描述

二、Imagnet数据集与VGG16模型下载

1、先安装下scipy吧

2、下载数据集

import torch
import torchvision

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

报错了:数据集未公开,让自己去下载

在这里插入图片描述

3、可以去百度搜索数据集名字,一般会有下载渠道,但是这玩意100多个G。。顶不住。

4、按住ctrl+左键点击ImageNet
在这里插入图片描述

5、看下VGG16 预训练分别为True和False有什么区别吧:
飘过一条弹幕,感觉应该挺重要

弹幕说:
最新版默认是没有预训练,需要使用预训练设置weights=‘DEFAULT’
在这里插入图片描述
pretrained=False 改为weight=None pretrained=True改weights=‘DEFAULT’

我们来看下:最新文档。要想用训练好的,这里需要输入 VGG16_Weights.DEFAULT或者weights=‘DEFAULT’ or weights=‘IMAGENET1K_V1’.
在这里插入图片描述可以看到设置为Default时,会下载这些权重,他们就相当于我们之前写模型里的conv卷积数据,maxpool池化数据等等。
在这里插入图片描述

6、debug一下
在这里插入图片描述
来看参数:
未训练:
在这里插入图片描述
训练好的:
在这里插入图片描述
还是有差别的。

6、看下其训练好的结构

import torch
import torchvision

# train_data=torchvision.datasets.ImageNet("./P25_ImageNet_datasets",split='train',
#                                          transform=torchvision.transforms.ToTensor()
#                                         )

vgg16_false=torchvision.models.vgg16(weights=None)
vgg16_true=torchvision.models.vgg16(weights='DEFAULT')

print(vgg16_true)

步骤挺多的

  (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)
  )

能分出类别达到1000种
在这里插入图片描述

三、VGG16训练好的,应用在CIFAR10数据集,add_module的用法

问题来了,VGG16最后线性层输出为1000种,而我们的CIFAR10只有10类,如何利用现有的网络去改变结构。也就是迁移学习
1、我们可以加一个线性层,让他输入1000,输出为10

import torch
import torchvision
from torch import nn

# train_data=torchvision.datasets.ImageNet("./P25_ImageNet_datasets",split='train',
#                                          transform=torchvision.transforms.ToTensor()
#                                         )

vgg16_false=torchvision.models.vgg16(weights=None)
vgg16_true=torchvision.models.vgg16(weights='DEFAULT')

print(vgg16_true)
train_data=torchvision.datasets.CIFAR10("./P25_datasets_Cifar10",
                                        train=True,transform=torchvision.transforms.ToTensor(),
                                       download=True )
vgg16_true.add_module("add_linear",nn.Linear(1000,10))//这里加入新神经元。//
print(vgg16_true)

在这里插入图片描述

在这里插入图片描述

1、1我们想把add_linear加入classifier里呢?

vgg16_true.classifier.add_module("add_linear",nn.Linear(1000,10))

进去了
在这里插入图片描述

2、我们不添加,想直接在原来的基础上修改最后一个线性层输入为4096,输出为10

print(vgg16_false)
vgg16_false.classifier[6]=nn.Linear(4096,10) //关键//
print(vgg16_false)

修改前:
在这里插入图片描述

修改后:

在这里插入图片描述

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值