仅使用NumPy完成卷积神经网络CNN的搭建(附Python代码)

2018 年 4 月 29 日 全球人工智能 Ahmed Gad

高薪招聘兼职AI讲师和AI助教!


现有的Caffe、TensorFlow等工具箱已经很好地实现CNN模型,但这些工具箱需要的硬件资源比较多,不利于初学者实践和理解。因此,本文教大家如何仅使用NumPy来构建卷积神经网络(Convolutional Neural Network , CNN)模型,具体实现了卷积层、ReLU激活函数层以及最大池化层(max pooling),代码简单,讲解详细。


目前网络上存在很多编译好的机器学习、深度学习工具箱,在某些情况下,直接调用已经搭好的模型可能是非常方便且有效的,比如Caffe、TensorFlow工具箱,但这些工具箱需要的硬件资源比较多,不利于初学者实践和理解。因此,为了更好的理解并掌握相关知识,最好是能够自己编程实践下。本文将展示如何使用NumPy来构建卷积神经网络(Convolutional Neural Network , CNN)。


CNN是较早提出的一种神经网络,直到近年来才变得火热,可以说是计算机视觉领域中应用最多的网络。一些工具箱中已经很好地实现CNN模型,相关的库函数已经完全编译好,开发人员只需调用现有的模块即可完成模型的搭建,避免了实现的复杂性。但实际上,这样会使得开发人员不知道其中具体的实现细节。有些时候,数据科学家必须通过一些细节来提升模型的性能,但这些细节是工具箱不具备的。在这种情况下,唯一的解决方案就是自己编程实现一个类似的模型,这样你对实现的模型会有最高级别的控制权,同时也能更好地理解模型每步的处理过程。


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


一、读取输入图像


以下代码将从skimage Python库中读取已经存在的图像,并将其转换为灰度图:



  读取图像是第一步,下一步的操作取决于输入图像的大小。将图像转换为灰度图如下所示:



二、准备滤波器


以下代码为第一个卷积层Conv准备滤波器组(Layer 1,缩写为l1,下同):

根据滤波器的数目和每个滤波器的大小来创建零数组。上述代码创建了2个3x3大小的滤波器,(2,3,3)中的元素数字分别表示2:滤波器的数目(num_filters)、3:表示滤波器的列数、3:表示滤波器的行数。由于输入图像是灰度图,读取后变成2维图像矩阵,因此滤波器的尺寸选择为2维阵列,舍去了深度。如果图像是彩色图(具有3个通道,分别为RGB),则滤波器的大小必须为(3,3,3),最后一个3表示深度,上述代码也要更改,变成(2,3,3,3)。


滤波器组的大小由自己指定,但没有给定滤波器中具体的数值,一般采用随机初始化。下列一组值可以用来检查垂直和水平边缘:


三、卷积层(Conv Layer)


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

conv函数只接受两个参数,分别为输入图像、滤波器组:

该函数首先确保每个滤波器的深度等于图像通道的数目,代码如下。if语句首先检查图像与滤波器是否有一个深度通道,若存在,则检查其通道数是否相等,如果匹配不成功,则报错。

此外,滤波器的大小应该是奇数,且每个滤波器的大小是相等的。这是根据下面两个if条件语块来检查的。如果条件不满足,则程序报错并退出。

上述条件都满足后,通过初始化一个数组来作为滤波器的值,通过下面代码来指定滤波器的值:

由于没有设置步幅(stride)或填充(padding),默认为步幅设置为1,无填充。那么卷积操作后得到的特征图大小为(img_rows-filter_rows+1, image_columns-filter_columns+1, num_filters),即输入图像的尺寸减去滤波器的尺寸后再加1。注意到,每个滤波器都会输出一个特征图。

循环遍历滤波器组中的每个滤波器后,通过下面代码更新滤波器的状态:

如果输入图像不止一个通道,则滤波器必须具有同样的通道数目。只有这样,卷积过程才能正常进行。最后将每个滤波器的输出求和作为输出特征图。下面的代码检测输入图像的通道数,如果图像只有一个通道,那么一次卷积即可完成整个过程:

上述代码中conv_函数与之前的conv函数不同,函数conv只接受输入图像和滤波器组这两个参数,本身并不进行卷积操作,它只是设置用于conv_函数执行卷积操作的每一组输入滤波器。下面是conv_函数的实现代码:

每个滤波器在图像上迭代卷积的尺寸相同,通过以下代码实现:

之后,在图像区域矩阵和滤波器之间对位相乘,并将结果求和以得到单值输出:

输入图像与每个滤波器卷积后,通过conv函数返回特征图。下图显示conv层返回的特征图(由于l1卷积层的滤波器参数为(2,3,3),即2个3x3大小的卷积核,最终输出2个特征图):

卷积后图像


卷积层的后面一般跟着激活函数层,本文采用ReLU激活函数。


四、ReLU激活函数层


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

ReLU激活函数(ReLU)的具体实现代码如下:

ReLU思想很简单,只是将特征图中的每个元素与0进行比较,若大于0,则保留原始值。否则将其设置为0。ReLU层的输出如下图所示:

ReLU层输出图像


激活函数层后面一般紧跟池化层,本文采用最大池化(max pooling)。


五 、最大池化层


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

最大池化函数(max pooling)的具体实现代码如下:

该函数接受3个参数,分别为ReLU层的输出,池化掩膜的大小和步幅。首先也是创建一个空数组,用来保存该函数的输出。数组大小根据输入特征图的尺寸、掩膜大小以及步幅来确定。

对每个输入特征图通道都进行最大池化操作,返回该区域中最大的值,代码如下:

池化层的输出如下图所示,这里为了显示让其图像大小看起来一样,其实池化操作后图像尺寸远远小于其输入图像。

池化层输出图像


六、层堆叠


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

从代码中可以看到,l2表示第二个卷积层,该卷积层使用的卷积核为(3,5,5),即3个5x5大小的卷积核(滤波器)与第一层的输出进行卷积操作,得到3个特征图。后续接着进行ReLU激活函数以及最大池化操作。将每个操作的结果可视化,如下图所示:


l2层处理过程可视化图像


从代码中可以看到,l3表示第三个卷积层,该卷积层使用的卷积核为(1,7,7),即1个7x7大小的卷积核(滤波器)与第二层的输出进行卷积操作,得到1个特征图。后续接着进行ReLU激活函数以及最大池化操作。将每个操作的结果可视化,如下图所示:


l3层处理过程可视化图像


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


七、完整代码


全部代码已经上传至Github上,每层的可视化是使用Matplotlib库实现。

地址:https://github.com/ahmedfgad/NumPyCNN?spm=a2c4e.11153940.blogcont585741.15.3c951357xsKixt


译者:海棠,审校:Uncle_LLD。

- 加入人工智能学院系统学习 -

点击“ 阅读原文 ”进入学习

登录查看更多
0

相关内容

在深度学习中,卷积神经网络(CNN或ConvNet)是一类深度神经网络,最常用于分析视觉图像。基于它们的共享权重架构和平移不变性特征,它们也被称为位移不变或空间不变的人工神经网络(SIANN)。它们在图像和视频识别,推荐系统,图像分类,医学图像分析,自然语言处理,和财务时间序列中都有应用。

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
还在修改博士论文?这份《博士论文写作技巧》为你指南
【书籍】深度学习框架:PyTorch入门与实践(附代码)
专知会员服务
160+阅读 · 2019年10月28日
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
赛尔笔记 | CNN介绍及代码实现
哈工大SCIR
7+阅读 · 2019年1月23日
卷积神经网络概述及Python实现
云栖社区
4+阅读 · 2018年9月1日
【干货】使用Pytorch实现卷积神经网络
专知
13+阅读 · 2018年5月12日
卷积神经网络的最佳解释!
专知
12+阅读 · 2018年5月1日
【CNN】一文读懂卷积神经网络CNN
产业智能官
18+阅读 · 2018年1月2日
卷积神经网络(CNN)学习笔记1:基础入门
黑龙江大学自然语言处理实验室
14+阅读 · 2016年6月16日
Arxiv
21+阅读 · 2019年3月25日
Adaptive Neural Trees
Arxiv
4+阅读 · 2018年12月10日
Arxiv
7+阅读 · 2018年6月1日
Arxiv
8+阅读 · 2018年1月25日
VIP会员
相关资讯
初学者的 Keras:实现卷积神经网络
Python程序员
24+阅读 · 2019年9月8日
赛尔笔记 | CNN介绍及代码实现
哈工大SCIR
7+阅读 · 2019年1月23日
卷积神经网络概述及Python实现
云栖社区
4+阅读 · 2018年9月1日
【干货】使用Pytorch实现卷积神经网络
专知
13+阅读 · 2018年5月12日
卷积神经网络的最佳解释!
专知
12+阅读 · 2018年5月1日
【CNN】一文读懂卷积神经网络CNN
产业智能官
18+阅读 · 2018年1月2日
卷积神经网络(CNN)学习笔记1:基础入门
黑龙江大学自然语言处理实验室
14+阅读 · 2016年6月16日
Top
微信扫码咨询专知VIP会员