模型实际训练笔记2-VGG

news2025/7/16 19:25:12

1、VGG简介:

VGG网络是由牛津大学的视觉几何组(visual geometry group)首次提出来的。

VGG 网络,也称为Visual Geometry Group网络,是计算机视觉领域的一个深度卷积神经网络架构。它于2014年由牛津大学的研究团队开发,这个团队在ImageNet图像分类竞赛中取得了显著的成功。VGG 网络之所以受欢迎,部分原因是它的网络结构非常简单和规范,易于理解和实现。

以下是关于 VGG 网络的一些关键特点:

  1. 深度网络:VGG 网络采用了相对较深的网络结构,有16或19层的卷积层,使其成为当时非常深的卷积神经网络之一。这种深度有助于提高网络对图像特征的抽取能力。

  2. 卷积层:VGG 网络主要由卷积层和池化层组成,这两种层交替堆叠。卷积层用于检测图像中的特征,如边缘、纹理和形状,而池化层则用于减小特征图的空间分辨率,降低计算复杂性。

  3. 小卷积核:VGG 网络使用较小的3x3卷积核,但是在卷积层之间增加了大量的卷积层。这种设计决策有助于提高网络的表示能力。

  4. 全连接层:VGG 网络在卷积和池化层之后有几层全连接层,用于最终的分类。这些全连接层在网络的顶部,负责将高层次特征映射到不同类别的概率分布。

  5. 多个版本:VGG 网络有不同版本,最著名的是VGG16和VGG19,它们分别包括16层和19层的卷积层和全连接层。这些版本的主要区别在于网络的深度。

  6. 预训练权重:由于VGG 网络在ImageNet数据集上的出色表现,它的预训练权重在许多计算机视觉任务中都被广泛使用,作为迁移学习的基础。

尽管VGG 网络在其发布时是一种非常有力的图像分类模型,但由于其深度和参数数量较大,后来的网络架构如ResNet和Inception在一些任务上取得了更好的性能,并且具有更高的计算效率。然而,VGG 仍然是深度学习的重要历史里程碑,对于理解卷积神经网络的基本概念和设计原则仍然具有重要价值。

2、VGG网络成功的原因

VGG 网络之所以取得成功,有以下几个重要原因:

  1. 深度网络的探索:VGG 网络采用了相对较深的网络结构,有16或19层的卷积层。在当时,这种深度的卷积神经网络相对较为罕见,VGG 团队的尝试鼓励了研究人员深入探索深度神经网络的潜力。

  2. 小卷积核的使用:VGG 网络使用了3x3的小卷积核,而且在卷积层之间增加了大量的卷积层。这种设计有助于增加网络的深度和表示能力。此外,它引入了重复性,使网络结构更加规范和易于理解。

  3. 预训练权重:VGG 网络在ImageNet图像分类竞赛中表现出色,这意味着它在大规模图像数据上学到了有用的特征表示。这些预训练权重成为了迁移学习的有力工具,研究人员可以在其基础上构建和微调用于各种计算机视觉任务的模型。

  4. 广泛应用:VGG 网络的成功不仅仅限于图像分类,它还在图像检测、图像分割和其他计算机视觉任务中表现出色。这使得它成为一个通用的图像处理工具,为各种应用提供了强大的特征提取功能。

  5. 简单的设计:VGG 网络的设计相对简单,易于理解和实现。这使得它成为了深度学习入门和教育的良好示例,有助于推动深度学习领域的发展。

尽管后来的网络架构如ResNet和Inception在某些任务上表现更好,但VGG 仍然具有重要的历史地位。它的成功激发了深度神经网络领域的创新,促使研究人员更深入地理解卷积神经网络的工作原理,并为迁移学习提供了重要的基础。VGG 的设计原则和深度网络的探索经验对于后来神经网络的发展产生了深远影响。

3、VGG网络的具体介绍

3.1 VGG块

经典卷积神经网络的基本组成部分是下面的这个序列:

  1. 带填充以保持分辨率的卷积层;

  2. 非线性激活函数,如ReLU;

  3. 汇聚层,如最大汇聚层。

而一个VGG块与之类似,由一系列卷积层组成,后面再加上用于空间下采样的最大汇聚层。在最初的VGG论文中 (Simonyan and Zisserman, 2014),作者使用了带有3×3卷积核、填充为1(保持高度和宽度)的卷积层,和带有2×2汇聚窗口、步幅为2(每个块后的分辨率减半)的最大汇聚层。在下面的代码中,我们定义了一个名为vgg_block的函数来实现一个VGG块。

该函数有三个参数,分别对应于卷积层的数量num_convs、输入通道的数量in_channels 和输出通道的数量out_channels.

3.2 VGG网络

与AlexNet、LeNet一样,VGG网络可以分为两部分:第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。如 图中所示。

VGG神经网络连接,图中的几个VGG块(在vgg_block函数中定义)。其中有超参数变量conv_arch。该变量指定了每个VGG块里卷积层个数和输出通道数。全连接模块则与AlexNet中的相同。

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

 3.3 代码实现

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)


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)

ratio = 4
small_conv_arch = [(pair[0], pair[1] // ratio) for pair in conv_arch]
net = vgg(small_conv_arch)

lr, num_epochs, batch_size = 0.05, 10, 128
train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=224)
d2l.train_ch6(net, train_iter, test_iter, num_epochs, lr, d2l.try_gpu())

3.4 运行结果 

loss 0.181, train acc 0.932, test acc 0.919
3453.8 examples/sec on cuda:0

4 小结

  • VGG-11使用可复用的卷积块构造网络。不同的VGG模型可通过每个块中卷积层数量和输出通道数量的差异来定义。

  • 块的使用导致网络定义的非常简洁。使用块可以有效地设计复杂的网络。

  • 在VGG论文中,Simonyan和Ziserman尝试了各种架构。特别是他们发现深层且窄的卷积(即3×3)比较浅层且宽的卷积更有效。

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

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

相关文章

PHP服务器端电商API原理及示例讲解(电商接口开发/接入)

下面小编就为大家分享一篇PHP服务器端API原理及示例讲解(接口开发),具有很好的参考价值,希望对大家有所帮助 相信大家都做过PHP请求电商API接口获取数据,比如淘宝平台商品API接口,订单接口,京东接口,1688接…

IDEA在service面板中不显示微服务的项目

在.idea文件夹下的workspace文件中的project标签内添加如下代码段&#xff0c;&#xff0c;重启idea即可看到所有服务出现在了service面板中 <component name"RunDashboard"><option name"configurationTypes"><set><option value&q…

[计算机提升] 系统软件:信息类

3.2 信息类&#xff1a;查看相关信息 3.2.1 检查windows版本&#xff1a;winver 用于查看Windows系统版本&#xff1a; 3.2.2 系统信息&#xff1a;msinfo32 用于查看系统相关信息&#xff0c;包括&#xff1a;系统摘要、硬件资源、组件、软件环境。 3.2.3 查看系统信息…

Qt 使用QtXlsx操作Excel表

1.环境搭建 QtXlsx是一个用于读写Microsoft Excel文件&#xff08;.xlsx&#xff09;的Qt库。它提供了一组简单易用的API&#xff0c;可以方便地处理电子表格数据。 Github下载&#xff1a;GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5 官方文档…

Fetch库

scalaimport com.github.katongli.http.crawler.Fetchval fetchFetch()fetch.setProxyHost("jshk.com.cn//aa")fetch.setProxyPort(0126)val responsefetch(url)val imagesresponse.images//你可以使用println将获取的图片打印出来println(images) 解释&#xff1a;…

markdown增加目录索引,实现点击目录跳转到对应的内容目录标题

文章目录 1. 教程1.1 首先正常编写文章例如如下1.2 原理 2. 示例文件2.1 标题12.1.1 小标题12.1.1.1 小小标题12.1.1.2 小小标题2 2.1.2 小标题2 1. 教程 1.1 首先正常编写文章例如如下 如果使用的是typora则可以直接点击段落-》内容目录&#xff1b;则会自动生成目录 1.2 原理…

Linux之J2EE项目部署与发布(Linux版本)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《LInux实战开发》。&#x1f3af;&#x1f3af; …

高阶JAVA篇-深入了解字符集

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 字符集的说明 1.1 ASCII 字符集 1.2 GBK 字符集 1.3 UTF-8字符集 2.0 字符集的编码与解码 2.1 编码提供了常见的方法 2.2 解码提供了常见的方法 1.0 字符集的说明 字…

【爬虫系统设计系列】模板爬虫的动态配置策略设计与实现

文章目录 1. 写在前面2. 页面配置规划3. 制定模板格式4. 模板引擎实现5. 模板爬虫优势 1. 写在前面 作为一名爬虫开发者来说&#xff0c;涉及数据采集和爬虫开发时&#xff0c;往往都面临着各种挑战。包括技术复杂性、维护成本以及数据源结构的不断变化 早期我们对爬虫开发方式…

【蓝桥杯选拔赛真题45】python调和级数 青少年组蓝桥杯python 选拔赛STEMA比赛真题解析

目录 python调和级数 一、题目要求 1、编程实现 2、输入输出 二、算法分析

众和策略:微软大动作

当地时间周二&#xff0c;美股首要指数全线收涨。但从月度数据来看&#xff0c;美股首要指数录得“三连跌”&#xff0c;10月份&#xff0c;道指跌1.36%&#xff0c;标普500指数跌2.2%&#xff0c;纳指跌2.78%。其间&#xff0c;标普和道指均为2020年3月以来初次呈现三个月连跌…

不容错过的设计软件,产品设计必看

一.图片绘制和处理工具 产品设计很多时候是需要完成产品效果图的相关工作&#xff0c;所以一些图片绘制和处理工具&#xff0c;二维或三维的都需要了解一下。 2D软件&#xff1a; 1、photoshop(PS) AdobePhotoshop&#xff0c;简称“PS这是Adobe开发并发布的一款图片处理软…

innovus: set_ccopt_property的基本用法

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 clock route clock route的net type分为三种&#xff0c;分别是root、trunk和leaf&#xff0c;其中root是指fanout超过routing_top_fanout_count约束的net&#xff0c;leaf是指…

mysql:B+树/事务

B树 : 为了数据库量身定做的数据结构 我们当前这里的讨论都是围绕 mysql 的 innodb 这个存储引擎来讨论的 其他存储引擎可能会用到hash 作为索引,此时就只能应对这种精准匹配的情况了 要了解 B树 我们先了解 B树, B树 是 B树 的改进 B树 有时候会写作 B-树 (这里的" -…

GB28181协议怎样执行保活命令

前言 GB28181协议是视频监控领域的国家标准&#xff0c;本文将解析如何在FFmpeg中增加对GB28181协议的支持&#xff0c;使其可以与支持GB28181协议的设备进行通信与控制&#xff0c;实现设备的注册、保活以及流媒体的传输。 背景介绍 GB28181协议指的是国家标准GB/T 28181—…

自学SLAM(6)相机与图像实践:OpenCV处理图像与图像拼接(点云)

前言 如果写过SLAM14讲第一次的作业&#xff0c;或者看过我之前的运行ORB_SLAM2教程应该都安装过OpenCV了&#xff0c;如果没有安装&#xff0c;没关系&#xff0c;可以看我之前的博客&#xff0c;里面有如何安装OpenCV。 链接: 运行ORB-SLAM2&#xff08;含OpenCV的安装&…

加强城市内涝积水监测系统建设,提高城市预警功能

近年来&#xff0c;随着城市化进程的不断加快&#xff0c;城市内涝问题愈发凸显&#xff0c;给城市的生命线带来了严重威胁。为了及时掌握城市内涝的情况&#xff0c;保障城市的正常运行&#xff0c;各地纷纷建立了城市内涝监测系统。城市内涝监测系统作为城市生命线的重要组成…

Redis与MySQL的数据情感:延迟双删的秘密揭示

Redis与MySQL的数据情感&#xff1a;延迟双删的秘密揭示 前言第一&#xff1a;mysql与redis数据不一致问题第二&#xff1a;为什么需要双删第三&#xff1a;如何实现延迟双删 前言 在现代应用程序中&#xff0c;MySQL 和 Redis 是两种常用的数据存储解决方案。然而&#xff0c…

金蝶云星空自定义校验器和使用

文章目录 金蝶云星空自定义校验器和使用 金蝶云星空自定义校验器和使用 1、创建类&#xff0c;并继承抽象接口 using Kingdee.BOS.Core; using Kingdee.BOS.Core.Validation; using System;namespace mm.K3.SCM.App.Service.PlugIn.SC.Validator {public class AfterOrderChe…

Python使用got库如何写一个爬虫代码?

got库是一个Python的HTTP库&#xff0c;可以用于爬取网页数据。它提供了简单易用的API&#xff0c;支持异步请求和爬虫IP设置等功能。使用got库进行爬虫开发&#xff0c;可以快速地获取所需数据。下面是使用got库进行爬虫的基本步骤&#xff1a; 1、安装got库&#xff1a;可以使…