卷积神经网络原理及其C++/Opencv实现(3)

在前面的两篇文章中,我们分别讲了卷积神经网络的卷积层、池化层、Affine层、Softmax层等基础知识。

卷积神经网络原理及其C++/Opencv实现(1)

卷积神经网络原理及其C++/Opencv实现(2)

我们知道,信号在神经网络中的传播方向分为正向传播反向传播

(1) 正向传播:输入信号按顺序通过神经网络的每一层,一直从输入端达到最后的输出端,然后作为最终输出信息输出。

(2) 反向传播:训练数据时,由于神经网络的参数是根据输出信号与标签的误差信息来调节的,因此需要将其误差信息从神经网络的输出端传递到输入端,也即按反方向传播。

本文我们主要从数学公式的角度来讲解以下5层卷积神经网络的正向传播过程。

1. 卷积层C1

C1作为5层网络的第一层,也是输入层。它的相关信息列出如下:

输入:1张28*28的手写数字图像。

卷积神经元个数:6个卷积神经元。

卷积核尺寸:每个卷积神经元对应1个5*5卷积核。

偏置:每个卷积神经元对应1个偏置值。·

卷积模式:Valid卷积模式。

激活函数:Relu函数。

输出尺寸:每个卷积神经元输出(28-5+1)*(28-5+1)=24*24的卷积结果,总共6个卷积神经元,因为总共输出6张24*24的卷积结果图像。

假设输入图像为I,卷积核为k,偏置为b,激活函数为f(x),那么C1层的每个卷积神经元的输出Y按照下式计算,其中"*"号为图像的卷积操作,且0≤i<6。

这里可能有人会有疑问,既然卷积的结果为一个二维矩阵,它是怎么加上作为一个数的偏置,以及怎么输入激活函数的?其实前面的文章我们就讲过:

(1) 两个卷积结果的相加操作,也即矩阵中对应位置值的相加。

(2) 加上偏置的操作,也即矩阵中每个值都加上相同的偏执值。

(3) 通过激活函数的操作,也即矩阵中每个值都输入激活函数,然后所有的激活函数输出值组成相同维度的矩阵,该矩阵就是卷积神经元的输出。

2. 池化层S2

池化原理我们在上篇文章(文章开头的超链接)已经讲过,在本层我们选择最大值池化的方法对C1层的输出进行池化。本层信息列出如下:

输入:6张24*24的卷积结果图。

池化窗口尺寸:2*2。

池化模式:最大值池化。

输出尺寸:每张卷积结果图经过池化之后,变成(24/2)*(24/2)=12*12的图像,因此该层输入的6张24*24的图像变成6张12*12的图像。

用数学式子表示池化过程如下:

3. 卷积层C3

该层的相关信息列出如下:

输入:6张12*12的池化结果图。

卷积神经元个数:12个卷积神经元,每个卷积神经元都输入6张12*12的池化结果图。

卷积核尺寸:每个卷积神经元对应6个5*5卷积核。

偏置:每个卷积神经元对应一个偏置值。·

卷积模式:Valid卷积模式。

激活函数:Relu函数。

输出尺寸:每个卷积神经元输出(12-5+1)*(12-5+1)=8*8的卷积结果,总共12个卷积神经元,因此总共输出12张8*8的卷积结果图像。

那么C3层的每个卷积神经元的输出Y按照下式计算。·

4. 池化层S4

本层信息列出如下:

输入:12张8*8的卷积结果图。

池化窗口尺寸:2*2。

池化模式:最大值池化。

输出尺寸:每张卷积结果图经过池化之后,变成(8/2)*(8/2)=4*4的图像,因此该层输入的12张8*8的图像变成12张4*4的图像。

用数学式子表示池化过程如下:

5. 输出层O5

本层是全连接层,也是5层网络的最后一层,其信息列出如下:

输入:输入12张4*4的池化结果图,输入之后将12*4*4=192的数据按顺序展开成长度为192的一维向量X:

神经元个数:10个神经元,每个神经元都输入向量X的192个数据。

权重个数:每个神经元对应192个权重,总共10个神经元,因此该层总共有10*192个权重。

偏置:每个卷积神经元对应一个偏置值,因此总共有10个偏置值。·

激活函数:Softmax函数。

输出尺寸:每个神经元输出一个0~1之间的概率值,因此总共输出10个概率值。

本层的输出Y可按下式计算:

好了,本文我们就讲到这里,下篇文章中让我们继续探讨一下反向传播吧,敬请期待!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度学习之卷积神经网络CNN做手写体识别的VS代码。支持linux版本和VS2012版本。 tiny-cnn: A C++11 implementation of convolutional neural networks ======== tiny-cnn is a C++11 implementation of convolutional neural networks. design principle ----- * fast, without GPU 98.8% accuracy on MNIST in 13 minutes training (@Core i7-3520M) * header only, policy-based design supported networks ----- ### layer-types * fully-connected layer * convolutional layer * average pooling layer ### activation functions * tanh * sigmoid * rectified linear * identity ### loss functions * cross-entropy * mean-squared-error ### optimization algorithm * stochastic gradient descent (with/without L2 normalization) * stochastic gradient levenberg marquardt dependencies ----- * boost C++ library * Intel TBB sample code ------ ```cpp #include "tiny_cnn.h" using namespace tiny_cnn; // specify loss-function and optimization-algorithm typedef network CNN; // tanh, 32x32 input, 5x5 window, 1-6 feature-maps convolution convolutional_layer C1(32, 32, 5, 1, 6); // tanh, 28x28 input, 6 feature-maps, 2x2 subsampling average_pooling_layer S2(28, 28, 6, 2); // fully-connected layers fully_connected_layer F3(14*14*6, 120); fully_connected_layer F4(120, 10); // connect all CNN mynet; mynet.add(&C1); mynet.add(&S2); mynet.add(&F3); mynet.add(&F4); assert(mynet.in_dim() == 32*32); assert(mynet.out_dim() == 10); ``` more sample, read main.cpp build sample program ------ ### gcc(4.6~) without tbb ./waf configure --BOOST_ROOT=your-boost-root ./waf build with tbb ./waf configure --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build with tbb and SSE/AVX ./waf configure --AVX --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build ./waf configure --SSE --TBB --TBB_ROOT=your-tbb-root --BOOST_ROOT=your-boost-root ./waf build or edit inlude/config.h to customize default behavior. ### vc(2012~) open vc/tiny_cnn.sln and build in release mode.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值