网站首页 > 技术文章 正文
自动驾驶、医疗和零售是计算机视觉的重要应用,这是曾经被认为是不可能事情的领域。今天,自驾车或自动杂货店的梦想不再那么具有未来感。事实上,我们每天都在使用计算机视觉:当我们用手机解锁手机或者在将照片发布到社交媒体上之前自动修饰照片时。
卷积神经网络可能是这一巨大成功背后最重要的因素。配方将拓宽我们对神经网络如何与CCN背后的思想一起工作的理解。
传统密集神经网络的局限性
我们了解所谓的密集连接的神经网络。这些网络的神经元被分成组,形成连续的层。每个这样的单元连接到来自相邻层的每个单个神经元。这种架构的一个例子如下图所示。
当我们基于一组有限的定义特征解决分类问题时,这种方法很有效 - 例如,我们根据他在比赛期间记录的统计数据预测足球运动员的位置。但是,使用照片时情况会变得更加复杂。
当然,我们可以将每个像素的亮度视为一个单独的特征,并将其作为输入传递给我们的密集网络。不幸的是,为了使其适用于典型的智能手机照片,我们的网络必须包含数十甚至数亿个神经元。另一方面,我们可以缩小照片,但在此过程中我们会丢失有价值的信息。
我们立即看到传统策略对我们没有任何作用,我们需要一种新的聪明方法来尽可能多地使用数据,但同时减少必要的计算和参数的数量,这正是适合CNN闪亮进场的时候。
数码照片数据结构
开始花一点时间来解释数字图像的存储方式。大多数人可能都意识到它们实际上是巨大的数字矩阵。每个这样的数字对应于单个像素的亮度。在RGB模型中,彩色图像实际上由对应于三个颜色通道的三个这样的矩阵组成 - 红色,绿色和蓝色。在黑白图像中,我们只需要一个矩阵。这些矩阵中的每一个都存储从0到255的值。该范围是存储关于图像的信息(256个值完全适合1个字节)的效率与人眼的灵敏度(我们区分有限数量的阴影)之间的折衷。
卷积
Kernel卷积不仅用于CNN,还是许多其他计算机视觉算法的关键要素。这是一个我们采用一个小数字矩阵(卷积核)的过程,我们将它传递给我们的图像并根据过滤器的值对其进行转换。根据以下公式计算后续特征映射值,其中输入图像由f表示,我们的核由h表示。结果矩阵的行和列索引分别用m和n标记。
将滤镜放在选定的像素上后,我们从卷积核中取出每个值,并将它们与图像中的相应值成对相乘。最后,我们总结了所有内容,并将结果放在输出要素图中的正确位置。上面我们可以看到这样的操作在微观尺度上看起来如何,但更有趣的是,我们可以通过在完整图像上执行它来实现。图4显示了使用几个不同滤波器的卷积结果。
有效且相同的卷积
正如我们在图3中看到的,当我们使用3x3内核对6x6图像执行卷积时,我们得到4x4特征映射。这是因为我们只有16个独特的位置可以将滤镜放在这张图片中。由于每次执行卷积时我们的图像都会缩小,因此在我们的图像完全消失之前,我们只能进行有限次数的渲染。更重要的是,如果我们看看我们的滤波器如何在图像中移动,我们会发现位于边缘的像素产生的影响远小于图像中心的像素。这样我们就失去了图片中包含的一些信息。可以在下面看到像素的位置如何改变其对要素图的影响。
为了解决这两个问题,我们可以使用额外的边框填充图像。例如,如果我们使用1像素填充,我们将照片的大小增加到8x8,因此使用3x3滤镜的卷积输出将为6x6。通常在实践中我们用零作为额外的填充。根据我们是否使用填充,我们正在处理两种类型的卷积 - 有效和相同。命名是非常不幸的,所以为了清晰起见:有效 - 意味着我们使用原始图像,相同 - 我们使用它周围的边框,以便输入和输出的图像大小相同。在第二种情况下,填充宽度应满足以下等式,其中p是填充,f是滤波器尺寸(通常是奇数)。
跨步卷积
在前面的例子中,我们总是将内核移动一个像素。但是,步长也可以视为卷积层超参数之一。在图6中,我们可以看到如果我们使用更大的步幅,卷积是如何形成的。在设计我们的CNN架构时,如果我们希望感知字段重叠较少或者我们想要特征贴图的较小空间维度,我们可以决定增加步骤。输出矩阵的尺寸 - 考虑填充和步幅 - 可以使用以下公式计算。
过渡到第三个维度
控制卷积核数量是一个非常重要的概念,这将使我们不仅要与彩色图像的工作,但更重要的是单层中应用多个滤波器。第一个重要规则是滤波器和要应用它的图像必须具有相同数量的通道。基本上,我们非常类似于图3中的示例,但是这次我们将三维空间中的值对相乘。如果我们想在同一个图像上使用多个滤镜,我们分别对每个滤镜执行卷积,将结果叠加在另一个上面并将它们组合成一个整体。接收张量的尺寸(可以称为我们的3D矩阵)满足以下等式,其中:n?- 图像大小,f - 滤波器大小,nc - 图像中的通道数,p-使用的填充,s- 使用的步幅,nf - 滤波器的数量。
卷积层
终于到了使用我们今天所学到的一切,并建立我们的CNN层的时候了。我们的方法几乎与我们用于密集连接的神经网络的方法相同,唯一的区别是不是使用简单的矩阵乘法,而是这次我们将使用卷积。前向传播包括两个步骤。第一个是计算中间值 Z,它是由前一层的输入数据与W张量(包含滤波器)卷积后得到的,然后加上偏差b。第二个是对我们的中间值应用非线性激活函数(我们的激活用g表示)。矩阵方程将在下面找到合适的数学公式。
连接切割和参数共享
在文章的开头我提到由于需要学习大量的参数,密集连接的神经网络在处理图像方面很差。现在我们已经了解了卷积的全部内容,让我们考虑它如何允许我们优化计算。在下图中,2D卷积已经以略微不同的方式可视化 - 用数字1-9标记的神经元形成接收后续像素的亮度的输入层,而单元AD表示计算的特征地图元素。最后但同样重要的是,I-IV是来自内核的后续值 - 必须学习这些值。
现在,让我们关注卷积层的两个非常重要的属性。首先,你可以看到并非两个连续层中的所有神经元都相互连接。例如,单元1仅影响A的值。其次,我们看到一些神经元共享相同的权重。这两个属性都意味着我们学习的参数要少得多。顺便说一下,值得注意的是,滤波器中的单个值会影响要素图的每个元素,在反向传播中它将是至关重要的。
卷积层反向传播
如果你试图从头开始编写自己的神经网络,正向传播是不到一半的成功。当你想回去时,真正的乐趣就开始了。如今,我们不需要为反向传播而烦恼 - 深度学习框架为我们做了,但我觉得值得了解幕后发生的事情。就像在密集连接的神经网络中一样,我们的目标是计算导数,然后在一个称为梯度下降的过程中使用它们,更新我们的参数值。
在我们的计算中,我们将使用链式法则 。我们想要评估参数变化对结果特征图的影响,然后评估最终结果。本文将使用的以下的数学符号。使用这种表示法时,始终意味着成本函数的偏导数。
我们的任务是计算dW [1]和db [l] -它们是与当前层参数相关的导数,以及dA [l -1]的值- 它将被传递给前一层。如图10所示,我们收到dA [l]作为输入。当然,张量dW和W,db和b以及dA和A的尺寸分别相同。第一步是获得中间值dZ [1]通过将激活函数的导数应用于输入张量。根据链规则,此操作的结果将在以后使用。
现在,我们需要处理卷积本身的向后传播,为了实现这个目标,我们将利用一个称为完全卷积的矩阵运算 - 下面将对此进行可视化。请注意,在此过程中我们使用卷积内核,我们之前旋转了180度。该操作可以通过以下公式描述,其中滤波器由W表示,并且dZ [m,n]是属于从前一层获得的偏导数的标量。
池化层
细胞神经网络经常使用池化层。它们主要用于减小张量的大小并加快计算速度。这个层很简单 - 我们需要将图像划分到不同的区域,然后对每个部分执行一些操作。例如,对于Max Pool Layer,我们从每个区域中选择一个最大值,并将其放在输出中的相应位置。与卷积层的情况一样,我们有两个超参数可用:滤波器大小和步幅。最后但并非最不重要的是,如果要为多通道图像执行池化,则应分别完成每个通道进行池化。
池化层反向传播
接下来,我们将仅讨论最大池反向传播,但我们将学习的规则稍作调整,适用于所有类型的池层。由于在这种类型的层中,我们没有任何我们必须更新的参数,我们的任务只是适当地分配梯度。我们记得,在最大池的前向传播中,我们从每个区域中选择最大值并将它们传输到下一层。因此很明显,在反向传播期间,梯度不应影响未包括在前向通道中的矩阵元素。在实践中,这是通过创建一个掩码来实现的,该掩码记住第一阶段中使用的值的位置,然后可以使用该掩码来传递梯度。
猜你喜欢
- 2024-09-27 后端思维篇:如何抽一个观察者模板
- 2024-09-27 使用Hourglass网络来理解人体姿态
- 2024-09-27 SM框架整合篇 ssm框架crud
- 2024-09-27 动物分类器 动物分类网
- 2024-09-27 图表显示日志离线信息 离线日志正在运行
- 2024-09-27 比用Pytorch框架快200倍!0.76秒后,笔记本上的CNN就搞定了MNIST
- 2024-09-27 多层级遇到多兴趣:快手、武汉大学用于序列推荐的多粒度神经模型
- 2024-09-27 使用分割来寻找疑似结节(13) 分割检测
- 2024-09-27 买药秒送 JADE动态线程池实践及原理浅析
- 2024-09-27 可逆神经网络详细解析:让神经网络更加轻量化
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)