PyTorch学习笔记(13)–现有网络模型的使用及修改

    本博文是PyTorch的学习笔记,第13次内容记录,主要介绍如何使用现有的神经网络模型,如何修改现有的网络模型。

目录

  • PyTorch学习笔记(13)--现有网络模型的使用及修改
  • 1.现有网络模型
  • 2.现有模型的使用
    • 2.1VGG16模型的结构
    • 2.2修改现有VGG16模型的结构
  • 3.学习小结

1.现有网络模型

    在现有的torchvision中提供了许多常见的神经网络模型,这些模型主要包括:分类、语义分割、目标检测、视频分类等类型,其中分类主要针对图像分类,包括AlexNet、VGG、ResNet、GoogLeNet等网络。具体情况可以参照PyTorch官网。详情如下截图所示:

2.现有模型的使用

2.1VGG16模型的结构

    现以ImageNet数据集为例,神经网络选取VGG16,具体细节请参照PyTorch官网,VGG16的模型参数如下所示:

    VGG16的函数定义结构为:torchvision.models.vgg16_bn(pretrained: bool = False, progress: bool = True, **kwargs: Any) → torchvision.models.vgg.VGG。其中pretrained参数表示是否使用已预训练的模型参数。通过代码调用现有VGG16模型如下:

import torchvisionvgg16_false = torchvision.models.vgg16(pretrained=False)
vgg16_true = torchvision.models.vgg16(pretrained=True)
print(vgg16_true)

该代码运行结果为输出vgg16模型的基本结构,但是一开始需要下载vgg16的模型文件,大小为528M,下载时间较长,代码运行效果如下所示:

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

    从上述运行结果可知:VGG16网络是由13层卷积层和3层全连接层组成,最后网络输出一共有1000个分类结果。

2.2修改现有VGG16模型的结构

    在VGG16模型后增加一个线性层,实现将VGG16的1000个类别输出为CIFAR10的10个类别,代码如下:

# coding :UTF-8
# 文件功能: 代码实现预训练模型的功能
# 开发人员: dpp
# 开发时间: 2021/8/18 6:45 下午
# 文件名称: model_pretrained.py
# 开发工具: PyCharm
import torchvision# train_data = torchvision.datasets.ImageNet("ImageNet", 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)# 如何利用现有VGG16结构实现CIFAR10的10个类别的输出 在原有VGG16结构后面增加一层线性层
train_data = torchvision.datasets.CIFAR10("CIFAR10", train=True, transform=torchvision.transforms.ToTensor(),
download=True)vgg16_true.add_module("add_linear", nn.Linear(1000, 10))   # in_features = 1000 out_features = 10
print(vgg16_true)

    上述代码输出结果为如下,从输出结果能看出与原VGG16网络相比,最后增加了一层线性层Linear。

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) #增加的线性层 Linear
)

    如果想将最后的线性层加在classifier中,则将代码修改如下:

# coding :UTF-8
# 文件功能: 代码实现预训练模型的功能
# 开发人员: dpp
# 开发时间: 2021/8/18 6:45 下午
# 文件名称: model_pretrained.py
# 开发工具: PyCharm
import torchvision# train_data = torchvision.datasets.ImageNet("ImageNet", 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)# 如何利用现有VGG16结构实现CIFAR10的10个类别的输出 在原有VGG16结构后面增加一层线性层
train_data = torchvision.datasets.CIFAR10("CIFAR10", train=True,transform=torchvision.transforms.ToTensor(),download=True)vgg16_true.classifier.add_module("add_linear", nn.Linear(1000, 10))   # in_features = 1000 out_features = 10
print(vgg16_true)

    将线性层Linear加在classifier中,输出结果为:

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

3.学习小结

    在本文重点讲解了现有神经网络模型的使用和修改方法,在已有模型的基础上搭建自己的模型,是十分方便的。在一下一篇博文,将介绍如何保存和读取网络模型。

PyTorch学习笔记(13)--现有网络模型的使用及修改相关推荐

  1. PyTorch学习笔记(13)——强力的可视化工具visdom

    今天,让我们来放松一下大脑,学习点轻松的东西----可视化工具Visdom,它可以让我们在使用PyTorch训练模型的时候,可视化中间的训练情况,无论是loss变化还是中间结果比较.相比干呆呆的瞪着命 ...

  2. Linux学习笔记13:把网卡名字都修改成eth*

    修改网卡名: 对于Centos6一般就不改了,默认就是eth*,那么网卡名在哪里定义? 在这个文件:/etc/udev/rules.d/70-persistent-net.rules 如图:指明了MA ...

  3. # PyTorch学习笔记(15)--神经网络模型训练实战

    PyTorch学习笔记(15)–神经网络模型训练实战     本博文是PyTorch的学习笔记,第15次内容记录,主要是以一个实际的例子来分享神经网络模型的训练和测试的完整过程. 目录 PyTorch ...

  4. Pytorch学习笔记总结

    往期Pytorch学习笔记总结: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 Pytorch系列目录: PyTorch学习笔记( ...

  5. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...

  6. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架

    Hadoop学习笔记-13.分布式集群中节点的动态添加与下架 开篇:在本笔记系列的第一篇中,我们介绍了如何搭建伪分布与分布模式的Hadoop集群.现在,我们来了解一下在一个Hadoop分布式集群中,如 ...

  7. PyTorch学习笔记(七):PyTorch可视化

    PyTorch可视化 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: PyTorch学习笔记(一) ...

  8. PyTorch学习笔记(六):PyTorch进阶训练技巧

    PyTorch实战:PyTorch进阶训练技巧 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本系列目录: P ...

  9. PyTorch学习笔记(四):PyTorch基础实战

    PyTorch实战:以FashionMNIST时装分类为例: 往期学习资料推荐: 1.Pytorch实战笔记_GoAI的博客-CSDN博客 2.Pytorch入门教程_GoAI的博客-CSDN博客 本 ...

最新文章

  1. 有关于mfc webbrowser插件的使用
  2. spring aop使用详解
  3. 复制Java文件打印流改进版
  4. 在数组中寻找出现次数超过数组长度一半的数
  5. ecshop /goods.php SQL Injection Vul
  6. Atitit 代码的艺术 attilax 艾提拉著作 1. 代码就像一首歌,一个文章,一个绘画 1 2. 代码就像文章 2 2.1. ,要流畅读出来,使用dsl 方法连模式 2 2.2. 段落划分与
  7. 高德地图根据经纬度获取具体城市信息
  8. c语言程序方差的计算公式,方差计算公式
  9. pymysql操作MySQL数据库表-----爬虫豆瓣top250电影并存入数据库
  10. 树莓派人脸表情识别中期报告
  11. origin画图记录
  12. 有点恐怖,这个工具能让你在 20 秒内,克隆你的声音,并转成英语!
  13. js中clearInterval的重新执行/重新开始
  14. 小米的抢购骗局+小米的抢购页面的源代码分析(二)文本数组的分析
  15. 使用JAVA面向对象语言,完成五子棋应用功能设计
  16. C语言实现简单的五子棋代码
  17. MultiNet:自主驾驶中的实时联合语义推理 论文翻译
  18. Myabtis-Plus(高级查询)
  19. 仓央嘉措比较著名的诗
  20. 基于Node.js平台的Express教程

热门文章

  1. 几种Jsp连接数据库方法!
  2. 提升学生群体中的STEAM教育核心素养
  3. 黑马android面试题
  4. 无线电改变了我们的生活
  5. 统计套利策略的五大主流策略分析与优缺点
  6. html绝对路径引入桌面图片,imgsrc=如何显示绝对路径的图片?_html/css_WEB-ITnose
  7. NLP - 关键词提取 - TextRank
  8. 从0到1搭建测试自动化框架
  9. 简单工厂模式之实例一:简单电视工厂
  10. Java实现水仙花代码