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层结构类分析(上)的更多相关文章
- C++卷积神经网络实例:tiny_cnn代码具体解释(7)——fully_connected_layer层结构类分析
之前的博文中已经将卷积层.下採样层进行了分析.在这篇博文中我们对最后一个顶层层结构fully_connected_layer类(全连接层)进行分析: 一.卷积神经网路中的全连接层 在卷积神经网络中全连 ...
- C++卷积神经网络实例:tiny_cnn代码具体解释(6)——average_pooling_layer层结构类分析
在之前的博文中我们着重分析了convolutional_layer类的代码结构.在这篇博文中分析相应的下採样层average_pooling_layer类: 一.下採样层的作用 下採样层的作用理论上来 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究
一.为什么要进行实例探究? 通过他人的实例可以更好的理解如何构建卷积神经网络,本周课程主要会介绍如下网络 LeNet-5 AlexNet VGG ResNet (有152层) Inception 二. ...
- C++卷积神经网络实例(一)
跟着这位博主来学习C++的卷积网络实例,因为作者一直在更新代码,所以新的代码和这位博主的分析有所不同:这位博主写的东西太泛了,没有讲到实质, 可以参考下他分析的类与类之间的关系图.. 前四节:http ...
- 经典的卷积神经网络及其Pytorch代码实现
1.LeNet LeNet是指LeNet-5,它是第一个成功应用于数字识别的卷积神经网络.在MNIST数据集上,可以达到99.2%的准确率.LeNet-5模型总共有7层,包括两个卷积层,两个池化层,两 ...
- 卷积神经网络CNN的原理(三)---代码解析
卷积神经网络在几个主流的神经网络开源架构上面都有实现,我这里不是想实现一个自己的架构,主要是通过分析一个最简单的卷积神经网络实现代码,来达到进一步的加深理解卷积神经网络的目的. 笔者在github上找 ...
- 深入学习卷积神经网络(CNN)的原理知识
网上关于卷积神经网络的相关知识以及数不胜数,所以本文在学习了前人的博客和知乎,在别人博客的基础上整理的知识点,便于自己理解,以后复习也可以常看看,但是如果侵犯到哪位大神的权利,请联系小编,谢谢.好了下 ...
- Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN
http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...
- 卷积神经网络CNN与深度学习常用框架的介绍与使用
一.神经网络为什么比传统的分类器好 1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器 ...
随机推荐
- 【原生JS组件】javascript 运动框架
大家都知道JQuerry有animate方法来给DOM元素进行运动,CSS3中也有transition.transform来进行运动.而使用原生的Javascript来控制元素运动,须要写非常多运动的 ...
- jquery14 on() trigger() : 事件操作的相关方法
<!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...
- POJ 2430 状压DP
题意: 思路: 先预处理出所有格子的statement statement=1–>只有上边的格子被覆盖 statement=2–>只有下边的格子被覆盖 statement=3–>上下 ...
- Spring boot 解析jsp支持jsp热部署
解析jsp并且支持jsp热部署 参考地址:https://www.wanpishe.top/detail?blogId=39875536-7d45-48ec-a7b5-f36b85c3a235
- 【DRF版本】
目录 使用内置的URLPathVersioning类 使用自定义的版本控制类 首先,我们开发的项目会有多个版本. 其次,我们的项目版本会随着更新越来越多,我们不可能因出了新版本就不维护旧版本了. 那么 ...
- [Docker 官方文档] 理解 Docker
http://segmentfault.com/a/1190000002609286 什么是 Docker? Docker 是一个用于开发.交付和执行应用的开放平台,Docker 设计用来更快的交付你 ...
- Codeforces #258 Div.2 E Devu and Flowers
大致题意: 从n个盒子里面取出s多花.每一个盒子里面的花都同样,而且每一个盒子里面花的多数为f[i],求取法总数. 解题思路: 我们知道假设n个盒子里面花的数量无限,那么取法总数为:C(s+n-1, ...
- 多类别分类问题由 confusion matrix 到分类准确率(accuracy)的计算
conf_mat = confusionmat(y_true, y_pred); % 首先根据数据集上的真实 label 值,和训练算法给出的预测 label 值, % 计算 confusion ma ...
- Spring学习总结(10)——Spring JMS---三种消息监听器
消息监听器MessageListener 在spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener.SessionAwareMe ...
- STM32W108无线射频模块串行通信接口编程实例
STM32W108无线射频模块UART通信应用实例 基于STM32W108芯片,编写串口測试程序,測试串口通信.完毕PC通过串口与STM32W108进行通信. 开发环境与硬件平台 硬件:STM32W1 ...