在之前的博文中我们已经将顶层的网络结构都介绍完毕,包括卷积层、下採样层、全连接层,在这篇博文中主要有两个任务。一是总体贯通一下卷积神经网络在对图像进行卷积处理的整个流程,二是继续我们的类分析。这次须要进行分析的是卷积层和下採样层的公共基类: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层结构类分析(上)的更多相关文章

  1. C++卷积神经网络实例:tiny_cnn代码具体解释(7)——fully_connected_layer层结构类分析

    之前的博文中已经将卷积层.下採样层进行了分析.在这篇博文中我们对最后一个顶层层结构fully_connected_layer类(全连接层)进行分析: 一.卷积神经网路中的全连接层 在卷积神经网络中全连 ...

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

    在之前的博文中我们着重分析了convolutional_layer类的代码结构.在这篇博文中分析相应的下採样层average_pooling_layer类: 一.下採样层的作用 下採样层的作用理论上来 ...

  3. DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究

    一.为什么要进行实例探究? 通过他人的实例可以更好的理解如何构建卷积神经网络,本周课程主要会介绍如下网络 LeNet-5 AlexNet VGG ResNet (有152层) Inception 二. ...

  4. C++卷积神经网络实例(一)

    跟着这位博主来学习C++的卷积网络实例,因为作者一直在更新代码,所以新的代码和这位博主的分析有所不同:这位博主写的东西太泛了,没有讲到实质, 可以参考下他分析的类与类之间的关系图.. 前四节:http ...

  5. 经典的卷积神经网络及其Pytorch代码实现

    1.LeNet LeNet是指LeNet-5,它是第一个成功应用于数字识别的卷积神经网络.在MNIST数据集上,可以达到99.2%的准确率.LeNet-5模型总共有7层,包括两个卷积层,两个池化层,两 ...

  6. 卷积神经网络CNN的原理(三)---代码解析

    卷积神经网络在几个主流的神经网络开源架构上面都有实现,我这里不是想实现一个自己的架构,主要是通过分析一个最简单的卷积神经网络实现代码,来达到进一步的加深理解卷积神经网络的目的. 笔者在github上找 ...

  7. 深入学习卷积神经网络(CNN)的原理知识

    网上关于卷积神经网络的相关知识以及数不胜数,所以本文在学习了前人的博客和知乎,在别人博客的基础上整理的知识点,便于自己理解,以后复习也可以常看看,但是如果侵犯到哪位大神的权利,请联系小编,谢谢.好了下 ...

  8. Deep Learning模型之:CNN卷积神经网络(一)深度解析CNN

    http://m.blog.csdn.net/blog/wu010555688/24487301 本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流. [1]Deep le ...

  9. 卷积神经网络CNN与深度学习常用框架的介绍与使用

    一.神经网络为什么比传统的分类器好 1.传统的分类器有 LR(逻辑斯特回归) 或者 linear SVM ,多用来做线性分割,假如所有的样本可以看做一个个点,如下图,有蓝色的点和绿色的点,传统的分类器 ...

随机推荐

  1. es69

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  2. adb-端口被占用解决办法(win)

    今天在window下使用adb的时候,提示我说5037端口被占用. * daemon not running. starting it now on port * ADB server didn't ...

  3. Domino系统从UNIX平台到windows平台的迁移及备份

    单位机房的一台服务机器到折旧期了,换成了新购IBM机器X3950,而且都预装了windows 2003 server 标准版,所以只有把以前在Unix平台下跑的OA系统迁移到新的windows 200 ...

  4. Vue自定义指令实现下拉加载:v-loadmore

    和methods平级: directives: { loadmore: {//自定义指令: 下拉加载 bind(el, binding) {    var p = 0;    var t = 0;  ...

  5. 【Hello 2018 B】Christmas Spruce

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 写个dfs看看是不是每个节点都有3个叶子节点就可以了. [代码] #include <bits/stdc++.h> us ...

  6. 【hadoop之翊】——CentOS6.5 Linux上面编译Hadoop2.4源代码

    今天来说说编译hadoop源代码的事情吧~ 1.首先下载源代码 地址:http://mirror.bit.edu.cn/apache/hadoop/common/hadoop-2.4.0/ 2.加压t ...

  7. 【LeetCode-面试算法经典-Java实现】【130-Surrounded Regions(围绕区域)】

    [130-Surrounded Regions(围绕区域)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a 2D board containing 'X ...

  8. values-dimen 不同分辨率资源实现引用

    今天遇到了一种情况,就是在不同分辨率下面出现了需要设定不同的距离,当时第一反映就是重新定义一个layout.但是,仅仅为了更改一个数值就复制那么多的代码,明显不合里.后来就想到干脆在不同的分辨率下创建 ...

  9. 最值(min、max)与极值的理解

    max(a,b)=−min(−a,−b) 如果 a≥b ⇒ max(a,b)=a,−a≤−b,⇒ 同理 min(a,b)=−max(−a,−b) 1. 最值 最小:不能更少,如果是整数关系的话,也即从 ...

  10. Java学习笔记七 常用API对象三

    一.泛型:简单说就是对对象类型进行限定的技术 public class GenericDemo { public static void main(String[] args){ /*泛型作为1.5版 ...