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

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

  在之前的博文中我们已经将顶层的网络结构都介绍完毕,包括卷积层、下采样层、全连接层,在这篇博文中主要有两个任务,一是整体贯通一下卷积神经网络在对图像进行卷积处理的整个流程,二是继续我们的类分析,这次需要进行分析的是卷积层和下采样层的公共基类:partial_connected_layer。

  一、卷积神经网络的工作流程

  首先给出经典的5层模式的卷积神经网络LeNet-5结构模型:

  这是一个典型的卷积层-下采样层-卷积层-下采样层-卷积层-全连接层模式的CNN结构,接下里观察在我们的程序实例中对网络的初始化情况:

  (1)卷积层C1:输入图像的尺寸为32*32,卷积核尺寸(卷积窗口尺寸)为5*5,输入数据模板数量为1,卷积核模板种类为6个,导致C1层对每个输入的图像进行卷积操作之后,得到6个卷积特征模板输出,并且卷积后图像的尺寸变为32-5+1=28

  (2)均值下采样层S2:输入图像的尺寸为28*28,输入数据矩阵的个数为6个,均值下采样是的邻域窗口为2*2,。这里需要强调的一点是S2和C1是相邻层,S2以C1层的输出为输入,因此S2的输入尺寸等于C1的输出尺寸,S2的输入特征模板个数等于C1的输出特征模板个数,并且这两层之间的连接方式为全连接。S2层由于对输入数据矩阵进行了2*2的均值下采样,因此导致数据尺寸会缩小为原来的四分之一,即14*14。

  (3)卷积层C3:输入图像尺寸为14*14,卷积核尺寸为5*5,输入数据模板数量为6个,该层卷积模板种类为16个,导致C3层对每个输入的图像进行卷积操作之后,得到16个卷积特征模板输出,并且卷积后图像的尺寸变为14-5+1=10。并且C3层与S2层之间的连接属性并非是默认的全连接,而是按照指定连接方式(存储在connection变量中)进行连接。

  (4)均值下采样层S4:输入数据矩阵的尺寸为10*10,输入数据矩阵的个数为16个,均值下采样的邻域窗口为2*2,与S2相似,这里的下采样操作同样导致矩阵尺寸减半,因此S4层的特征矩阵输入尺寸为5*5。

  (5)卷积层C5:输入数据矩阵尺寸为5*5,卷积核尺寸为5*5,输入数据模板数量为16,卷积核模板种类为120个。由于在这一层数据矩阵的尺寸已经和卷积核尺寸相同,导致每一次的卷积操作都将得到一个具体数值(即卷积窗口无法进行滑动),导致C5层输出的特征结构是一个120维的特征向量。

  (6)全连接层:输入特征维数为120,输出特征维数为10(一共有十类),完成特征的分类工作,类此与一个抽象的线性分类函数。

  (6)激活函数:从代码中可以看出,这里各个层之间的激活函数统一选用tan_h函数,当然tiny_cnn中还封装了很多其他类型的激活函数,在这里可以随便选择,但需要注意的一点是这个网络中理论上只能使用一种类型的激活函数。

  二、partial_connected_layer类结构

  在分析partial_connected_layer类的过程中,同样遵循“成员变量-构造函数-功能函数”的分析流程

  2.1 成员变量

  partial_connected_layer类主要有以下五个成员变量:

  这五个成员变量的结构及功能是分析tiny_cnn网络映射机制的一个重点,因此在这里对其着重进行一下分析。首先需要注明一点的是,前三个变量本质上是一个双层vector结构的成员变量,之所以称其为双层vector,是因为在io_connection等别名对应的宏定义中,已经包含了一层vector属性:

  因此weight2io_、out2wi_、in2wo_、bias2out_均是双层的vector结构,前三个变量的核心存储单元是pair(,),第四个变量的核心存储单元则是一个无符号整型变量,为了更好的说明这种双层vector的特殊结构,这里给出一个示意图:

  这里之所以采用了双层的vector结构,主要原因在于partial_connected_layer类是一个基类型,需要卷积层和下采样层提供基本层结构框架,而在实际的网络模型中都包含多个相同结构的卷积层和下采样层,在对具体某一层的某一个映射核进行索引时,就需要用到这种双层的vector结构。最外层的vector(vector m)用来标记当前层的具体标号,即指明当前层是具体哪一层;内层的vector()(vector m1~vector mn)用来索引当前层中具体哪一个卷积核,因为一个卷积核包含多个权重值(例如C1层共有6个卷积核,每个卷积核包含5*5=25个权重值,因此C1层在存储卷积核权重时需要用到6个vecto类型容器,每个容器中包含25个值)。总之一个卷积核中包含多个权重值,一个卷积层中包含多个卷积核,这就要求使用一种双层vector的数据结构对它进行存储,其索引机制一定程度上有些类似于二维数组的索引机制。

  OK,这篇博客就先介绍到这里,在下一篇博文中我们将着重介绍partial_connected_layer类中的相关构造函数以及一些重要的功能函数。



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


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



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

相关文章

Python标准库之数据压缩和存档的应用详解

《Python标准库之数据压缩和存档的应用详解》在数据处理与存储领域,压缩和存档是提升效率的关键技术,Python标准库提供了一套完整的工具链,下面小编就来和大家简单介绍一下吧... 目录一、核心模块架构与设计哲学二、关键模块深度解析1.tarfile:专业级归档工具2.zipfile:跨平台归档首选3.

MySQL 内存使用率常用分析语句

《MySQL内存使用率常用分析语句》用户整理了MySQL内存占用过高的分析方法,涵盖操作系统层确认及数据库层bufferpool、内存模块差值、线程状态、performance_schema性能数据... 目录一、 OS层二、 DB层1. 全局情况2. 内存占js用详情最近连续遇到mysql内存占用过高导致

idea的终端(Terminal)cmd的命令换成linux的命令详解

《idea的终端(Terminal)cmd的命令换成linux的命令详解》本文介绍IDEA配置Git的步骤:安装Git、修改终端设置并重启IDEA,强调顺序,作为个人经验分享,希望提供参考并支持脚本之... 目录一编程、设置前二、前置条件三、android设置四、设置后总结一、php设置前二、前置条件

python中列表应用和扩展性实用详解

《python中列表应用和扩展性实用详解》文章介绍了Python列表的核心特性:有序数据集合,用[]定义,元素类型可不同,支持迭代、循环、切片,可执行增删改查、排序、推导式及嵌套操作,是常用的数据处理... 目录1、列表定义2、格式3、列表是可迭代对象4、列表的常见操作总结1、列表定义是处理一组有序项目的

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11范围for初始化列表auto decltype详解

《C++11范围for初始化列表autodecltype详解》C++11引入auto类型推导、decltype类型推断、统一列表初始化、范围for循环及智能指针,提升代码简洁性、类型安全与资源管理效... 目录C++11新特性1. 自动类型推导auto1.1 基本语法2. decltype3. 列表初始化3

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

SQL Server 中的 WITH (NOLOCK) 示例详解

《SQLServer中的WITH(NOLOCK)示例详解》SQLServer中的WITH(NOLOCK)是一种表提示,等同于READUNCOMMITTED隔离级别,允许查询在不获取共享锁的情... 目录SQL Server 中的 WITH (NOLOCK) 详解一、WITH (NOLOCK) 的本质二、工作

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (