C++卷积神经网络实例:tiny_cnn代码详解(3)——层间继承关系

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

  在上一篇博文中我们顺利将tiny_cnn的程序调试通过,在这篇博文中我们尝试从整体角度给出对tiny_cnn这个深度学习框架的解读,重点论述一下其各个层直接类封装的继承关系。

  一、卷积神经网络快速入门

  tiny_cnn作为卷积神经网络的一种实现形式,在探讨其框架结构之前,首先需要简要介绍一些卷积神经网络相关的知识。首先,给出经典卷积神经网络的网络结构:

  这个是经典的LeNet-5的网络结构图,五层网络、最早用于支票上的手写数字识别,也是最早的商业化的深度学习模型。从上图中可以看出,卷积神经网络主要分为输入层、卷积层、下采样层、全连接层这几部分,这里的tiny_cnn框架在组成部分上同样借鉴了上图中的传统网络结构。至于有关卷积神经网络基本原理方面的知识由于我在之前的博文中已经详细的介绍过,这里不再赘述,具体参见深度学习Matlab工具箱代码详解,里面提供了相关的学习资料。

  二、tiny_cnn的网络结构

  tiny_cnn框架中同样封装了卷积神经网络的基本组件,并且将其封装成了相应的C++类,并建立了各个类之间的继承关系,来满足层结构之间的相似性和扩展性,这里首先给出tiny_cnn的各个网络层的类结构:

  可见在tiny_cnn中一共构造了以上几个类来表示具体的网络结构。Layer_base作为所有层结构的基类,里面定义了各个层所共有的基本属性,并且这个类是一个抽象类,其中定义了一些虚函数和纯虚函数,以便各个子类对其进行重写,实现彼此层之间不同的作用,这也是C++编程中多态性的良好体现。在Layer_base的基础上以public的形式派生出Layer子类,在其中对Layer_base的变量和成员函数做了一定的实现和扩展。在Layer的基础上公有派生出四个子类:Input_layer、Partial_connected_layer、Fully_connected_layer、Max_pooling_layer,这四个类已经能够进行一些实例化操作,完成卷积神经网络的映射任务了。在此基础上,从Partial_connected_layer类中派生得到verage_pooling_layer、Convolutional_layer两个子类,从Fully_connected_layer类的基础上派生得到Fully_connected_dropout_layer子类。以上便是tiny_cnn中与各个层结构相关的类定义。

  三、各个层结构类的简要说明

  接下来我们针对以上各个层结构类的功能做一下简要说明:

  1、Layer_base和Layer:这两个没什么说的,作为基类,封装的都是各个层所公有的操作,其内部的功能函数大都是虚函数和纯虚函数,依赖子类的多态性实例化。

  2、Input_layer:输入层,基本的层构造操作,以及前向传播的的入口和反向传播的终点,在这一层完成数据(图像矩阵)的输入以及前向传播的开始,同时准备接受反向传播的结果。

  3、convolutional_layer:卷积层,这是卷积神经网络的主力层,保存对应的卷积核和偏置核,方便在前向传播和反向传播过程中调用计算,同时提供了图像可视化结构,能够将保存的权重矩阵转换为图像形式进行可视化输出。

  4、average_pooling_layer:均值下采样层,这一层主要有两个作用,对卷积层的输出结果进行下采用并可视化输出。

  5、fully_connected_layer:全连接层,作为网络末尾的输出层,最终的输出结果就是网络的最终判决结果,即一个标签向量,这里面主要实现了前向传播算法和反向传播算法的全连接版(和卷积层略有不同)。

  以上就是在主测试程序中直接调用到的层结构,在接下来的博文中将对这些层结构类逐个进行剖析,分析其结构组成以及内部功能函数的实现方法,有一种一层一层逐层深入的意味,OK,这篇博文暂时写到这里。



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


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



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

相关文章

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

关于Maven中pom.xml文件配置详解

《关于Maven中pom.xml文件配置详解》pom.xml是Maven项目的核心配置文件,它描述了项目的结构、依赖关系、构建配置等信息,通过合理配置pom.xml,可以提高项目的可维护性和构建效率... 目录1. POM文件的基本结构1.1 项目基本信息2. 项目属性2.1 引用属性3. 项目依赖4. 构

Rust 数据类型详解

《Rust数据类型详解》本文介绍了Rust编程语言中的标量类型和复合类型,标量类型包括整数、浮点数、布尔和字符,而复合类型则包括元组和数组,标量类型用于表示单个值,具有不同的表示和范围,本文介绍的非... 目录一、标量类型(Scalar Types)1. 整数类型(Integer Types)1.1 整数字

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

PyTorch使用教程之Tensor包详解

《PyTorch使用教程之Tensor包详解》这篇文章介绍了PyTorch中的张量(Tensor)数据结构,包括张量的数据类型、初始化、常用操作、属性等,张量是PyTorch框架中的核心数据结构,支持... 目录1、张量Tensor2、数据类型3、初始化(构造张量)4、常用操作5、常用属性5.1 存储(st