课程学习 CV 北京邮电大学 鲁鹏(笔记四:CV经典网络讲解 之 VGG)

本文主要是介绍课程学习 CV 北京邮电大学 鲁鹏(笔记四:CV经典网络讲解 之 VGG),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

VGG

VGG论文:Very deep convolutional networks for large-scale image recognition
VGGNet由牛津大学的视觉几何组(Visual Geometry Group)提出,主要贡献在于证明了使用3x3的小卷积核,增加网络深度,可以有效提升模型性能,并且对于其他数据集也有很好的泛化性能。

VGG的结构简洁,整个网络都使用同样大小的卷积核尺寸(3x3)和最大池化尺寸(2x2)。到目前为止,VGG仍然被用来提取图像特征。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
定义卷积函数

def conv2d(x, W, b, strides=1):# Conv2D wrapper, with bias and relu activationx = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME')x = tf.nn.bias_add(x, b)return tf.nn.relu(x)

定义池化函数

def maxpool2d(x, k=2):# MaxPool2D wrapperreturn tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME')

定义VGG结构

def conv_net(x, weights, biases, dropout):# Reshape input picture  x.shape:(128,128,3)x = tf.reshape(x, shape=[-1, 128, 128, 3])# Convolution Layerconv1 = conv2d(x, weights['wc1'], biases['bc1'])conv2 = conv2d(conv1, weights['wc2'], biases['bc2'])# Max Pooling (down-sampling)pool1 = maxpool2d(conv2, k=2)print(pool1.shape)  # (64,64,64)# Convolution Layerconv3 = conv2d(pool1, weights['wc3'], biases['bc3'])conv4 = conv2d(conv3, weights['wc4'], biases['bc4'])# Max Pooling (down-sampling)pool2 = maxpool2d(conv4, k=2)print(pool2.shape)  # (32,32,128)# Convolution Layerconv5 = conv2d(pool2, weights['wc5'], biases['bc5'])conv6 = conv2d(conv5, weights['wc6'], biases['bc6'])conv7 = conv2d(conv6, weights['wc7'], biases['bc7'])# Max Poolingpool3 = maxpool2d(conv7, k=2)print(pool3.shape)  # (16,16,256)# Convolution Layerconv8 = conv2d(pool3, weights['wc8'], biases['bc8'])conv9 = conv2d(conv8, weights['wc9'], biases['bc9'])conv10 = conv2d(conv9, weights['wc10'], biases['bc10'])# Max Poolingpool4 = maxpool2d(conv10, k=2)print(pool4.shape)  # (8,8,512)conv11 = conv2d(pool4, weights['wc11'], biases['bc11'])conv12 = conv2d(conv11, weights['wc12'], biases['bc12'])conv13 = conv2d(conv12, weights['wc13'], biases['bc13'])# Max Poolingpool5 = maxpool2d(conv13, k=2)print(pool5.shape)  # (4,4,512)# Fully connected layer# Reshape conv2 output to fit fully connected layer inputfc1 = tf.reshape(pool5, [-1, weights['wd1'].get_shape().as_list()[0]])fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1'])fc1 = tf.nn.relu(fc1)# Apply Dropoutfc1 = tf.nn.dropout(fc1, dropout)# fc2 = tf.reshape(fc1, [-1, weights['wd2'].get_shape().as_list()[0]])fc2 = tf.add(tf.matmul(fc1, weights['wd2']), biases['bd2'])fc2 = tf.nn.relu(fc2)# Apply Dropoutfc2 = tf.nn.dropout(fc2, dropout)'''fc3 = tf.reshape(fc2, [-1, weights['out'].get_shape().as_list()[0]])fc3 = tf.add(tf.matmul(fc2, weights['out']), biases['bd2'])fc3 = tf.nn.relu(fc2)'''# Output, class predictionout = tf.add(tf.matmul(fc2, weights['out']), biases['out'])return out

定义权重

weights = {# 3x3 conv, 3 input, 24 outputs'wc1': tf.Variable(tf.random_normal([3, 3, 3, 64])),'wc2': tf.Variable(tf.random_normal([3, 3, 64, 64])),'wc3': tf.Variable(tf.random_normal([3, 3, 64, 128])),'wc4': tf.Variable(tf.random_normal([3, 3, 128, 128])),'wc5': tf.Variable(tf.random_normal([3, 3, 128, 256])),'wc6': tf.Variable(tf.random_normal([3, 3, 256, 256])),'wc7': tf.Variable(tf.random_normal([3, 3, 256, 256])),'wc8': tf.Variable(tf.random_normal([3, 3, 256, 512])),'wc9': tf.Variable(tf.random_normal([3, 3, 512, 512])),'wc10': tf.Variable(tf.random_normal([3, 3, 512, 512])),'wc11': tf.Variable(tf.random_normal([3, 3, 512, 512])),'wc12': tf.Variable(tf.random_normal([3, 3, 512, 512])),'wc13': tf.Variable(tf.random_normal([3, 3, 512, 512])),# fully connected, 32*32*96 inputs, 1024 outputs'wd1': tf.Variable(tf.random_normal([4 * 4 * 512, 1024])),'wd2': tf.Variable(tf.random_normal([1024, 1024])),# 1024 inputs, 10 outputs (class prediction)'out': tf.Variable(tf.random_normal([1024, 10]))}

定义偏置

biases = {'bc1': tf.Variable(tf.random_normal([64])),'bc2': tf.Variable(tf.random_normal([64])),'bc3': tf.Variable(tf.random_normal([128])),'bc4': tf.Variable(tf.random_normal([128])),'bc5': tf.Variable(tf.random_normal([256])),'bc6': tf.Variable(tf.random_normal([256])),'bc7': tf.Variable(tf.random_normal([256])),'bc8': tf.Variable(tf.random_normal([512])),'bc9': tf.Variable(tf.random_normal([512])),'bc10': tf.Variable(tf.random_normal([512])),'bc11': tf.Variable(tf.random_normal([512])),'bc12': tf.Variable(tf.random_normal([512])),'bc13': tf.Variable(tf.random_normal([512])),'bd1': tf.Variable(tf.random_normal([1024])),'bd2': tf.Variable(tf.random_normal([1024])),'out': tf.Variable(tf.random_normal([10]))}

Construct model

pred = conv_net(x, weights, biases, keep_prob)# Define loss and optimizer损失and优化
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)# Evaluate model
correct_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))# Initializing the variables
init = tf.global_variables_initializer()
saver = tf.train.Saver()

VGG网络的大体结构就定义好了,只要初始化变量,设置Session,定义输入图像就可以跑了

这篇关于课程学习 CV 北京邮电大学 鲁鹏(笔记四:CV经典网络讲解 之 VGG)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/621198

相关文章

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python学习笔记之getattr和hasattr用法示例详解

《Python学习笔记之getattr和hasattr用法示例详解》在Python中,hasattr()、getattr()和setattr()是一组内置函数,用于对对象的属性进行操作和查询,这篇文章... 目录1.getattr用法详解1.1 基本作用1.2 示例1.3 原理2.hasattr用法详解2.

Python开发简易网络服务器的示例详解(新手入门)

《Python开发简易网络服务器的示例详解(新手入门)》网络服务器是互联网基础设施的核心组件,它本质上是一个持续运行的程序,负责监听特定端口,本文将使用Python开发一个简单的网络服务器,感兴趣的小... 目录网络服务器基础概念python内置服务器模块1. HTTP服务器模块2. Socket服务器模块

Go语言网络故障诊断与调试技巧

《Go语言网络故障诊断与调试技巧》在分布式系统和微服务架构的浪潮中,网络编程成为系统性能和可靠性的核心支柱,从高并发的API服务到实时通信应用,网络的稳定性直接影响用户体验,本文面向熟悉Go基本语法和... 目录1. 引言2. Go 语言网络编程的优势与特色2.1 简洁高效的标准库2.2 强大的并发模型2.

MySQL连表查询之笛卡尔积查询的详细过程讲解

《MySQL连表查询之笛卡尔积查询的详细过程讲解》在使用MySQL或任何关系型数据库进行多表查询时,如果连接条件设置不当,就可能发生所谓的笛卡尔积现象,:本文主要介绍MySQL连表查询之笛卡尔积查... 目录一、笛卡尔积的数学本质二、mysql中的实现机制1. 显式语法2. 隐式语法3. 执行原理(以Nes

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

从入门到进阶讲解Python自动化Playwright实战指南

《从入门到进阶讲解Python自动化Playwright实战指南》Playwright是针对Python语言的纯自动化工具,它可以通过单个API自动执行Chromium,Firefox和WebKit... 目录Playwright 简介核心优势安装步骤观点与案例结合Playwright 核心功能从零开始学习

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和