VGG- torch vision.models.vgg16介绍1关于pretrained参数如果说为FALSE的话这些参数就是初始化的参数它没有在任何数据集上进行一个训练。‌创建一个不加载预训练权重的 VGG16 网络模型‌也就是只搭建网络结构里面的参数全是随机初始化的默认值。总的来说pretrainedFalse 表示不下载和使用在 ImageNet 数据集上训练好的权重参数模型的所有参数都是随机初始化的。对应的 pretrainedTrue 则会从网络下载预训练权重在 ImageNet 上训练好的参数模型直接具备一定的特征提取能力。2关于progress参数progress如果为true的话它会显示一个下载进度条。torchvision.datasets.ImageNet数据集数据集选择课程使用CIFAR-10因为其体积小(便于下载)实际应用可选择更大数据集如ImageNetImageNet参数root指定数据集存储路径split选择训练集(‘train’)或验证集(‘val’)transform对输入图像进行预处理(是否要在图像上进行变幻target_transform对标签进行转换是否要在target上进行变幻loader自定义图像加载函数依赖要求使用ImageNet数据集需要安装scipy包如何验证当前环境已安装scipy包环境激活确认在终端中正确激活的PyTorch环境会在命令行前显示环境名称如(pytorch)查看已安装包使用pip list命令可查看当前环境所有已安装的Python包安装缺失包若未找到所需包使用pip install scipy进行安装imagenet数据集下载如上报错下载限制ImageNet数据集已不再提供公开访问需要手动下载压缩文件并放置到根目录下载方法通过学术种子网站获取训练集和验证集种子文件训练集文件名为ILSVRC2012_img_train.tar大小147.9GB验证集文件名为ILSVRC2012_img_val.tar使用迅雷等下载工具进行下载但是如上数据集过大下载时间过长了。作罢。torchvision.models.vgg16: 预定义模型分类模型我们打印vgg16_true,会发现分类vgg16模型其实也是分类模型分出的类别有1000个(最后一行out_features是1000pretrained-False模式仅加载网络架构参数为默认初始化值不需要下载额外数据pretrained-True模式加载ImageNet预训练参数需要从网络下载约528MB参数文件参数已在ImageNet数据集上优化过在vgg16_true和vgg16_false的classifier属性中选择protected attributes _modules 查看第1个的weight权重pretrained设置为true或者false的情况下它下载的网络模型的weight有什么差别?目前看不太出来差别。理论上的参数差异pretrainedTrue时参数为经过预训练后的具体数值pretrainedFalse时参数多为0或接近0的初始化值torchvision.models.vgg16相当于我们之前写的网络架构的作用即如下tudui类的作用两者是替换的作用torchvision.models.vgg16模型加载ImageNet数据集限制官方不再开放下载需手动下载100GB数据并解压到指定目录替代方案使用小型数据集如CIFAR-10验证模型类别数量差异:CIFAR-10数据集仅10类VGG16模型(基于ImageNet)输出1000类模型适配问题: 需要调整网络输出层以适应不同类别数量的数据集使用CIFAR-1010类适配VGG16原输出1000类的两种方法1.修改最后一层Linear(4096, 10)2.追加新层Linear(1000, 10)# -*- coding: utf-8 -*-# 作者小土堆# 公众号土堆碎念importtorchvision# train_data torchvision.datasets.ImageNet(../data_image_net, splittrain, downloadTrue,# transformtorchvision.transforms.ToTensor())fromtorchimportnn vgg16_falsetorchvision.models.vgg16(pretrainedFalse)# 加载未预训练的VGG16模型vgg16_truetorchvision.models.vgg16(pretrainedTrue)# 加载预训练的VGG16模型#print(ok)#train_datatorchvision.datasets.CIFAR10(../data,trainTrue,transformtorchvision.transforms.ToTensor(),downloadTrue)vgg16_true.classifier.add_module(add_linear,nn.Linear(1000,10))# 添加层法在现有网络后添加新的线性层输入1000输出10print(vgg16_true)print(vgg16_false)# 直接修改法将最后的全连接层输出特征数从1000改为10vgg16_false.classifier[6]nn.Linear(4096,10)print(vgg16_false)修改前的vgg16_true的classifier修改后的vgg16_true的classifier确实新添加了一层。修改前的vgg16_false.classifier修改后的vgg16_false.classifier我们看出最后的全连接层输出特征数从1000改为10了。