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

news/2025/11/23 21:48:20/文章来源:https://www.cnblogs.com/Samar-blog/p/19261633

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

24.1 VGG16网络模型:

(1)打开pytorch(0.9.0)—torchvision.models—VGG

P24_pytorch(0.9.0)—torchvision.models—VGG

(2)参数

点击查看代码
pretrained (bool) – If True, returns a model pre-trained on ImageNet
progress (bool) – If True, displays a progress bar of the download to stderr

24.2 ImageNet数据集

(1)ImageNet数据集要求:

This requires scipy to be installed

【可以在pycharm的终端输入:pip list,查看是否安装了scipy库】
P24_ImageNet参数和要求的库

(2)下载该数据集

点击查看代码
import torchvision.datasets
train_data = torchvision.datasets.ImageNet("./data_image_net",split='train',                                      download=True,transform=torchvision.transforms.ToTensor())

(3)报错如下:

点击查看代码
The archive ILSVRC2012_devkit_t12.tar.gz is not present in the root directory or is corrupted. You need to download it externally and place it in ./data_image_net.
【正在尝试使用的 torchvision.datasets.ImageNet 数据集没有自动下载成功】

(4)PyTorch 要求用户必须手动下载 ImageNet 数据集

ImageNet数据集太大了,仅训练集就有147.9GB

所以:就没有办法通过下载ImageNet数据集去验证vgg16模型的pretrained这个参数:
pretrained (bool) – If True, returns a model pre-trained on ImageNet

24.3 改变现有网络的参数:添加or修改

(1)查看vgg16不同pretrained情况中其网络模型参数的差别

①把pretrained这个参数设置为true或false的情况下,看其下载的网络模型其中的参数有什么差别
点击查看代码
vgg16_false = torchvision.models.vgg16(pretrained=False)
vgg16_true = torchvision.models.vgg16(pretrained=True)
print("ok")
②把断点打在print("ok"),让其debug到print的上一行代码

vgg16_true和vgg16_false:

打开vgg16_true的classifier的Protected Attributes中的_modules下的'0'中的权重weight
P24_vgg16_true的weight

打开vgg16_false的classifier的Protected Attributes中的_modules下的'0'中的权重weight
P24_vgg16_false的weight

③【区别:vgg16_false没训练,vgg16_true训练好的】

(2)print(vgg16_true),查看vgg16的网络架构

点击查看代码
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))
)

通过out_features=1000,可以知道vgg16能分出的类别是1000个

(3)应用vgg16模型到CIFAR10数据集

vgg16模型能分出的类别是1000个,CIFAR10数据集把数据分为10类

①法一:将vgg16模型架构中的最后一行代码中的:(6): Linear(in_features=4096, out_features=1000, bias=True)里面的out_features=1000改成out_features=10
②法二:在线性层 (6): Linear(in_features=4096, out_features=1000, bias=True)后面再加一层:使in_features为1000,out_features为10

(4)【添加】使用(3)的法二:add_module

①输入:
点击查看代码
import torchvision.datasets# train_data = torchvision.datasets.ImageNet("./data_image_net",split='train',
#                                            download=True,transform=torchvision.transforms.ToTensor())
from torch import nnvgg16_false = torchvision.models.vgg16(pretrained=False)
vgg16_true = torchvision.models.vgg16(pretrained=True)
print(vgg16_true)train_data = torchvision.datasets.CIFAR10("./dataset",train=True,transform=torchvision.transforms.ToTensor(),download=True)
vgg16_true.add_module("add_linear",nn.Linear(in_features=1000,out_features=10))
print(vgg16_true)
②得到的结果中就会多加一层add_linear层:

(add_linear): Linear(in_features=1000, out_features=10, bias=True)

点击查看代码
Files already downloaded and verified
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))(add_linear): Linear(in_features=1000, out_features=10, bias=True)
)
③想要(add_linear): Linear(in_features=1000, out_features=10, bias=True)加到classifier()里面,而不是整个VGG()里面,可以修改代码:

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

可见:add_linear已经加到了classifier里面:

点击查看代码
  (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)(add_linear): Linear(in_features=1000, out_features=10, bias=True))

(5)【修改】使用(3)的法一:[i]

由于vgg16_true已经被修改过(即被添加了add_linear层),现在在vgg16_false进行修改

①先打印vgg16_false

print(vgg16_false)

得到classifier里面:

点击查看代码
  (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))
②直接修改:

vgg16_false.classifier[6] = nn.Linear(in_features=4096,out_features=10,bias=True)

得到:

点击查看代码
  (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=10, bias=True))

可见,out_features变成了10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/974266.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20232403 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 主要内容:使用ARP扫描和nmap进行主机发现与端口扫描、Vsftpd后门漏洞获得root权限、Samba命令注入漏洞获取系统访问、Java RMI反序列化漏洞建立Meterpreter会话、PHP CGI参数注入漏洞。 掌握Metasploit命令…

第二讲类神经网络训练不起来

第二讲类神经网络训练不起来 一.优化失败的原因梯度为0有可能是local minima 和saddle point 因为计算优化的终止条件是梯度为0,但有可能梯度为0仅是局部最小值local minima或鞍点saddle point(多维,在某些维度是最…

【计算机网络】深入浅出DNS:网络世界的地址簿与导航系统 - 教程

【计算机网络】深入浅出DNS:网络世界的地址簿与导航系统 - 教程2025-11-23 21:39 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

2025-01-24-Fri-T-如何做一个开源项目

创建和维护一个开源项目是一个非常有意义的工作,它可以帮助你与全球开发者合作,同时建立个人或团队的影响力。以下是详细步骤,帮你从零开始创建一个成功的开源项目。 1. 确定项目目标 解决实际问题:选择一个对你或…

利用大语言模型分析技术支持诈骗Facebook群组的网络犯罪研究

本文介绍了一项利用大语言模型分析Facebook上技术支持诈骗群组的研究,涉及38万条帖子的分类分析,揭示了网络犯罪服务的运作模式和最新趋势。网络犯罪与刑罚:我们在APWG eCrimes会议上关于技术支持诈骗Facebook群组的…

一些唐话

学OI学的言论均为转载 不保证言论可读你干嘛直接放 *3500 啊?!正经比赛里不是这样的!你应该先放两个简单签到,然后提升我的心态。偶尔给我送送强点的大样例,然后在那个我上厕所的时候跟我有神秘互动。最后在某个我…

2025-05-29-Thu-T-设计模式

目录1. 设计模式相关内容介绍1.1 设计模式概述1.2 UML类图类的表示方式类之间的关系表示方法1.3 软件设计原则1.1 开闭原则1.2 里氏代换原则1.3 依赖倒转/依赖倒置原则1.4 接口隔离原则1.5 迪米特法则1.6 合成复用原则…

2025-05-27-Tue-T-JVM

目录1 JVM与Java体系结构1.1 JVM 结构简图1.2 Java代码执行流程1.3 JVM的架构模型1.4 JVM的生命周期一、内存结构1. 程序计数器2. 虚拟机栈2.1 定义2.2 栈内存溢出2.3 线程运行诊断3. 本地方法栈4. 堆4.1 定义4.2 堆内…

11-28

今日掌握了 HashMap 的常用方法(put ()、get ()、containsKey ()),理解了键的唯一性,学会了遍历 Map 集合的两种方式(keySet、entrySet)。 明日计划学习多线程编程,重点理解线程的概念、创建方式(继承 Thread …

20232421 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实践内容前期渗透主机发现 端口扫描 选做:也可以扫系统版本、漏洞等。Vsftpd源码包后门漏洞(21端口) SambaMS-RPC Shell命令注入漏洞(139端口) Java RMI SERVER命令执行漏洞(1099端口) PHP CGI参数执行注入漏…

20232315 2025-2026-1 《网络与系统攻防技术》实验六实验报告

20232315 2025-2026-1 《网络与系统攻防技术》实验六实验报告20232315 2025-2026-1 《网络与系统攻防技术》实验六实验报告 目录一、实验基本信息二、实验内容及要求三、实验过程3.1 前期渗透3.2 漏洞利用四、问题及解…

[CISCN 2022 华东北]duck WP

[CISCN 2022 华东北]duck WP[CISCN 2022 华东北]duck 一、题目来源 NSSCTF-Pwn-[CISCN 2022 华东北]duck二、信息搜集 通过 file 命令查看文件类型:通过 checksec 命令查看文件开启的保护机制:题目把 libc 文件和链接…

20232320 2025-2026-1 《网络与系统攻防技术》实验六实验报告

1.实验内容 总结一下本周学习内容,不要复制粘贴 2.实验过程 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,search一下就可以use) ②端口扫描:可以直接用nmap,也可以用Aux中的portscan/tcp等。 ③选做:也可以…

2025-01-14-Tue-T-实体关系图ERD

实体关系图(ERD)指南 什么是实体关系图(ERD)? 数据库是软件系统中不可或缺的一个组成部分,若能在数据库工程中好好利用 ER 图,便能让您生成高质量的数据库设计,用于数据库创建,管理和维护,也为人员间的交流提供…

《Either Way》

누가 내 말투가 재수없대 有人说我语气很讨人厌 잘난 척만 한대 有人说我自以为是 또 누구는 내가 너무 착하대 还有人说是我太善良 바보같을 정도래 以至于像个傻瓜 가끔은 이해조차 안 되는 시선들 有些时候 被投来不…

20232424 2025-2026-1 《网络与系统攻防技术》实验六实验报告

20232424 2025-2026-1 《网络与系统攻防技术》实验六实验报告 1.实验内容 总结一下本周学习内容,不要复制粘贴 2.实验过程 3.问题及解决方案问题1:XXXXXX 问题1解决方案:XXXXXX 问题2:XXXXXX 问题2解决方案:XXXXX…

2024-11-26-Tue-T-SSM

SSM SSM三者的关系1 Spring IoC容器 父子工程 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w…

HTML游戏创建:利用视频作为特效自动播放的方法

HTML游戏创建:利用视频作为特效自动播放的方法pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

第四章-Tomcat线程模型与运行方式 - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11-21

今日学习了 Date 类的使用,掌握了 SimpleDateFormat 类的日期格式化(yyyy-MM-dd HH:mm:ss)与解析功能,完成了当前日期输出与生日计算案例。 明日计划学习异常处理机制,重点理解 try-catch-finally 语句,以及常见…