- 文中比较重要的引用了几个篇博客,开篇给与博主感谢
- 记录我从零到实现一个具体CNN网络中最有用的知识干货
- 以细节为切入点,分享我对CNN网络的简洁
- 本文致力于让你一篇文章理解CNN的具体实现与训练方法
- 涉及理论不一一追述背景,主要讲解其如何应用
- 开源的优秀CNN代码很多,我选择的入门可能不是最棒的,但对我是最容易理解的
开始
一、神经网络与卷积
1、如果你不了解神经网络,这篇 CNN笔记:通俗理解卷积神经网络 够了。
2、如果你不了解神经网络,这篇 CNN笔记:通俗理解卷积神经网络 也够了。
3、看黑板标重点,看完文章请确保理解:卷积、池化(采样)、全连接
4、这一条只是单纯地给上文的博主点10个贊。。。。。。。。。
二、一个简单的CNN结构
1、首先我们需要了解一个数据集MINST,刚去搜了一篇介绍比较详细的博客MNIST数据集解析,不过代码是Python如果不懂请选择忽略,看他关于MINST的介绍就好。不过你也可以先跳过这步,这只是输入数据,并不关乎我们的CNN构架。
2、如果上文你了解了卷积,那么现在可以给你介绍一个简单的CNN手写识别网络了。这也有一篇很好的博客编写C语言版本的卷积神经网络CNN之网络的总体结构,篇末有一份博主的C语言代码连接,纯C语言的自己注意修改一下代码中加载的文件路径,运行起来不是很难。不过文章的配图,和公式说明比较复杂,所以就只建议阅读tostq的专栏的篇二(就是上一个连接)。
3、在此送一张我自己画的图,姑且称为图一。
三、根据图一而来的 正向计算
先说明一下本文采用的激活函数Sigmoid(),表达式 S(x)=1/[1+exp(−x)] 。它有一个很好的特性其导函数与其输出有关,即 S~(x)=S(x)∗[1−S(x)]。
在之后的文章里我们用 f(y)=y∗(1−y)=S(x)∗[1−S(x)]=S~(x) 表示激活函数的导函数,文章内引用不再重复说明。
3.1、卷积层C1、C3的计算
以 ym(x,y) 表示第m张输出图位置(x,y)的像素信息, bm 表示偏置, Xp(x,y) 示第p张输入图, Kpm(j,i) 表示当前输入图与输出图之间的卷积核,W、H分别表示卷积核的宽、高。可以得到输出图每个像素值的计算公式,如下: