深度学习-------------------使用块的网络VGG

news2024/12/28 11:21:18

目录

  • VGG
    • VGG块
    • VGG架构
    • 进度
    • 总结
  • 使用块的网络(VGG)
    • VGG块
    • VGG网络
      • 观察每层输出的形状
      • 该部分总代码
    • 训练模型

VGG

在这里插入图片描述



AlexNet比LeNet更深更大,以得到更好的精度
能不能更深和更大?该如何更深更大?
选项:
    更多的全连接层(太贵)
    更多的卷积层
    将卷积层组合成块

在这里插入图片描述




VGG块

VGG块:
      3×3卷积(填充1)(n层,m通道(即:输入和输出通道是一样的))
      2×2最大池化层(步幅2)

为什么用的是3×3而不是5×5?
    因为5×5计算量大,得浅一点点。在同样的计算和开销下用3×3比5×5的效果好。即:深但窄效果更好。

在这里插入图片描述



VGG架构

        多个VGG块后接全连接层。
        不同次数的重复块得到不同的架构VGG-16,VGG-19。

在这里插入图片描述




进度

在这里插入图片描述

在这里插入图片描述




总结

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




使用块的网络(VGG)

VGG块

    使用了带有 3×3 卷积核填充为1(保持高度和宽度)的卷积层,和带有 2×2 池化窗口步幅为2(每个块后的分辨率减半)的最大池化层。在下面的代码中,我们定义了一个名为vgg_block的函数来实现一个VGG块。该函数有三个参数,分别对应于卷积层的数量num_convs、输入通道的数量in_channels 和输出通道的数量out_channels.

import torch
from torch import nn
from d2l import torch as d2l
 
 
def vgg_block(num_convs, in_channels, out_channels):
	# 创建了一个空列表 layers,用于按顺序存储将要构建的层的实例。
    layers = []
    # 循环构建卷积层和ReLU层
    for _ in range(num_convs):
    	# 将这个卷积层添加到 layers 列表中。
        layers.append(nn.Conv2d(in_channels, out_channels,
                                kernel_size=3, padding=1))
        # 添加一个ReLU激活层到 layers 列表中。
        layers.append(nn.ReLU())
        # 更新 in_channels 为 out_channels,以便下一个卷积层可以正确接收当前卷积层的输出作为输入。
        in_channels = out_channels
    # 添加最大池化层
    layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
    # 使用 nn.Sequential 将 layers 列表中的所有层打包成一个有序的容器。*layers 是解包列表,使其元素作为 nn.Sequential 的参数。
    return nn.Sequential(*layers)



VGG网络

与AlexNet、LeNet一样,VGG网络可以分为两部分:第一部分主要由卷积层池化层组成,第二部分全连接层组成。

在这里插入图片描述
    原始VGG网络有5个卷积块,其中前两个块各有一个卷积层后三个块各包含两个卷积层。 第一个模块有64个输出通道,每个后续模块将输出通道数量翻倍,直到该数字达到512。由于该网络使用8个卷积层和3个全连接层,因此它通常被称为VGG-11

# 第一个参数为几层卷积,第二个参数为输出通道数
conv_arch = ((1, 64), (1, 128), (2, 256), (2, 512), (2, 512))

每一块是进行高宽减半,224最后分成5块,为什么是5块呢?

在这里插入图片描述
是奇数,已经不能在分了。
在这里插入图片描述

实现VGG-11,可以通过在conv_arch上执行for循环来简单实现。

def vgg(conv_arch):
	# 初始化一个空列表,用于存储VGG网络中的卷积块
    conv_blks = []
    # 假设输入图像的通道数为1(例如,灰度图像)。对于彩色图像,这通常是3  
    in_channels = 1
    # 卷积层部分
    # 遍历conv_arch列表,其中每个元素是一个包含两个值的元组:(卷积层数, 输出通道数) 
    for (num_convs, out_channels) in conv_arch:
    	# 为每个卷积块调用vgg_block函数,并将结果添加到conv_blks列表中
        conv_blks.append(vgg_block(num_convs, in_channels, out_channels))
        # 更新输入通道数,为构建下一个卷积块做准备
        in_channels = out_channels
 	# 构建并返回整个网络模型
    return nn.Sequential(
    	# 解包conv_blks列表,将其中的所有卷积块按顺序添加到Sequential模型中
    	# 将卷积层输出的多维特征图展平成一维,以便输入到全连接层
        *conv_blks, nn.Flatten(),
        # 全连接层部分
        # 全连接层的输入特征数量就是特征图的通道数乘以高度再乘以宽度。即:out_channels * 7 * 7
        # Dropout层,用于防止过拟合,丢弃率为0.5  
        nn.Linear(out_channels * 7 * 7, 4096), nn.ReLU(), nn.Dropout(0.5),
        # 第二个全连接层,输入和输出特征数均为4096  
        nn.Linear(4096, 4096), nn.ReLU(), nn.Dropout(0.5),
        nn.Linear(4096, 10))
# 调用vgg函数构建网络模型,并将conv_arch作为参数传递 
net = vgg(conv_arch)



观察每层输出的形状

构建一个高度和宽度为224的单通道数据样本,以观察每个层输出的形状

X = torch.randn(size=(1, 1, 224, 224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t',X.shape) # VGG使得高宽减半,通道数加倍

结果:

在这里插入图片描述


该部分总代码

import torch
from torch import nn
from d2l import torch as d2l

def 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_channels
    layers.append(nn.MaxPool2d(kernel_size=2,stride=2))
    return nn.Sequential(*layers) # *layers表示把列表里面的元素按顺序作为参数输入函数     

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_channels

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

net = vgg(conv_arch)

# 观察每个层输出的形状
X = torch.randn(size=(1,1,224,224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t', X.shape) # VGG使得高宽减半,通道数加倍



训练模型

由于VGG-11比AlexNet计算量更大,因此我们构建了一个通道数较少的网络,足够用于训练Fashion-MNIST数据集。

ratio = 4
# conv_arch是一个列表,其中包含多个元组(pair)元组pair中包含两个参数,现在对第二个参数整除ratio目的是减小模型的大小
# 所有输出通道除以4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
# VGG接受一个卷积层的配置列表
net = vgg(small_conv_arch)
X = torch.randn(size=(1, 1, 224, 224))
for blk in net:
    X = blk(X)
    print(blk.__class__.__name__,'output shape:\t',X.shape)



lr, num_epochs, batch_size = 0.05, 10, 128
# resize=224参数表明将图像的大小调整为224x224像素
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
# 尝试获取GPU,如果可用则使用GPU进行训练,以提高训练速度。如果GPU不可用,则默认使用CPU。
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

结果:
在这里插入图片描述

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

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

相关文章

阿里Qwen2开源大模型本地部署及调试全攻略

阿里Qwen2开源大模型本地部署及调试全攻略 #Qwen2系列大模型性能卓越,超越业界知名模型。开源后受到AI开发者关注,支持多种语言,提升多语言理解。在预训练和微调上优化,实现智能水平提升。Qwen2系列模型在各项能力上均领先&#…

基于NXP i.MX8M Mini+FPGA医疗超声诊断设备

医疗超声诊断设备 超声诊断仪,又称超声医疗影像设备,是利用超声波的反射、折射和衍射,对人体内部结构进行探查的仪器。由于超声诊断的无损伤、非介入、经济实用、应用范围广等特点,超声诊断仪也成为目前医疗领域普遍使用的医疗器…

C++_进阶:二叉搜索树

文章目录 1. 二叉搜索树是什么2. 二叉搜索树的基本操作3. 二叉搜索树的实现4 二叉搜索树的性能分析 1. 二叉搜索树是什么 二叉搜索树(BST,Binary Search Tree)又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不…

汉诺塔问题详解及扩展(c++)

汉诺塔(Hanoi Tower)问题是一个著名的数学问题,它涉及到递归算法。问题的背景来源于一个传说:在印度的一个寺庙里,有三根金刚石柱和64个直径大小不一的金盘。僧侣们被命令将这些金盘从一根柱子按照从小到大的顺序移动到…

北京移民服务机构亨瑞移民:汇集全球专业顾问 30年致力全球生活方式

01      北京移民服务机构亨瑞集团成立于1992年,作为一站式海外综合服务专业平台,30年来致力于为有意赴海外求学、拓展事业、居住、生活、工作的各行业人士提供全球教育规划、身份规划及资产全球配置解决方案。    北京移民服务机构亨瑞集团公司…

在 C#/.NET Core 的 Web API 中使用 Swagger 按模块和版本分组并实现排序

文章目录 前言步骤一:安装 Swashbuckle.AspNetCore步骤二:创建自定义特性步骤三:配置 Swagger 生成文档步骤四:标记控制器和方法总结 前言 在开发 RESTful API 时,良好的文档是必不可少的。Swagger 是一种广泛使用的 …

C/C++ 多线程[1]---线程创建+线程释放+实例

文章目录 前言1. 多线程创建2. 多线程释放3. 实例总结 前言 说来惭愧,写了很久的代码,一个单线程通全部。可能是接触的项目少吧,很多多线程的概念其实都知道,但是实战并没有用上。前段时间给公司软件做一个进度条,涉及…

【Docker系列】Docker 容器时区设置指南

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

中国式现代化产业水平数据集(2011-2021年)

中国式现代化是一种社会主义现代化模式,它具有自己独特的特征和发展路径。这一现代化模式以实现国家富强、民族振兴和人民幸福为目标,强调物质文明与精神文明的协调发展以及人与自然的和谐共生 本文将中国式现代化理念与现代化产业体系相结合&#xff0…

希亦、洁盟、苏泊尔眼镜清洗机哪款好用?热门眼镜清洗机测评总结

随着科学技术的发展,电子设备的升级,越来越多的人开始戴眼镜,而眼镜由于长时间的佩戴,镜框以及镜面都积累了一些灰尘以及人们肉眼所看不见的细菌,但是如果你使用普通的清洁方式去清洗的话肯定是清洗不干净的&#xff0…

记录|Label组件如何控制下边框为直线

目录 前言一、问题描述二、重绘三、效果展示更新时间 前言 参考文章: C# WinForm开发时,仅显示label的下边框怎么解决啊? 验证过,方法可靠。并增加控制绘制的直线粗细的功能。 一、问题描述 C# winform中想只给Label组件的下边框…

佳能FAX-L160G打印机驱动程序安装

佳能FAX-L160G打印机驱动程序安装笔记 1.访问佳能官方网站https://www.canon.com.cn或者相关驱动下载网站,搜索并下载适用于佳能FAX-L160G打印机的驱动程序。 在这里跳出来相关系列(没有精确的型号),点进去搜索。 选择第一个驱动…

强化进度慢,武忠祥17堂课怎么听最高效?

武忠祥老师的17堂课怎么看? 我的建议是,别乱看! 17讲内容包括15个主要专题和2个附加专题,整体课时量还是相当大的。 以2023版的课时长度为例,即使你全程以1.5倍速观看且不做任何停顿,平均每个专题至少也…

系统项目管理师----高级----前情调研

要成功通过信息系统项目管理师的考试,需要系统性的学习和多方面的准备。以下是详细的学习资源、推荐的书籍和具体的备考步骤。 一、学习资源与网站 1. 官方网站与指南 中国计算机技术职业资格网:这是软考的官方网站,提供考试大纲、政策法规…

Java编程 : 对象的本质

1.1 从机器视角到问题视角的演变 在计算机科学的发展历程中,我们见证了从机器视角到问题视角的深刻转变。这一转变不仅体现了编程语言和技术的进步,更反映了我们对问题解决方式理解的深化。 起初,计算机编程主要依赖于机器视角。汇编语言作…

FPGA串口调试中当电脑串口无法正常通信,设备管理器中“其它设备”位置显示“USB-Blaster”显示感叹号等问题应该怎么解决?

一、问题描述 当我们进行FPGA开发关于串口等试验的设计中,都需要用到串口,而要使用串口就需要先安装串口驱动,但是在安装驱动的过程中会出现各种各样的问题。 这里就出现了如图所示的停产问题: 在图片中我们可以看到FPGA要使…

【promise】Promise的几个关键问题 (三)

Ⅰ-如何改变 promise 的状态? (1) resolve(value): 如果当前是 pending 就会变为 resolved (2) reject(reason): 如果当前是 pending 就会变为 rejected (3) 抛出异常: 如果当前是 pending 就会变为 rejected Ⅱ-一个 promise 指定多个成功/失败回调函数, 都会调用吗? 当 pro…

Jenkins-拉取代码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、Jenkins环境配置(一)配置Maven环境(1)Maven下载(2)将Maven上传服务器(3&…

解决Win11点击睡眠后,唤醒系统,程序全部关闭的问题

网上只是给出修改“在此时间后关闭硬盘”的时间,结果点击【睡眠】,重新唤醒系统,程序依旧全部关闭。这是因为点击【睡眠】时,启动了【休眠】,Win11系统中,休眠再唤醒系统,会导致程序全部关闭。我…

如何在 3 分钟内免费在 AWS 上运行 RStudio

欢迎来到雲闪世界。谈到数据分析,我有理由从本地计算机迁移到云端。最突出的是,您可以运行无限数量的机器,而无需拥有或维护它们。此外,您可以在几分钟内根据需要扩大或缩小规模。如果您选择运行 t2.micro 服务器,您可…