你好,游客 登录
背景:
阅读新闻

使用Python科学计算包搭建CNN算法实践(1)

[日期:2018-05-11] 来源:肖永威的专栏  作者: [字体: ]

深度学习的概念源于人工神经网络的研究。含多隐层的多层感知器就是一种深度学习结构。深度学习通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

CNN(Convolutional Neural Network)——卷积神经网络,人工神经网络(Neural Network,NN)的一种,其它还有RNN、DNN等类型,而CNN就是利用卷积进行滤波的神经网络。换句话说,CNN就是卷积加神经网络。

卷积

我们在 2 维上说话。有两个 R 2 → R R2→RR2→R

R2→RR2→R的函数 f(x, y) 和 g(x, y) 。所谓 f 和 g 的卷积就是一个新的 R 2 → RR2→RR2→RR2→RR2→R的函数 c(x, y) 。通过下式得到 

c ( x , ) = ∞ − ∞ ∞ − ∞ ( s , t ) × ( x − s , − t ) s tc(x,y)=∫∞−∞∫∞−∞f(s,t)×g(x−s,y−t)dsdtc(x,y)=∫−∞∞∫−∞∞f(s,t)×g(x−s,y−t) ds dt

c(x,y)=∫∞−∞∫∞−∞f(s,t)×g(x−s,y−t)dsdtc(x,y)=∫−∞∞∫−∞∞f(s,t)×g(x−s,y−t) ds dt

这式子的含义是:遍览从负无穷到正无穷的全部 s 和 t 值,把 g 在 (x-s, y-t) 上的值乘以 f 在 (s, t) 上的值之后再“加和”到一起(积分意义上),得到 c 在 (x, y) 上的值。说白了卷积就是一种“加权求和”:以 f 为权,以 (x, y) 为中心,把 g 距离中心 (-s, -t) 位置上的值乘上 f 在 (s, t) 的值,最后加到一起。把卷积公式写成离散形式就更清楚了:

( x , ) = ∑ ∞ t = − ∞ ∑ ∞ s = − ∞ ( s , t ) × G ( x − s , − t ) Δ s Δ t = ∑ ∞ t = − ∞ ∑ ∞ s = − ∞ ( s , t ) × G ( x − s , − t )C(x,y)=∑∞t=−∞∑∞s=−∞F(s,t)×G(x−s,y−t)ΔsΔt=∑∞t=−∞∑∞s=−∞F(s,t)×G(x−s,y−t)C(x,y)=∑t=−∞∞∑s=−∞∞F(s,t)×G(x−s,y−t) Δs Δt=∑t=−∞∞∑s=−∞∞F(s,t)×G(x−s,y−t)

C(x,y)=∑∞t=−∞∑∞s=−∞F(s,t)×G(x−s,y−t)ΔsΔt=∑∞t=−∞∑∞s=−∞F(s,t)×G(x−s,y−t)C(x,y)=∑t=−∞∞∑s=−∞∞F(s,t)×G(x−s,y−t) Δs Δt=∑t=−∞∞∑s=−∞∞F(s,t)×G(x−s,y−t)

卷积代码实现如下:

 

什么是人工神经网络(NN,Neural Network)?人工神经网络是一种计算模型,是由多层、每层多个人工神经元组成的复杂网络。单个人工神经元的结构见下图:

p 1 , p 2 , . . . , p n p1,p2,...,pnp1,p2, ... ,pn

p1,p2,...,pnp1,p2, ... ,pn是神经元的输入。a 是神经元的输出。神经元将输入 p 1 , p 2 , . . . , p np1,p2,...,pnp1,p2, ... ,pnp1,p2,...,pnp1,p2, ... ,pn加权求和后再加上偏置值 b ,最后再施加一个函数 f ,即: 

a = ( n ) = ( ∑ n i = 1 p i w i + b ) = ( w 1 , w 2 ⋯ w n ) p 1 p 2 ⋮ p n + b = ( + b )a=f(n)=f(∑ni=1piwi+b)=f⎛⎜ ⎜ ⎜ ⎜⎝(w1,w2⋯wn)⎛⎜ ⎜ ⎜ ⎜⎝p1p2⋮pn⎞⎟ ⎟ ⎟ ⎟⎠+b⎞⎟ ⎟ ⎟ ⎟⎠=f(WTP+b)a=f(n)=f(∑i=1npiwi+b)=f((w1,w2⋯wn)(p1p2⋮pn)+b)=f(WTP+b)

a=f(n)=f(∑ni=1piwi+b)=f⎛⎜ ⎜ ⎜ ⎜⎝(w1,w2⋯wn)⎛⎜ ⎜ ⎜ ⎜⎝p1p2⋮pn⎞⎟ ⎟ ⎟ ⎟⎠+b⎞⎟ ⎟ ⎟ ⎟⎠=f(WTP+b)a=f(n)=f(∑i=1npiwi+b)=f((w1,w2⋯wn)(p1p2⋮pn)+b)=f(WTP+b)

上式最后是这个式子的向量形式。P 是输入向量,W 是权值向量,b 是偏置值标量 。f 称为激活函数( Activation Function )。

ReLU激活函数层

在深度神经网络中,通常使用一种叫修正线性单元(Rectified linear unit,ReLU)作为神经元的激活函数。ReLU起源于神经科学的研究:2001年,Dayan、Abott从生物学角度模拟出了脑神经元接受信号更精确的激活模型,如下图:

首先,我们来看一下ReLU激活函数的形式,如下图:

从上图不难看出,ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为单侧抑制。可别小看这个简单的操作,正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍。

比如,生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个。

ReLU函数代码实现如下:

 

经典的CNN网络,LeNet5

Max pooling

max pooling 的操作如下图所示:整个图片被不重叠的分割成若干个同样大小的小块(pooling size)。每个小块内只取最大的数字,再舍弃其他节点后,保持原有的平面结构得出 output。

pooling代码实现如下:

 
 

本文将仅使用NumPy实现CNN网络,创建三个层模块,分别为卷积层(Conv)、ReLu激活函数和最大池化(max pooling)。

(1). 读取输入图像:

 

(2). 准备滤波器

 
 

上述代码创建了2个3x3大小的滤波器,(2,3,3)中的元素数字分别表示2:滤波器的数目(num_filters)、3:表示滤波器的列数、3:表示滤波器的行数。

(3). 卷积层(Conv Layer)

构建好滤波器后,接下来就是与输入图像进行卷积操作。下面代码使用conv函数将输入图像与滤波器组进行卷积:

 

图形效果见“L1-Map1”。

(4).ReLU激活函数层

ReLU层将ReLU激活函数应用于conv层输出的每个特征图上,根据以下代码行调用ReLU激活函数:

 

图形效果见“L1-Map1ReLU”。

(5). 最大池化层

ReLU层的输出作为最大池化层的输入,根据下面的代码行调用最大池化操作:

 

图形效果见“L1-Map1ReLUPool”。

以上内容已经实现CNN结构的基本层——conv、ReLU以及max pooling,现在将其进行堆叠使用,代码如下:

 

l2表示第二个卷积层,该卷积层使用的卷积核为(3,5,5),即3个5x5大小的卷积核(滤波器)与第一层的输出进行卷积操作,得到3个特征图。l3表示第三个卷积层,该卷积层使用的卷积核为(1,7,7),即1个7x7大小的卷积核(滤波器)与第二层的输出进行卷积操作,得到1个特征图。

神经网络的基本结构是前一层的输出作为下一层的输入,比如l2层接收l1层的输出,l3层接收来l2层的输出。

图形展示代码如下:

 

资源地址: scikit_image‑0.13.1‑cp36‑cp36m‑win_amd64.whl

参考:

1. 《仅使用NumPy完成卷积神经网络CNN的搭建(附Python代码)》阿里云 云栖社区 译者:海棠,文章原标题《Building Convolutional Neural Network using NumPy from Scratch》,作者:Ahmed Gad,研究兴趣是深度学习、人工智能和计算机视觉
个人主页: https://www.linkedin.com/in/ahmedfgad/
2. 《skimage库需要依赖 numpy+mkl 和scipy》博客园 小呆君 2017年11月
3. 《CNN中的maxpool到底是什么原理?》雷锋网 AI研习社,贾智龙 2017年7月
4. 《卷积神经网络CNN理论到实践(5)》CSDN博客 相国大人 2017年6月
5. 《人脸检测及识别python实现系列(4)——卷积神经网络(CNN)入门》博客园 Neo-T 2017年2月
《Python科学计算初探——余弦相似度》CSDN博客 肖永威 2018年4月
6. 《ReLU激活函数:简单之美》CSDN博客 对半独白 2016年11月

收藏 推荐 打印 | 录入:Cstor | 阅读:
相关新闻      
本文评论   查看全部评论 (0)
表情: 表情 姓名: 字数
点评:
       
评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而直接或间接导致的民事或刑事法律责任
  • 本站管理人员有权保留或删除其管辖留言中的任意内容
  • 本站有权在网站内转载或引用您的评论
  • 参与本评论即表明您已经阅读并接受上述条款