C++卷积神经网络实例:tiny_cnn代码详解(6)——average_pooling_layer层结构类分析

本文主要是介绍C++卷积神经网络实例:tiny_cnn代码详解(6)——average_pooling_layer层结构类分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  在之前的博文中我们着重分析了convolutional_layer类的代码结构,在这篇博文中分析对应的下采样层average_pooling_layer类:

  一、下采样层的作用

  下采样层的作用理论上来说由两个,主要是降维,其次是提高一点特征的鲁棒性。在LeNet-5模型中,每一个卷积层后面都跟着一个下采样层:

  原因就是当图像在经过卷积层之后,由于每个卷积层都有多个卷积模板,直接导致卷积结果输出的特征矩阵相对于输入的数据矩阵其维数要提高数倍,再加上存在若干卷积层(谷歌的某些模型甚至超过100层),若不进行降维操作,最后的特征维数可想而知,因此在这里下采样层就充当了一个特征降维的角色。比如这里用的是2*2模板均值下采样,说白了就是四个相邻像素经过加权计算变成一个,维数变为原来的四分之一,降维性能显而易见。至于鲁棒性问题,理论上只要是合理的降维手段,对鲁棒性都会有一定的提升(当然这是我的个人观点)。

  二、average_pooling_layer类结构

  average_pooling_layer类同样继承自基类partial_connected_layer,和前文中所说的convolutional_layer类算是相同继承层次,因此与convolutional_layer类在结构上也非常相似,但下采样层由于其功能相对单一,因此在结构上比convolutional_layer类要简洁不少

  2.1 成员变量

  average_pooling_layer类的成员变量一共有两个,分别保存输入数据矩阵的属性和下采样后输出特征矩阵的属性:

  至于有关layer_size_t、index3d等类型的相关知识在上一篇博客中已经进行了详细介绍,这里不再赘述。

  2.2 构造函数

  average_pooling_layer类的构造函数十分简洁,基本上就是调用了基类partial_connected_layer的构造函数,然后在完成自己类中两个成员变量的初始化而已:

  这里稍稍介绍一下pooling_size_mismatch()函数。这是一个定义在基类layer中的函数,作用就是抛出尺寸异常的信息,而在每一层中对尺寸匹配的检验标准都不同,因此各个子类在调用这个函数给出异常信息时,需要依据对应层的标准来进行判断,比如在下采样层,我们认为如果输入数据矩阵的尺寸不是下采样窗口的整数倍时,则无法正常进行分块降维,即视为尺寸不匹配,抛出尺寸异常信息:

  2.3 其他函数

  除了构造函数,下采样层还提供了一些其他函数,包括下采样矩阵权重初始化函数和偏置初始化函数(在下采样的过程中同样需要加上偏置)init_connection(),权重矩阵设置函数connect_kernel(),以及输出特征矩阵图像化的转换函数output_to_image(),以上这些函数与前一篇博文中convolutional_layer类中的对应的函数功能可以说是完全相同(毕竟都是继承与同一个基类),这里不再赘述。

  三、注意事项

  1、下采样层后的激活函数

  在实际的卷积神经网络模型中,对卷积特征输出进行下采样之后,紧接着应该送入激活函数中,换句话说下采样层和激活函数应该是紧密相关的。不过在这里作者并没有将激活函数直接放在average_pooling_layer类中,而是将每个激活函数都封装成对应的类,并放到activation命名空间下:

  2、LeNet-5模型的经典性

  这里在介绍卷积伸神经网络模型时一直沿用LeNet-5模型,主要是因为它既结构简单又堪称CNN的经典之作,但在实际应用中卷积神经网络的层数可不止这些,举个例子,2014年的VGG模型已经将网络扩展到16层的深度,至于各大深度学习研究院内部已经将网络加深到多少层这个已经不得而知,总之一两块泰坦级别的N卡是不够用的。



如果觉得这篇文章对您有所启发,欢迎关注我的公众号,我会尽可能积极和大家交流,谢谢。


这篇关于C++卷积神经网络实例:tiny_cnn代码详解(6)——average_pooling_layer层结构类分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c