CV学习笔记-VGG

news2025/1/12 22:51:16

VGG

1. 常见的卷积神经网络

在这里插入图片描述

VGG属于一种经典的卷积神经网络结构,其出现在AlexNet之后,由于AlexNet的突破证实了卷积神经网络的可行性,VGG的思路主要是将网络层数加深,从某种意义上说,网络层数的加深可以粗略地认为考虑判定问题的条件增多,导致判定器更加准确,实际上原理应该更加复杂,关于深度学习的可解释性一直以来是个比较难的问题,直观的感受来自于多项式拟合,当不同次数的项越多拟合一个数据集(点)形成的线越准确。

VGG属于对传统卷积神经网络网络加深优化思路的典范。

2. VGG的网络结构

VGG的网络结构之所以经典,在于其首次将深度学习的层数做的比较“深”,达到了16-19层之多,同时,其卷积核的尺寸也非常的小(3 × \times × 3),VGG-19的网络结构如下

在这里插入图片描述

可以看到,其层数的划分为每次经过激活函数或者最终经过分类器为一层。

以下为VGG-16的网络结构图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wHaqajoJ-1674748461572)(./imgs/image-20230126223618325.png)]

VGG-16的网络结构处理过程

  1. 将输入的原始图片resize到3通道224 × \times × 224的数据形式
  2. 经过第一层卷积,使用3 × \times × 3的卷积核对输入进行两次卷积,经过计算,输出的feature map通道数为64,即输出为224 × \times × 224 × \times × 64,再经过2 × \times × 2的核进行最大池化处理,降采样为112 × \times × 112 × \times × 64
  3. 经过第二层卷积,使用3 × \times × 3的卷积核对输入进行两次卷积,经过计算,输出的feature map通道数为128,即输出为112 × \times × 112 × \times × 128,再经过2 × \times × 2的核进行最大池化处理,降采样为56 × \times × 56 × \times × 128
  4. 经过第三层卷积,使用3 × \times × 3的卷积核对输入进行三次卷积,经过计算,输出的feature map通道数为256,即输出为56 × \times × 56 × \times × 256,再经过2 × \times × 2的核进行最大池化处理,降采样为28 × \times × 28 × \times × 256
  5. 经过第四层卷积,使用3 × \times × 3的卷积核对输入进行三次卷积,经过计算,输出的feature map通道数为512,即输出为28 × \times × 28 × \times × 512,再经过2 × \times × 2的核进行最大池化处理,降采样为14 × \times × 14 × \times × 512
  6. 经过第四层卷积,使用3 × \times × 3的卷积核对输入进行三次卷积,经过计算,输出的feature map通道数为64,即输出为14 × \times × 14 × \times × 512,再经过2 × \times × 2的核进行最大池化处理,降采样为7 × \times × 7 × \times × 512
  7. 使用卷积的方式等效替代FC全连接层,输出为1 × \times × 1 × \times × 4096
  8. 使用卷积的方式等效替代FC全连接层,输出为1 × \times × 1 × \times × 1000(最终输出的1000个通道分别代表的1000种类别的预测)

3. 卷积层等效替代全连接层

操作要点: 将卷积核的尺寸大小设置为输入空间的大小

等价分析: 由于卷积和全连接在实现上均是点乘操作,当卷积核的大小变成与输入的feature map尺寸相同时,卷积与全连接在计算与参数量上均相同,举例说明,在VGG-16中首个全连接层数输入尺寸为7 × \times × 7 × \times × 512,其输出为1 × \times × 1 × \times × 4096,这个过程完全可以用一个7 × \times × 7的卷积核来进行,此时设步长为1,填补方式为没有填补,其卷积后输出为1 × \times × 1 × \times × 4096,和全连接层等价。

4. 1 × \times × 1卷积的作用

实际作用: 实现特征通道的升维与降维

卷积操作可以对输出的通道数的大小进行改变,而池化操作不改变通道数,只改变尺寸。1 × \times × 1卷积可以在不改变尺寸的情况下更改通道数。

5. 代码实现

VGG网络部分

# -------------------------------------------------------------#
#   vgg16的网络部分
# -------------------------------------------------------------#
import tensorflow as tf

# 创建slim对象
vgg_slim = tf.contrib.vgg_slim


def vgg_16(inputs,
           num_classes=1000,
           is_training=True,
           dropout_keep_prob=0.5,
           spatial_squeeze=True,
           scope='vgg_16'):
    with tf.variable_scope(scope, 'vgg_16', [inputs]):
        # 建立vgg_16的网络

        # conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64)
        net = vgg_slim.repeat(inputs, 2, vgg_slim.conv2d, 64, [3, 3], scope='conv1')
        # 2X2最大池化,输出net为(112,112,64)
        net = vgg_slim.max_pool2d(net, [2, 2], scope='pool1')

        # conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128)
        net = vgg_slim.repeat(net, 2, vgg_slim.conv2d, 128, [3, 3], scope='conv2')
        # 2X2最大池化,输出net为(56,56,128)
        net = vgg_slim.max_pool2d(net, [2, 2], scope='pool2')

        # conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256)
        net = vgg_slim.repeat(net, 3, vgg_slim.conv2d, 256, [3, 3], scope='conv3')
        # 2X2最大池化,输出net为(28,28,256)
        net = vgg_slim.max_pool2d(net, [2, 2], scope='pool3')

        # conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(28,28,512)
        net = vgg_slim.repeat(net, 3, vgg_slim.conv2d, 512, [3, 3], scope='conv4')
        # 2X2最大池化,输出net为(14,14,512)
        net = vgg_slim.max_pool2d(net, [2, 2], scope='pool4')

        # conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(14,14,512)
        net = vgg_slim.repeat(net, 3, vgg_slim.conv2d, 512, [3, 3], scope='conv5')
        # 2X2最大池化,输出net为(7,7,512)
        net = vgg_slim.max_pool2d(net, [2, 2], scope='pool5')

        # 利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)
        net = vgg_slim.conv2d(net, 4096, [7, 7], padding='VALID', scope='fc6')
        net = vgg_slim.dropout(net, dropout_keep_prob, is_training=is_training,
                               scope='dropout6')
        # 利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)
        net = vgg_slim.conv2d(net, 4096, [1, 1], scope='fc7')
        net = vgg_slim.dropout(net, dropout_keep_prob, is_training=is_training,
                               scope='dropout7')
        # 利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)
        net = vgg_slim.conv2d(net, num_classes, [1, 1],
                              activation_fn=None,
                              normalizer_fn=None,
                              scope='fc8')

        # 由于用卷积的方式模拟全连接层,所以输出需要平铺
        if spatial_squeeze:
            net = tf.squeeze(net, [1, 2], name='fc8/squeezed')
        return net

测试

from nets import vgg16
import tensorflow as tf
import numpy as np
import utils

# 读取图片
img1 = utils.load_image("./test_data/dog.jpg")

# 对输入的图片进行resize,使其shape满足(-1,224,224,3)
inputs = tf.placeholder(tf.float32,[None,None,3])
resized_img = utils.resize_image(inputs, (224, 224))

# 建立网络结构
prediction = vgg16.vgg_16(resized_img)

# 载入模型
sess = tf.Session()
ckpt_filename = './model/vgg_16.ckpt'
sess.run(tf.global_variables_initializer())
saver = tf.train.Saver()
saver.restore(sess, ckpt_filename)

# 最后结果进行softmax预测
pro = tf.nn.softmax(prediction)
pre = sess.run(pro,feed_dict={inputs:img1})

# 打印预测结果
print("result: ")
utils.print_prob(pre[0], './synset.txt')

个人学习笔记,仅供学习交流,转载请注明出处

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

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

相关文章

编译原理学习笔记14——属性文法与语法制导翻译1

编译原理学习笔记14——属性文法与语法制导翻译114.1 属性文法14.2 属性计算14.1 属性文法 属性文法 综合属性 自下而上传递信息语法规则:根据右 部候选式中的符号 的属性计算左部被 定义符号的综合属性语法树:根据子结 点的属性和父结点 自身的属性…

【日常系列】LeetCode《30·动态规划总结》

动态规划总结 线性动态规划问题总结 打家劫舍总结 最大子数组和总结 dp[i] 依赖于前面一个或者两个状态 dp[i] 依赖于前面多个状态 注意:子序列可以不连续 dp[i] 带有一个或者多个维度 输入为两个数组或者两个字符串 lc 10【剑指 19】【top100】:正…

【LeetCode每日一题:2309. 兼具大小写的最好英文字母~~~模拟+Hash表+贪心】

题目描述 给你一个由英文字母组成的字符串 s ,请你找出并返回 s 中的 最好 英文字母。返回的字母必须为大写形式。如果不存在满足条件的字母,则返回一个空字符串。 最好 英文字母的大写和小写形式必须 都 在 s 中出现。 英文字母 b 比另一个英文字母 …

Java生成微信小程序二维码,5种实现方式,一个比一个简单

文章目录前言先看官网一、JDK自带的URLConnection方式二、Apache的HttpClient方式三、okhttp3方式四、Unirest方式五、RestTemplate方式其它细节getAccessToken构建参数mapbyte[]数组源码下载前言 先介绍一下项目场景,主要是通过微信小程序二维码裂变分享&#xff…

一时重构一时爽,一直重构一直爽

笔者(后台技术汇)恭祝各位大佬:2023年春节快乐,兔年祥瑞。距离上次更新,已经过去5个月有余了,有小伙伴疑惑笔者是不是删库跑路了..其实不是,这段时间是在参加一次比较大的项目重构(目…

学习笔记 —— python代码耗时及内存占用测试方法

1、手写耗时测试 先看结果; 主要有三种方法,各自的时钟间隔如下: time.time() timeit time.time_ns() ( time is outputted in ns!). 可见方法2,即timeit 的时钟间隔最短。 注:最后一个是以ns为单位的,前两个是…

二叉树的概念与结构

文章目录前言一、树的概念及结构1.树的概念2.树的相关概念3.树的表示4. 树在实际中的运用二、二叉树概念及结构1.概念2.特殊的二叉树5.二叉树的性质6.二叉树的存储结构(1).顺序存储(2).链式存储结语前言 因为二叉树的知识点太多,一篇文章讲不…

《真象还原》读书笔记——第一章 部署工作环境

环境: 由于平时使用 windows 系统 所以 linux 环境 使用了 linux子系统。 $ cat /proc/version Linux version 4.4.0-22000-Microsoft (MicrosoftMicrosoft.com) (gcc version 5.4.0 (GCC) )1.1 工欲善其事 必先利其器 操作环境很重要呀。 1.2 编译器 GCC: gc…

Java 23种设计模式(8.结构型模式-桥接模式)

结构型模式-桥接模式 代码分析 类图 代码 public interface Implementor {void operation(); }public class ConcreteImplementorA implements Implementor{Overridepublic void operation() {System.out.println("A");} }public class ConcreteImplementorB imple…

(Java高级教程)第四章必备前端基础知识-第二节3:CSS盒模型和浮动

文章目录一:盒模型(1)border(2)padding(3)margin二:flex布局一:盒模型 盒模型:在HTML中,每个标签(或元素)相当于是一个盒…

DaVinci:色彩匹配

z调色页面:色彩匹配Color:Color Match色彩匹配 Color Match调板是专业的一级调色工具,专门用于对视频图像进行精准的校色还原。色彩匹配时,先定位到视频中持有色卡的画面。在检视器左下角快捷菜单中选择“色卡” Color Chart工具&…

C 语言零基础入门教程(十二)

C enum(枚举) 枚举是 C 语言中的一种基本数据类型,它可以让数据更简洁,更易读。 枚举语法定义格式为: enum 枚举名 {枚举元素1,枚举元素2,……};接下来我们举个例子,比如:一星期有 7 天,如果不用枚举&…

【Linux】vim编辑器的使用

文章目录vim的基本概念vim指令集复制粘贴撤销、剪切光标定位vim的基本概念 vim是一款多模式的编辑器,在我们常用的模式有3~5种。分别是命令模式(command mode)、插入模式(Insert mode)和底行模式( last lin…

【PHP 随记】—— ThinkPHP 配置数据库

👉总目录👈\large\colorbox{skyblue}{👉总目录👈}👉总目录👈​ 文章目录1、数据库连接及导入① 数据库连接② 数据库导入2、配置 ThinkPHP 数据库连接信息① 配置连接信息1、数据库连接及导入 ① 数据库连…

大数据分析案例-基于随机森林算法构建人口普查分析模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

Datawhale 202301 设计模式 | 人工智能 现代方法 习题

Exercise 1 绪论 Q:用您自己的话来定义:(a)智能,(b)人工智能,(c)智能体,(d)理性,(e)逻…

【大数据趋势】1月24日 流动、固定汇率和货币政策独立性三者的三者选二,A股持续的会上涨。

前言:昨天写的被朋友看到,认为我写的太水,故意不提日常讨论的那个关键指标,所以下午重新修改了一下。 确定欧美大势市场形态1 - 美元指数 关键位置大概率不会一次就破,有较强反弹可能,带动美股反弹 作为长…

MH-100X微波运动传感器介绍

MH-100X微波运动传感器简介微波运动传感器是利用多普勒雷达原理设计的微波移动物体探测器。不同于一般的红外探测器,微波传感器通过通过检测物体反射的微波来探测物体的运动状况,检测对象将并不会局限于人体,还有很多其他的事物。微波传感器不…

java基础语法——条件判断与循环语句

目录 一、流程控制语句 流程控制语句分类 二、顺序结构 顺序结构概述 顺序结构图 三、选择结构 选择结构概述 选择结构(if语句1) 选择执行图1 选择结构(if语句2) 选择执行图2 选择结构(if语句3) 选择执行图3 选择结构(switch语句) switch语句执行流程图 四、 循环…

剪映电脑版超简单使用教程Mac

相机 我主要用到的两个键 点击开始创作导入本地视频 导入本地视频 将素材拖拽到时间线上 时间线面板操作 撤销、恢复、分割 撤销上一次操作也可以用快捷键 command z 定格、倒放、镜像、裁剪 剃刀 点击菜单的分割可以出来一个剃刀,分割更方便 选择模式 …