[动手学习深度学习]25. 使用块的网络VGG

server/2025/3/24 7:07:12/

AlexNet在LeNet的基础上增加了3个卷积层,但AlexNet作者对她们的卷积窗口、输出通道数和构造顺序均作了大量的调整,存在最大的问题是长的不规则
虽然AlexNet指明了深度卷积网络可以取得出色的结果,但并没有提供简单的规则以指导后来的研究者如何设计新的网络
后面几节主要介绍几种不同的深度网络设计思路

VGG块

VGG思想:先把网络层组成一个小块,再拿小块螺上去
这里就提出了VGG块(其实也是AlexNet的拓展)
在这里插入图片描述
AlexNet里面是有3个33的卷积层,而在VGG中,这一部分可以无限重复,通过超参数n设置,同样输出通道也可以通过参数m配置
后面又用回了LeNet的2
2的最大池化层的窗口

  • VGG块的构建

    import torch
    from torch import nn
    from d2l import torch as d2ldef vgg_block(num_convs, in_channels, out_channels):layers = []for _ in range(num_convs):layers.append(nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1))layers.append(nn.ReLU())in_channels = out_channelslayers.append(nn.MaxPool2d(kernel_size=2, stride=2)) # 这里会使宽高减半return nn.Sequential(*layers) # *用于将列表拆开成多个参数, *layers表示将layers列表里的元素按顺序作为参数输入函数
    

    还可以用更省事的方式,即用LazyConv2d,首次前向传播时根据输入的尺寸自动确定输出的尺寸,这样可以更加灵活地处理不同大小的输入。

    def vgg_block(num_convs, out_channels):layers = []for _ in range(num_convs):layers.append(nn.LazyConv2d(out_channels, kernel_size=3, padding=1))layers.append(nn.ReLU())layers.append(nn.MaxPool2d(kernel_size=2,stride=2))return nn.Sequential(*layers)
  • VGG块里为什么用33的卷积而不是用55
    55因为计算量大,所以肯定要浅一点
    在测试中发现,在同样的开销条件下,堆更多的3
    3要比少一点的5*5效果要好

在这基础上就得到了VGG架构
在这里插入图片描述
可以看出VGG相对于AlexNet的改进就是,将AlexNet新加的那一部分抽出来作为VGG块(去掉了AlexNet前面两层不规则的层),而块不同的重复次数就得到了不同的架构

# VGG-11网络的架构
# 这有5个块(每一块后面都有一个maxpooling层,把宽高减半)
# 选5个块是因为 224 / (2^5) = 7,后面就除不动了,所以只能作5块 (224是之前用的数据的值)
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))
def vgg(conv_arch):conv_blks = []in_channels = 1# 卷积层部分for (num_convs, out_channels) in conv_arch:conv_blks.append(vgg_block(num_convs, in_channels, out_channels))in_channels = out_channelsreturn nn.Sequential(*conv_blks, nn.Flatten(),nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),nn.Linear(4096, 10)) # 最后一层输出10类# 观察每个层输出的形状
X = torch.randn(1, 1, 224, 224)
for blk in vgg_block(2, 1, 64):X = blk(X)print(blk.__class__.__name__, 'output shape:\t', X.shape) # 输出形状为 (1, 64, 112, 112)

经典设计思想:宽高(空间)减半、通道数(模式)翻倍

总结

  • VGG使用可重复使用的卷积块来构建深度卷积神经网络
  • 不同卷积块个数和超参数可以得到不同复杂度的变种

发展进度

在这里插入图片描述


http://www.ppmy.cn/server/177370.html

相关文章

自由学习记录(45)

顶点片元着色器(important) 1.需要在Pass渲染通道中编写着色器逻辑 2.可以使用cG或HLSL两种shader语言去编写Shader逻辑 3.代码量较多,灵活性较强,性能消耗更可控,可以实现更多渲染细节 4.适用于光照处理较少&#xf…

RuoYi框架连接SQL Server时解决“SSL协议不支持”和“加密协议错误”

RuoYi框架连接SQL Server时解决“SSL协议不支持”和“加密协议错误” 在使用RuoYi框架进行开发时,与SQL Server数据库建立连接可能会遇到SSL协议相关的问题。以下是两个常见的错误信息及其解决方案。 错误信息1 com.zaxxer.hikari.pool.HikariPool$PoolInitializ…

Flink Cdc TiDB详解

1. 什么是 Flink TiDB CDC? 简单说就是用 Flink 实时抓取 TiDB 数据库的数据变化(比如新增、修改、删除),并将这些变化数据以流的形式处理,用于实时分析、同步到其他系统等场景。 TiDB 本身是分布式数据库&#xff0c…

Pytest的夹具共享(2)

1、问题:夹具跟用例都是写在一个py文件中,在自动化框架中,测试用例、夹具在不同的文件中,跨文件夹具使用呢? “”" 在XXX测试用例模块中,使用夹具? 如何跨文件调用? -1&#x…

基于AT89C51单片机的自动贩卖机设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90498300?spm1001.2014.3001.5503 C23 部分参考设计如下: 摘 要 自动售货机作为自动化技术的一个典型应用,已经成为现代生活中不可或缺的…

Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取。本地部署方式

开源地址:https://github.com/mendableai/firecrawl 01、FireCrawl 项目简介 Firecrawl 是一款开源、优秀、尖端的 AI 爬虫工具,专门从事 Web 数据提取,并将其转换为 Markdown 格式或者其他结构化数据。 Firecrawl 还特别上线了一个新的功…

Qt搭配CLion:Mac电脑M芯片Qt开发环境

在当今的软件开发领域,跨平台应用的需求日益增长,Qt作为一款流行的C图形用户界面库,因其强大的功能和易用性而备受开发者青睐。与此同时,CLion作为一款专为C/C打造的强大IDE,提供了丰富的特性和高效的编码体验。本文将…

C/S模型-TCP

下图是基于TCP协议的客户端/服务器程序的一般流程: TCP协议通讯流程 服务器调用socket()、bind()、listen()完成初始化后,调用accept()阻塞等待,处于监听端口的状态,客户端调用socket()初始化后,调用connect()发出SY…