课程学习 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

相关文章

Git可视化管理工具(SourceTree)使用操作大全经典

《Git可视化管理工具(SourceTree)使用操作大全经典》本文详细介绍了SourceTree作为Git可视化管理工具的常用操作,包括连接远程仓库、添加SSH密钥、克隆仓库、设置默认项目目录、代码... 目录前言:连接Gitee or github,获取代码:在SourceTree中添加SSH密钥:Cl

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python基础文件操作方法超详细讲解(详解版)

《Python基础文件操作方法超详细讲解(详解版)》文件就是操作系统为用户或应用程序提供的一个读写硬盘的虚拟单位,文件的核心操作就是读和写,:本文主要介绍Python基础文件操作方法超详细讲解的相... 目录一、文件操作1. 文件打开与关闭1.1 打开文件1.2 关闭文件2. 访问模式及说明二、文件读写1.

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.