VGG16模型的复现及其详解(包含如何预测)

目录

神经网络学习小记录16——VGG16模型的复现详解 学习前言什么是VGG16模型VGG网络部分实现代码图片预测

学习前言

学一些比较知名的模型对身体有好处噢!

什么是VGG16模型

VGG是由Simonyan 和Zisserman在文献《Very Deep Convolutional Networks for Large Scale Image Recognition》中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写。
该模型参加2014年的 ImageNet图像分类与定位挑战赛,取得了优异成绩:在分类任务上排名第二,在定位任务上排名第一。
可能大家会想,这样一个这么强的模型肯定很复杂吧?
其实一点也不复杂,它的结构如下图所示:

这是一个VGG被用到烂的图,但确实很好的反应了VGG的结构:
1、一张原始图片被resize到(224,224,3)。
2、conv1两次[3,3]卷积网络,输出的特征层为64,输出为(224,224,64),再2X2最大池化,输出net为(112,112,64)。
3、conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128),再2X2最大池化,输出net为(56,56,128)。
4、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256),再2X2最大池化,输出net为(28,28,256)。
5、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(28,28,512),再2X2最大池化,输出net为(14,14,512)。
6、conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(14,14,512),再2X2最大池化,输出net为(7,7,512)。
7、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)。共进行两次。
8、利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)。

最后输出的就是每个类的预测。

VGG网络部分实现代码

#-------------------------------------------------------------##   vgg16的网络部分#-------------------------------------------------------------#import tensorflow as tf# 创建slim对象slim = tf.contrib.slimdef 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 = slim.repeat(inputs, 2, slim.conv2d, 64, [3, 3], scope='conv1')        # 2X2最大池化,输出net为(112,112,64)        net = slim.max_pool2d(net, [2, 2], scope='pool1')        # conv2两次[3,3]卷积网络,输出的特征层为128,输出net为(112,112,128)        net = slim.repeat(net, 2, slim.conv2d, 128, [3, 3], scope='conv2')        # 2X2最大池化,输出net为(56,56,128)        net = slim.max_pool2d(net, [2, 2], scope='pool2')        # conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(56,56,256)        net = slim.repeat(net, 3, slim.conv2d, 256, [3, 3], scope='conv3')        # 2X2最大池化,输出net为(28,28,256)        net = slim.max_pool2d(net, [2, 2], scope='pool3')        # conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(28,28,512)        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv4')        # 2X2最大池化,输出net为(14,14,512)        net = slim.max_pool2d(net, [2, 2], scope='pool4')        # conv3三次[3,3]卷积网络,输出的特征层为256,输出net为(14,14,512)        net = slim.repeat(net, 3, slim.conv2d, 512, [3, 3], scope='conv5')        # 2X2最大池化,输出net为(7,7,512)        net = slim.max_pool2d(net, [2, 2], scope='pool5')        # 利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)        net = slim.conv2d(net, 4096, [7, 7], padding='VALID', scope='fc6')        net = slim.dropout(net, dropout_keep_prob, is_training=is_training,                            scope='dropout6')        # 利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,4096)        net = slim.conv2d(net, 4096, [1, 1], scope='fc7')        net = slim.dropout(net, dropout_keep_prob, is_training=is_training,                            scope='dropout7')        # 利用卷积的方式模拟全连接层,效果等同,输出net为(1,1,1000)        net = 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

图片预测

在图片预测之前首先看看整个文档的结构。
需要完整代码可以直接下载:
链接: https://pan.baidu.com/s/1X0iJRRisDLD9odMw1yy46w
提取码: fqm4
VGG16的模型下载可以用http://download.tensorflow.org/models/vgg_16_2016_08_28.tar.gz完成

model用于存储模型,nets用于存储网络结构,test_data用于存放图片,demo就是之后要执行的测试程序。
图片预测的步骤其实就是利用训练好的模型进行预测
1、载入图片
2、建立会话Session;
3、将img_input的placeholder传入网络,建立网络结构;
4、初始化所有变量;
5、利用saver对象restore载入所有参数。
6、读取预测结果

demo.py的代码如下:

from nets import vgg16import tensorflow as tfimport numpy as npimport 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})# 打印预测结果utils.print_prob(pre[0], './synset.txt')

utils里是一些工具代码(工具人),包括载入图片、图片大小更改、打印预测结果等:

import matplotlib.image as mpimgimport numpy as npimport tensorflow as tffrom tensorflow.python.ops import array_opsdef load_image(path):    # 读取图片,rgb    img = mpimg.imread(path)    # 将图片修剪成中心的正方形    short_edge = min(img.shape[:2])    yy = int((img.shape[0] - short_edge) / 2)    xx = int((img.shape[1] - short_edge) / 2)    crop_img = img[yy: yy + short_edge, xx: xx + short_edge]    return crop_imgdef resize_image(image, size,                 method=tf.image.ResizeMethod.BILINEAR,                 align_corners=False):    with tf.name_scope('resize_image'):        image = tf.expand_dims(image, 0)        image = tf.image.resize_images(image, size,                                       method, align_corners)        image = tf.reshape(image, tf.stack([-1,size[0], size[1], 3]))        return imagedef print_prob(prob, file_path):    synset = [l.strip() for l in open(file_path).readlines()]    # 将概率从大到小排列的结果的序号存入pred    pred = np.argsort(prob)[::-1]    # 取最大的1个、5个。    top1 = synset[pred[0]]    print(("Top1: ", top1, prob[pred[0]]))    top5 = [(synset[pred[i]], prob[pred[i]]) for i in range(5)]    print(("Top5: ", top5))    return top1

该图的预测结果为:

('Top1: ', 'n02099601 golden retriever', 0.98766345)('Top5: ', [('n02099601 golden retriever', 0.98766345), ('n02099712 Labrador retriever', 0.0108569125), ('n02101556 clumber, clumber spaniel', 0.00039345716), ('n02102480 Sussex spaniel', 0.0002893341), ('n02102318 cocker spaniel, English cocker spaniel, cocker', 0.00018955152)])  

以上就是VGG16模型的复现及其详解(包含如何预测)的详细内容,更多关于VGG16模型复现预测的资料请关注我们其它相关文章!

(0)

相关推荐

  • VGG16模型的复现及其详解(包含如何预测)

    目录 神经网络学习小记录16——VGG16模型的复现详解 学习前言什么是VGG16模型VGG网络部分实现代码图片预测 学习前言 学一些比较知名的模型对身体有好处噢! 什么是VGG16模型 VGG是由Simonyan 和Zisserman在文献<Very Deep Convolutional Networks for Large Scale Image Recognition>中提出卷积神经网络模型,其名称来源于作者所在的牛津大学视觉几何组(Visual Geometry Group)的缩写.该

  • OpenAI的Whisper模型进行语音识别使用详解

    目录 正文 Whisper 模型介绍 使用Whisper 模型进行语音识别 总结 正文 语音识别是人工智能中的一个领域,它允许计算机理解人类语音并将其转换为文本.该技术用于 Alexa 和各种聊天机器人应用程序等设备.而我们最常见的就是语音转录,语音转录可以语音转换为文字记录或字幕. wav2vec2.Conformer 和 Hubert 等最先进模型的最新发展极大地推动了语音识别领域的发展.这些模型采用无需人工标记数据即可从原始音频中学习的技术,从而使它们能够有效地使用未标记语音的大型数据集.

  • Java 存储模型和共享对象详解

    Java 存储模型和共享对象详解 很多程序员对一个共享变量初始化要注意可见性和安全发布(安全地构建一个对象,并其他线程能正确访问)等问题不是很理解,认为Java是一个屏蔽内存细节的平台,连对象回收都不需要关心,因此谈到可见性和安全发布大多不知所云.其实关键在于对Java存储模型,可见性和安全发布的问题是起源于Java的存储结构. Java存储模型原理 有很多书和文章都讲解过Java存储模型,其中一个图很清晰地说明了其存储结构: 由上图可知, jvm系统中存在一个主内存(Main Memory或J

  • springmvc处理模型数据ModelAndView过程详解

    这篇文章主要介绍了springmvc处理模型数据ModelAndView过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 springmvc提供了以下几种途径来输出模型数据: (1)ModelAndView:处理方法返回值类型为ModelAndView时,方法体即可通过该对象添加模型数据. (2)Map及Model:入参为org.springframework.ui.Model.org.springframework.ui.ModelMa

  • Java内存模型之happens-before概念详解

    简介 happens-before是JMM的核心概念.理解happens-before是了解JMM的关键. 1.设计意图 JMM的设计需要考虑两个方面,分别是程序员角度和编译器.处理器角度: 程序员角度,希望内存模型易于理解.易于编程.希望是一个强内存模型. 编译器和处理器角度,希望减少对它们的束缚,以至于编译器和处理器可以做更多的性能优化.希望是一个弱内存模型. ​因此JSR-133专家组设计JMM的核心目标就两个: 为程序员提供足够强的内存模型对编译器和处理器的限制尽可能少 ​下面通过一段代

  • Python机器学习应用之基于线性判别模型的分类篇详解

    目录 一.Introduction 1 LDA的优点 2 LDA的缺点 3 LDA在模式识别领域与自然语言处理领域的区别 二.Demo 三.基于LDA 手写数字的分类 四.小结 一.Introduction 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监督学习的降维技术,也就是说它的数据集的每个样本是有类别输出的.这点和PCA不同.PCA是不考虑样本类别输出的无监督降维技术. LDA的思想可以用一句话概括,就是"投影后类内方差最小,类间方

  • Tensorflow2.4使用Tuner选择模型最佳超参详解

    目录 前言 实现过程 1. 获取 MNIST 数据并进行处理 2. 搭建超模型 3. 实例化调节器并进行模型超调 4. 训练模型获得最佳 epoch 5. 使用最有超参数集进行模型训练和评估 前言 本文使用 cpu 版本的 tensorflow 2.4 ,选用 Keras Tuner 工具以 Fashion 数据集的分类任务为例,完成最优超参数的快速选择任务. 当我们搭建完成深度学习模型结构之后,我们在训练模型的过程中,有很大一部分工作主要是通过验证集评估指标,来不断调节模型的超参数,这是比较耗

  • 分位数回归模型quantile regeression应用详解及示例教程

    目录 什么是分位数? 什么是分位数回归? statsmodels中的分位数回归 分位数回归与线性回归 xgboost的分位数回归 普通最小二乘法如何处理异常值? 它对待一切事物都是一样的--它将它们平方! 但是对于异常值,平方会显著增加它们对平均值等统计数据的巨大影响. 我们从描述性统计中知道,中位数对异常值的鲁棒性比均值强. 这种理论也可以在预测统计中为我们服务,这正是分位数回归的意义所在--估计中位数(或其他分位数)而不是平均值. 通过选择任何特定的分位数阈值,我们既可以缓和异常值,也可以调

  • ASP.NET Core如何添加统一模型验证处理机制详解

    一.前言 模型验证自ASP.NET MVC便有提供,我们可以在Model(DTO)的属性上加上数据注解(Data Annotations)特性,在进入Action之前便会根据数据注解,来验证输入的数据是否合法,下面介绍以下如何统一处理验证并返回错误信息.话不多说了,来一起看看详细的介绍吧. 二.Action过滤器实现统一验证 我们在判断验证状态时一般会在Action里判断ModelState.IsValid是否为true. public IActionResult Create([FromBod

  • IIS短文件名漏洞复现图文详解

    一.漏洞描述 此漏洞实际是由HTTP请求中旧DOS 8.3名称约定(SFN)的代字符(~)波浪号引起的.它允许远程攻击者在Web根目录下公开文件和文件夹名称(不应该可被访问).攻击者可以找到通常无法从外部直接访问的重要文件,并获取有关应用程序基础结构的信息. 二.漏洞原理 IIS的短文件名机制,可以暴力猜解短文件名,访问构造的某个存在的短文件名,会返回404,访问构造的某个不存在的短文件名,返回400. 漏洞成因: 为了兼容16位MS-DOS程序,Windows为文件名较长的文件(和文件夹)生成

随机推荐