卷积神经网络在几个主流的神经网络开源架构上面都有实现,我这里不是想实现一个自己的架构,主要是通过分析一个最简单的卷积神经网络实现代码,来达到进一步的加深理解卷积神经网络的目的.
笔者在github上找到了一个十分简单的卷积神经网络python的代码实现:
https://github.com/ahmedfgad/NumPyCNN
具体的怎么使用这里就不用说了,这里都有介绍,我只是分析一下这个代码的实现过程并解析代码,梳理一下神经网络是怎么使用的和构造原理.
一般的神经网络主要包含几个步骤:
-
准备滤波器。
-
卷积层:使用滤波器对输入图像执行卷积操作。
-
ReLU 层:将 ReLU 激活函数应用于特征图(卷积层的输出)。
-
最大池化层:在 ReLU 层的输出上应用池化操作。
-
堆叠卷积层、ReLU 层和最大池化层。
我也按照这几个步骤去分析代码:
一 准备滤波器:
根据滤波器的数量和每个滤波器的大小创建数组。我们有 2 个大小为 3*3 的滤波器,因此数组大小为 (2=num_filters, 3=num_rows_filter, 3=num_columns_filter)。将滤波器的尺寸选择为没有深度的 2D 数组,因为输入图像是灰度图且深度为 1。如果图像是具有 3 个通道的 RGB,则滤波器大小必须是(3, 3, 3=depth)。
滤波器组的大小由上述 0 数组指定,但不是由滤波器的实际值指定。可以按如下方式覆写这些值,以检测垂直和水平边缘。
二 卷积处理:
在准备好滤波器之后,下一步就是用它们对输入图像执行卷积操作。下面一行使用 conv 函数对图像执行卷积操作:
此类函数只接受两个参数,即输入图像数据和滤波器数组,它的实现如下:
这个函数都做了些什么呢?下面我们逐一进行分析一下:
1 对卷积的过滤器做检查,确保过滤器符合以下约束条件(行列为奇数并且相等),确保过滤器和图像的维度相同.
2 创建空的一个卷积提取特征的数组
3 针对两维的卷积网络做卷积特征提取:conv_
从这里可以总结出,这个函数的作用就是使用过滤器对图像做卷积处理,并提取出特征值以供后面使用.
三 ReLU激活函数层
ReLU层将ReLU激活函数应用于conv层输出的每个特征图上,根据以下代码行调用ReLU激活函数:
ReLU激活函数(ReLU)的具体实现代码如下:
ReLU思想很简单,只是将特征图中的每个元素与0进行比较,若大于0,则保留原始值。否则将其设置为0。
四 最大池化层
ReLU层的输出作为最大池化层的输入,根据下面的代码行调用最大池化操作:
最大池化函数(max pooling)的具体实现代码如下:
该函数接受3个参数,分别为ReLU层的输出,池化掩膜的大小和步幅。首先也是创建一个空数组,用来保存该函数的输出。数组大小根据输入特征图的尺寸、掩膜大小以及步幅来确定.
对每个输入特征图通道都进行最大池化操作,返回该区域中最大的值,这个就是最大池化.这就达到了降采样的目的.
参考文档:
作者:虚生 出处:https://www.cnblogs.com/dylancao/ 以音频和传感器算法为核心的智能可穿戴产品解决方案提供商 ,提供可穿戴智能软硬件解决方案的设计,开发和咨询服务。 勾搭热线:邮箱:1173496664@qq.com weixin:18019245820 市场技术对接群:347609188 |
![]() |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战