《深度学习》VGG网络

embedded/2024/11/19 22:16:01/

文章目录

  • 1.VGG的网络架构
  • 2.案例:手写数字识别

学习目标:

  • 知道VGG网络结构的特点
  • 能够利用VGG网络完成图像分类

2014年,⽜津⼤学计算机视觉组(Visual Geometry Group)和GoogleDeepMind公司的研究员⼀起研发出了新的深度卷积神经⽹络:
VGGNet,并取得了ILSVRC2014⽐赛分类项⽬的第⼆名,主要贡献是使⽤很⼩的卷积核(3×3)构建卷积神经⽹络结构,能够取得较好的识别精
度,常⽤来提取图像特征的VGG-16和VGG-19。

1.VGG的网络架构

VGG可以看成是加深版的AlexNet,整个⽹络由卷积层和全连接层叠加⽽成,和AlexNet不同的是,VGG中使⽤的都是⼩尺⼨的卷积核(3×3),其⽹络架构如下图所示:
在这里插入图片描述
VGGNet使⽤的全部都是3x3的⼩卷积核和2x2的池化核,通过不断加深⽹络来提升性能。VGG可以通过重复使⽤简单的基础块来构建深度模型。
在这里插入图片描述
在tf.keras中实现VGG模型,⾸先来实现VGG块,它的组成规律是:连续使⽤多个相同的填充为1、卷积核⼤⼩为33的卷积层后接上⼀个步幅为2、窗⼝形状为22的最⼤池化层。卷积层保持输⼊的⾼和宽不变,⽽池化层则对其减半。我们使⽤ vgg_block 函数来实现这个基础的VGG块,它可以指定卷积层的数量 num_convs 和每层的卷积核个数num_filters:

# num_convs表示有几个卷积层,num_filters表示卷积核的个数
def vgg_block(num_convs, num_filters):# 构建序列模型blk = tf.keras.models.Sequential()#遍历卷积层for _ in range(num_convs):#设置卷积层blk.add(tf.keras.layers.Conv2D(num_filters, kernel_size=3, padding="same", activation="relu"))#池化层、blk.add(tf.keras.layers.MaxPool2D(pool_size=2, strides=2))return blk

VGG16⽹络有5个卷积块,前2块使⽤两个卷积层,⽽后3块使⽤三个卷积层。第⼀块的输出通道是64,之后每次对输出通道数翻倍,直到变为512。

#卷积快的参数
conv_arch = ((2, 64), (2, 128), (3, 256), (3, 512), (3, 512))

因为这个⽹络使⽤了13个卷积层和3个全连接层,所以经常被称为VGG-16,通过制定conv_arch得到模型架构后构建VGG16:

def vgg(con_arch):#序列模型构建net = tf.keras.models.Sequential()#生成卷积部分for(num_convs, num_filters) in con_arch:net.add(vgg_block(num_convs, num_filters))#全连接层net.add(tf.keras.models.Sequential([#展开tf.keras.layers.Flatten(),#全连接层tf.keras.layers.Dense(4096, activation="relu"),#随机失活tf.keras.layers.Dropout(0.5),#全连接层tf.keras.layers.Dense(4096, activation="relu"),#随机失活tf.keras.layers.Dropout(0.5),#输出层tf.keras.layers.Dense(10, activation="softmax")]))return net
# 网络实例化
net = vgg(conv_arch)

我们构造⼀个⾼和宽均为224的单通道数据样本来看⼀下模型的架构:

x = tf.random.uniform((1, 224, 224, 1))
y = net(x)
net.summary()

在这里插入图片描述

2.案例:手写数字识别

之后补充。。。。


http://www.ppmy.cn/embedded/138880.html

相关文章

第五章 Vue 组件与生命周期

学习目标 5.1 Vue组件5.1.1 为什么要使用组件5.1.2 组件入门5.1.2.1 全局组件5.1.2.2 局部组件 5.2 组件通讯5.2.1 父子组件定义5.2.2 父组件给子组件传值5.2.3 子组件给父组件传值5.2.4 单向数据流 5.3 插槽5.3.1 匿名插槽5.3.2 具名插槽 5.4 生命周期钩子函数5.4.1 生命周期图…

android 如何获取当前 Activity 的类名和包名

其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…

第一章 JavaSE发展史及OpenJDK与OracleJDK区别

目录 一、Java SE的发展历史 1.1. Java版本年历 二、Open JDK 和 Oracle JDK 2.1. Open JDK来源 2.2. Open JDK 和 Oracle JDK的关系 三、小结 Open JDK 官网 http://openjdk.java.net/ 一、Java SE的发展历史 Sun公司在1991年成立了一个称为绿色计划( Green Project …

React(一)

文章目录 项目地址一、创建第一个react项目二、JSX语法2.1 生成列表2.2 大括号识别JS的表达式2.3 列表循环array2.4 条件判断以及假值显示2.5 复杂条件渲染2.6 事件监听和绑定2.7 使用Fregments返回多个根标签2.8 多条件渲染2.9 导出子组件 三、组件3.1 设置组件3.2 props给子组…

网络安全检测技术

一,网络安全漏洞 安全威胁是指所有能够对计算机网络信息系统的网络服务和网络信息的机密性,可用性和完整性产生阻碍,破坏或中断的各种因素。安全威胁可分为人为安全威胁和非人为安全威胁两大类。 1,网络安全漏洞威胁 漏洞分析的…

web-02

回顾 full stack web前端 结构(html) 样式(css) 动作/交互(js) html html常用标签 扩展标签 列表 ul/ol u–un – 无序的 o-order --有顺序的 <ol> 你最喜欢的游戏是什么&#xff1f;<li>bar sleep</li><li>who knows</li> </ol>布…

从swagger直接转 vue的api

从 Swagger 直接生成 Vue.js API 调用的代码是一个非常常见的需求&#xff0c;特别是在前后端分离的项目中&#xff0c;使用 Swagger 文档自动生成 API 调用代码可以提高开发效率。虽然 Swagger 本身并没有直接生成 Vue.js 的代码&#xff0c;但你可以通过一些工具和方法来实现…

Enterprise Architect 16 下载、安装与无限30天操作

文章目录 Enterprise Architect 16 简介&#xff08;一&#xff09;支持多种建模语言和标准&#xff08;二&#xff09;强大的版本控制、协作和文档管理功能&#xff08;三&#xff09;增强的技术和用户体验&#xff08;四&#xff09;高级功能和扩展性 一&#xff0c;下载软件…