[OpenCV] Convolutional Neural Network
Ref: 从LeNet-5看卷积神经网络CNNs
关于这篇论文的一些博文的QAC:
1. 基本原理
MLP(Multilayer Perceptron,多层感知器)是一种前向神经网络(如下图所示),相邻两层网络之间全连接。
sigmoid通常使用tanh函数和logistic函数。
1998年Yann LeCun在论文“Gradient-Based Learning Applied to Document Recognition”中提出了LeNet-5,并在字母识别中取得了很好的效果。LeNet-5的结构如下图所示:
- input:输入图片,32*32像素;
- C1:5*5卷积核,生成6个feature maps,共需要(6*5*5 + 6)=156个参数;
- S2:2*2个像素相加,然后乘以一个参数,加上一个偏置,共计2*6=12个参数;
- C3:5*5卷积核,生成16个feature maps,每个feature map由S2中若干个feature maps卷积得到,如图Table1所示;
- S4:和S2相同的操作,共计16*2 = 32个参数;
- C5:与S4全连接,共计(5*5*16*120+120)=48120个参数;
- F6:与C5全连接,共计(120*84+84) = 10164 个参数;
- output: 与F6全连接。
下面开始对各层进行具体分析。
卷积:
C1/C3/C5这三层都用了卷积操作,学过数字图像处理的同学一定对这种图像上的卷积很熟悉,本质上是用一块权重模板在图像上的各个区域做加权求和,如下图所示:
图中黄色的3*3 卷积核从图像的左上角开始向右或向下移动,对移动过程中覆盖的区域求加权和。最后得到(5-3+1)*(5-3+1)大小的卷积结果,称为一个feature map。
C1: LeNet-5的C1层用6个 5*5卷积核对输入的32*32图像进行卷积,每个卷积核对应生成一个(32-5+1)*(32-5+1)的feature map,共计6个feature map。
C3: C3的过程稍为复杂,C3总共生成了16个feature map,每个feature map按照Table1选择输入。例如C3编号为0的feature map是由S2中编号为0、1、2的feature map 生成的。先由3个卷积核分别在S2的0、1、2 feature map上生成3个临时feature map,然后把这三个临时feature map相加得到C3的feature map 0。这样构造C3 有两个好处:一是相比于全连接,可以减少参数的数量;二是每个feature map的输入都不相同,可以达到互补的效果。
C5: C5层用全连接的方式,每个feature map都是由S4中所有的feature map卷积结果求和得到的。由于S4的feature map大小是5*5,卷积核大小也是5*5,所以卷积后得到的是一个1*1的矩阵。
另外,C1/C3/C5每个feature map计算结果都会在计算结尾加上一个偏置。
池化pooling:
池化的作用主要有两个:一是减少参数数量;二是在使模型具有较好的平移不变性。
和卷积很类似,不同之处在于卷积核覆盖的区域是重叠的,而池化的各个区域是没有重叠的。所以当S2/S4用2*2的池化模板后,feature map的宽和高都减小为原来的一半。
再借用一下UFLDL Tutorial关于池化的示意图:
..
输出层:
output层/F6层都是与前一层全连接,C5-F6-output整体结构可以看成一个多层感知器。
所以LeNet-5其实是由三种不同的结构组成的:卷积、池化、多层感知器。而使用这三种结构也就可以构成大部分卷积神经网络了。
卷积:
目前几乎所有公开发表的卷积模型都使用全连接结构,即某一层(第m层)的feature map是由上一层(第m-1层)的所有feature map卷积后求和得到的。但是在实际使用中需要注意模型的参数个数,参数个数的增加对计算量的影响很大。
池化:
目前常用的是平均池化或者最大池化,即把上一层feature map的各个池化区域内的单元值求平均值或最大值。
输出层:
可以把最后一层的结果输出到某个分类器(如Logistic Regression等)进行分类。
参考资料:
[1]Yann LeCun, Gradient-Based Learning Applied to Document Recognition, 1998
[2]Theano Deeplearning Tutorial
[3]Stanford UFLDL Tutorial: http://deeplearning.stanford.edu/wiki/index.php/UFLDL%E6%95%99%E7%A8%8B
2. 边边角角问题
(1) 卷积核是学习得来,还是预定义好的?
整个网络的训练,主要就是为了学那个卷积核啊。
(2) 有哪些参数?
自定义的其实有卷积核的kernel_size,也就是kernel_width和kernel_height,
原理是这样的,通常所说的2D卷积其实是3D的(卷积核的维度应该是kernel_height * kernel_height * input_channel),只不过第三个维度恰好等于输入通道的个数,所以卷了以后在第三个维度上就没了,变成了扁平的二维feature map,所以叫2D卷积。
另一种理解方式是,一个卷积核的形状是 kernel_height * kernel_height,并且有input_channel层,把它和输入图像做卷积的过程是这样的:
卷积层的参数共享
卷积核的参数就是神经网络的输入层。
[OpenCV] Convolutional Neural Network的更多相关文章
- 论文阅读(Weilin Huang——【TIP2016】Text-Attentional Convolutional Neural Network for Scene Text Detection)
Weilin Huang--[TIP2015]Text-Attentional Convolutional Neural Network for Scene Text Detection) 目录 作者 ...
- 卷积神经网络(Convolutional Neural Network,CNN)
全连接神经网络(Fully connected neural network)处理图像最大的问题在于全连接层的参数太多.参数增多除了导致计算速度减慢,还很容易导致过拟合问题.所以需要一个更合理的神经网 ...
- Convolutional Neural Network in TensorFlow
翻译自Build a Convolutional Neural Network using Estimators TensorFlow的layer模块提供了一个轻松构建神经网络的高端API,它提供了创 ...
- 卷积神经网络(Convolutional Neural Network, CNN)简析
目录 1 神经网络 2 卷积神经网络 2.1 局部感知 2.2 参数共享 2.3 多卷积核 2.4 Down-pooling 2.5 多层卷积 3 ImageNet-2010网络结构 4 DeepID ...
- HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK阅读笔记
HYPERSPECTRAL IMAGE CLASSIFICATION USING TWOCHANNEL DEEP CONVOLUTIONAL NEURAL NETWORK 论文地址:https:/ ...
- A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK文章笔记
A NEW HYPERSPECTRAL BAND SELECTION APPROACH BASED ON CONVOLUTIONAL NEURAL NETWORK 文章地址:https://ieeex ...
- 【论文阅读】ShuffleNet: An Extremely Efficient Convolutional Neural Network for Mobile Devices
ShuffleNet: An Extremely Efficient Convolutional Neural Network for MobileDevices
- 《ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs》
代码: keras:https://github.com/phdowling/abcnn-keras tf:https://github.com/galsang/ABCNN 本文是Wenpeng Yi ...
- 《Kalchbrenner N, Grefenstette E, Blunsom P. A convolutional neural network for modelling sentences》
Kalchbrenner’s Paper Kal的这篇文章引用次数较高,他提出了一种名为DCNN(Dynamic Convolutional Neural Network)的网络模型,在上一篇(Kim ...
随机推荐
- Code of Conduct
v
- jasmine入门
本文来自http://blog.fens.me/nodejs-jasmine-bdd 粉丝日志 张丹 前言TDD(Test Driven Development)测试驱动开发,是敏捷开发中提出的最 ...
- Java调用批处理或可执行文件
import java.io.BufferedReader; import java.io.InputStreamReader; public class Test { public static v ...
- Usaco*Brownie Slicing
Description Bessie烘焙了一块巧克力蛋糕.这块蛋糕是由R*C(1 <= R,C <= 500)个小的巧克力蛋糕组成的. 第i行,第j列的蛋糕有N_ij(1 <= N_ ...
- 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目
前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...
- Centos 编写 service 启动
Centos 系统服务脚本目录: [html] view plaincopyprint? /usr/lib/systemd/ 有系统(system)和用户(user)之分, 如需要开机没有登陆情况 ...
- Java实现文件在某个目录的检索
package com.filetest; import java.io.File; import java.util.Date; import java.util.Scanner; public c ...
- c++怎样让函数返回数组
这个问题属于非常初级的问题,但是对于初学不知道的人可能会比较头疼.C++中函数是不能直接返回一个数组的,但是数组其实就是指针,所以可以让函数返回指针来实现.比如一个矩阵相乘的函数,很容易地我们就写成: ...
- Linux中bashshell的一些知识
数据流重导向 重导向redirect:就是将当前的所得数据输出到其他地方: 三种输出输入的状况,分别是: -标准输入stdin:代码为0:使用<或<< -标准输出stdout:代码为 ...
- Mina入门实例(一)
mina现在用的很多了,之前也有用到,但是毕竟不熟悉,于是查了一些资料,做了一些总结.看代码是最直观的,比什么长篇大论都要好.不过其中重要的理论,也要理解下. 首先是环境,程序运行需要几个包,这里用m ...