关于卷积神经网络的介绍,网上资料很多。不在赘述。
从最主要的地方入手介绍:
打开tiny-dnn的/example/main.cpp文件,可以看到如下代码:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
从这一块代码入手,介绍如下部分内容
- convolutional_layer< tan_h>及其参数,
- average_pooling_layer< tan_h>及其参数
- connection_table及其参数
- fully_connected_layer< tan_h>及其参数
以及tiny-dnn的框架结构。
首先来看网络结构,这个网络结构是经典手写数字识别的Lenet网络。
第一层为卷积层:
- 1
参数说明:输入的是32*32的图片,卷积核尺寸为5*5,输入一张图,有6个卷及模板。意思是经过第一层网络,输入一张图片,输出六张图片到下一层。输出图片的尺寸为32-5+1=28.即输出的是28*28的图片。此部分只看参数,下一部分再提出解释。
第二次为平均池化层:
- 1
参数说明:输入的是28*28的图片,6个下采样操作,用2*2的卷积核。此部分输入六张图片,输出六张图片,尺寸为28/2=14。即输出六张14*14大小的图片。
第三层依然是卷积层
- 1
参数说明:输入的是14*14大小的图片,卷积核大小5*5,输入6张图片,有16个卷积模板。与上一个平均池化层的连接方式为connection_table(connection, 6, 16)),里面的参数是connection,输入的维度(6张图),有16个卷及模板。下面看connection:
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
可以看做是一个6*16的矩阵,但其实是一个数组。看第一行第一列的值为0,意思是第一张图片和第一个卷及模板连接。第二行第三个为X,意思是第二张图和第三个卷积核不连接。为什么有的连接,有的不连接,在下一部分说明。忘了说了,这一层输出的图片大小为:14-5+1=10。
第四层为平均池化层:
- 1
参数说明:意思是输入10*10的图片,有16张,用2*2的方式下采样。所以这一层输出的图片大小为10/2=5。输出也是16张
第五层卷积层:
- 1
参数说明:输入的图片为5*5,用5*5大小的卷积核,输出16张图片,有120个卷积模板。可以输出120张图片。其实这里都不能说输出图片了,输出的是特征图。由于没有定义connection_table,所以默认和上一层采用全连接。
第六层全连接层:
- 1
意思是输入120张图,输出10个类别。手写输入就是0-9嘛一共10个数。