[VGG16模型]现有网络模型的使用与修改的学习 及ImageNet 数据集的下载

本文以vgg16为例,来学习现有网络模型的使用与修改。除此之外还提及到了ImageNet 数据集的学习,和ImageNet 数据集的下载方面的一些问题。



前言

VGG分类模型有VGG11,VGG13,VGG16,VGG19
其中最常用的有VGG16VGG19


一、VGG16

1 官方文档

torchvision.models.vgg16(pretrained: bool = False,
 progress: bool = True,
 **kwargs: Any) 

参数注解:
pretrained (bool) – 如果为真,则这个网络中的参数在 ImageNet 这个数据集中已经训练好了。如果为假,这些参数为初始化参数,没有经过如何训练。

progress (bool) -- 如果为 True,则显示下载到 stderr 的进度条。

2 参数pretrained 为false和true时的区别

代码如下:
import torchvision
vgg16_true = torchvision.models.vgg16(pretrained=True, progress=True)
vgg16_false = torchvision.models.vgg16(pretrained= False, progress=True)
print(vgg16_false)
print(vgg16_true)

其中:
pretrained=False时,只是加载网络模型,只是把神经网络的代码加载了进来,其中的参数都是默认的参数,不需要下载。

pretrained=True时,它就要去从网络中下载,比如说卷积层对应的参数时多少,池化层对应的参数时多少等。这些参数都是在 ImageNet 数据集中训练好的。

可以查看pretrained=True分类中0的权重,如图

pretrained=False分类中0的权重,如图

可以发现,pretrained=False和pretrained=True时权重不同。

pretrained=True中的权重时在 ImageNet 数据集中训练好的

3 代码输出

输出结果如下:

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

从输出结果可以看出,这个VGG也是个分类模型,可以分出1000个类别。

二、现有网络模型的使用与修改

如何利用现有的网络,她改变网络的框架来符合我们的需求?
我们之前使用的数据集CIFAR10只分为10个类别
如果我们加载了vgg16模型,我们如何应用这个网络模型呢?

有两个方法:
(1)将 (6): Linear(in_features=4096, out_features=1000, bias=True)改为Linear(in_features=4096, out_features=10, bias=True)
(2)再加一个线性层 Linear(in_features=1000, out_features=10, bias=True)

1 方法一:直接修改

代码如下:

import torchvision
from torch.nn import Linear

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

dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)
#修改module
vgg16_false.classifier[6] = Linear(in_features=1000, out_features=10)
print(vgg16_false)

vgg16_false.classifier[6],就是修改vgg16网络模型中的classifier中的第7个步骤,结果如图:

2 方法二:添加步骤

代码如下:

import torchvision
from torch.nn import Linear

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

dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)
#再加一个线性层
vgg16_true.add_module("add_linear", Linear(in_features=1000, out_features=10))
print(vgg16_true)

vgg16_true.add_module("add_linear", Linear(in_features=1000, out_features=10)),就是在网络中在加一个步骤,(”添加层的名字“,添加的层)。

这一步骤会直接添加在vgg模型的底下,如图:

我们如果让添加的步骤显示在(classifier): Sequential()中,只需要修改一下代码就行了。

vgg16_true.add_module("add_linear", Linear(in_features=1000, out_features=10))
改为 vgg16_true.classifier.add_module("add_linear", Linear(in_features=1000, out_features=10))  即可

输出如图:

三、ImageNet 数据集

VGG16分类模型时在ImageNet 这个数据集进行的

1 官方文档

torchvision.datasets.ImageNet(root: str, 
split: str = 'train',
 **kwargs: Any)


参数注解:
root (string) -- ImageNet 数据集的根目录。

split (string, optional) – 数据集拆分,支持 train 或 val。

transform (callable, optional) – 一个函数/转换,它接受一个 PIL 图像并返回一个转换后的版本。 例如,transforms.RandomCrop

target_transform (callable, optional) – 接收目标并对其进行转换的函数/转换。

loader – 加载给定路径的图像的函数。

ImageNet 这个数据集的参数和CIFAR10的参数相近。

2 下载ImageNet 数据集

使用这个ImageNet 这个数据集需要安装scipy这个packagesy

所以首先打开pycharm中的Terminal
输入:pip list
查看安装列表有没有scipy这个包,有则不用下载,

没有就输入pip install scipy指令来进行安装
安装好后就可以来下载这个ImageNet 数据集了

输入代码:

import torchvision

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

这会直接报错
RuntimeError: The dataset is no longer publicly accessible. You need to download the archives externally and place them in the root directory.

因为这个数据太大了,download=True已经弃用了。

意思就是这个数据集不公开了,需要自己去下载在放到指定文件下。
ImageNet 数据集有149G了。

因为太大,所以就没有下载了

如果有需要,可以看一下这个博主提供的迅雷下载种子。

Imagenet 完整数据集下载_vcbe的博客-CSDN博客_imagenet下载icon-default.png?t=M4ADhttps://blog.csdn.net/u014515463/article/details/80748125

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晓亮.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值