本文参考黄海广主编针对吴恩达深度学习课程DeepLearning.ai 《深度学习课程 笔记 (V5.1 )》

第一周 卷积神经网络( Foundations of Convolutional Neural Networks )

1.1 计算机视觉

卷积原因:

在应用计算机视觉时要面临一个挑战,就是数据的输入可能会非常大。在参数大量的情况下,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,要处理包含 30 亿参数的神经网络,巨大的内存需求让人不太能接受。

但对于计算机视觉应用来说,你肯定不想它只处理小图片,你希望它同时也要能处理大图。为此,你需要进行卷积计算,它是卷积神经网络中非常重要的一块。

1.2 边缘检测示例(Edge detection example ) 

用边缘检测的例子来说明卷积的含义

卷积运算是卷积神经网络最基本的组成部分,使用边缘检测作为入门样例。

给了这样一张图片,让电脑去搞清楚这张照片里有什么物体,你可能做的第一件事是检测图片中的垂直边缘。比如说,在这张图片中的栏杆就对应垂直线,与此同时,这些行人的轮廓线某种程度上也是垂线,这些线是垂直边缘检测器的输出。同样,你可能也想检测水平边缘,比如说这些栏杆就是很明显的水平线,它们也能被检测到。

如何在图像中检测这些边缘?

这是一个 6×6 的灰度图像。因为是灰度图像,所以它是 6×6×1 的矩阵,而不是 6×6×3 的,因为没有 RGB 三通道。为了检测图像中的垂直边缘,你可以构造一个 3×3矩阵。在共用习惯中,在卷积神经网络的术语中,它被称为过滤器。我要构造一个 3×3 的过滤器,像这样。在论文它有时候会被称为,而不是过滤器,但在这个视频中,我将使用过滤器这个术语。关于符号表示,在数学中“就是卷积的标准标志,但是在 Python 中,这个标识常常被用来表示乘法或者元素乘法

6×6 矩阵和 3×3 矩阵进行卷积运算得到 4×4 矩阵。这些图片和过滤器是不同维度的矩阵,但左边矩阵容易被理解为一张图片,中间的这个被理解为过滤器,右边的图片我们可以理解为另一张图片。这个就是垂直边缘检测器

如果你要使用编程语言实现这个运算,不同的编程语言有不同的函数,而不是用“∗”来表示卷积。所以在编程练习中,你会使用一个叫 conv_forward 的函数。如果在 tensorflow 下,这个函数叫 tf.conv2d。在其他深度学习框架中,在后面的课程中,你将会看到 Keras 这个框架,在这个框架下用 Conv2D 实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。

为什么这个可以做垂直边缘检测呢?

让我们来看另外一个例子。为了讲清楚,我会用一个简单的例子。这是一个简单的 6×6 图像,左边的一半是 10,右边一般是 0。如果你把它当成一个图片,左边那部分看起来是白色的,像素值 10 是比较亮的像素值,右边像素值比较暗,我使用灰色来表示 0,尽管它也可以被画成黑的。图片里,有一个特别明显的垂直边缘在图像中间,这条垂直线是从黑到白的过渡线,或者从白色到深色。

所以,当你用一个 3×3 过滤器进行卷积运算的时候,这个 3×3 的过滤器可视化为下面这个样子,在左边有明亮的像素,然后有一个过渡,0 在中间,然后右边是深色的。卷积运算后,你得到的是右边的矩阵。

如果把最右边的矩阵当成图像,它是这个样子。在中间有段亮一点的区域,对应检查到这个 6×6 图像中间的垂直边缘。这里的维数似乎有点不正确,检测到的边缘太粗了。因为在这个例子中,图片太小了。如果你用一个 1000×1000 的图像,而不是 6×6 的图片,你会发现其会很好地检测出图像中的垂直边缘。在这个例子中,在输出图像中间的亮处,表示在图像中间有一个特别明显的垂直边缘。从垂直边缘检测中可以得到的启发是,因为我们使用 3×3的矩阵(过滤器),所以垂直边缘是一个 3×3 的区域,左边是明亮的像素,中间的并不需要考虑,右边是深色像素。在这个 6×6 图像的中间部分,明亮的像素在左边,深色的像素在右边,就被视为一个垂直边缘,卷积运算提供了一个方便的方法来发现图像中的垂直边缘

1.3 更多边缘检测内容(More edge detection)

如何区分正边和负边,这实际就是由亮到暗与由暗到亮的区别,也就是边缘的过渡。你还能了解到其他类型的边缘检测以及如何去实现这些算法

把这矩阵中的 9 个数字当成 9 个参数,并且在之后你可以学习使用反向传播算法,其目标就是去理解这9 个参数。

将矩阵的所有数字都设置为参数,通过数据反馈,让神经网络自动去学习它们,我们会发现神经网络可以学习一些低级的特征,例如这些边缘的特征。尽管比起那些研究者们,我们要更费劲一些,但确实可以动手写出这些东西。不过构成这些计算的基础依然是卷积运算,使得反向传播算法能够让神经网络学习任何它所需要的 3×3 的过滤器,并在整幅图片上去应用它。

这种将这 9 个数字当成参数的思想,已经成为计算机视觉中最为有效的思想之一。

之后会详细去探讨如何使用反向传播去让神经网络学习这 9 个数字。

我们需要先讨论一些其它细节,比如一些基础的卷积运算的变量。

如何去使用 padding,以及卷积各种不同的发展,这两节内容将会是卷积神经网络中卷积模块的重要组成部分

1.4 Padding(基础的卷积运算的变量)

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是 padding,让我们来看看它是如何工作的

输出的维度的计算

如果你用一个 3×3 的过滤器卷积一个 6×6 的图像,你最后会得到一个 4×4 的输出,也就是一个 4×4 矩阵。那是因为你的 3×3 过滤器在 6×6 矩阵中,只可能有 4×4 种可能的位置。这背后的数学解释是,如果我们有一个n × n的图像,用f × f的过滤器做卷积,那么输出的维度就是(n − f + 1) × (n − f + 1)。在这个例子里是6 − 3 + 1 = 4,因此得到了一个 4×4 的输出。

缺点(两个缺点)

第一个缺点是每次做卷积操作,你的图像就会缩小,从 6×6 缩小到 4×4,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有 1×1 的大小。你可不想让你的图像在每次识别边缘或其他特征时都缩小,这就是第一个缺点。

第二个缺点时,如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个 3×3 的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多 3×3 的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息(图像边缘的大部分信息都丢失)。

解决这两个问题

为了解决这些问题,你可以在卷积操作之前填充这幅图像

在这个案例中,你可以沿着图像边缘再填充一层像素。

如果你这样操作了,那么 6×6 的图像就被你填充成了一个 8×8 的图像。如果你用 3×3 的图像对这个 8×8 的图像卷积,你得到的输出就不是 4×4 的,而是 6×6的图像,你就得到了一个尺寸和原始图像 6×6 的图像。习惯上,你可以用 0 去填充,如果𝑞是填充的数量,在这个案例中,𝑞 = 1,因为我们在周围都填充了一个像素点,输出也就变成了(n + 2𝑞 − f + 1) × (n + 2𝑞 − f + 1),所以就变成了(6 + 2 × 1 − 3 + 1) × (6 + 2 × 1 −3 + 1) = 6 × 6,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。

也可以填充两个像素点,也就是说在这里填充一层。实际上你还可以填充更多像素。我这里画的这种情况,填充后𝑞 =2.

至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。(使用Keras 函数的时候有这个参数)

一、Valid 卷积意味着不填充,这样的话,如果你有一个n × n的图像,用一个f × f的过滤器卷积,它将会给你一个(n − f + 1) × (n − f + 1)维的输出。这类似于我们在前面的视频中展示的例子,有一个 6×6 的图像,通过一个 3×3 的过滤器,得到一个 4×4 的输出。

二、另一个经常被用到的填充方法叫做 Same 卷积,那意味你填充后,你的输出大小和输入大小是一样的。根据这个公式n − f + 1,当你填充𝑞个像素点,n就变成了n + 2𝑞,最后公式变为n + 2𝑞 − f + 1。因此如果你有一个n × n的图像,用𝑞个像素填充边缘,输出的大小就是这样的(n + 2𝑞 − f + 1) × (n + 2𝑞 − f + 1)。如果你想让n + 2𝑞 − f + 1 = n的话,使得输出和输入大小相等,如果你用这个等式求解𝑞,那么𝑞 = (f  1)/2    

所以当𝑔是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。

习惯上,计算机视觉中,f通常是奇数,甚至可能都是这样。你很少看到一个偶数的过滤器在计算机视觉里使用。

使用奇数两个原因

1. 其中一个可能是,如果f是一个偶数,那么你只能使用一些不对称填充。只有𝑔是奇数的情况下,Same 卷积才会有自然的填充,我们可以以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。

2. 第二个原因是当你有一个奇数维过滤器,比如 3×3 或者 5×5 的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。也许这些都不是为什么𝑔通常是奇数的充分原因,但如果你看了卷积的文献,你经常会看到 3×3 的过滤器,你也可能会看到一些 5×5,7×7 的过滤器。后面我们也会谈到 1×1 的过滤器,以及什么时候它是有意义的。但是习惯上,我推荐你只使用奇数的过滤器。我想如果你使用偶数 f 也可能会得到不错的表现,如果遵循计算机视觉的惯例,我通常使用奇数值的𝑔。

你已经看到如何使用 padding 卷积,为了指定卷积操作中的 padding,你可以指定𝑞的值。也可以使用 Valid 卷积,也就是𝑞 = 0。也可使用 Same 卷积填充像素,使你的输出和输入大小相同。以上就是 padding。

1.5 卷积步长(Strided convolutions

卷积中的步幅是另一个构建卷积神经网络的基本操作,用 3×3 的过滤器卷积这个 7×7 的图像,和之前不同的是,我们把步幅设置成了2。你还和之前一样取左上方的 3×3 区域的元素的乘积,再加起来,最后结果为 91。

输入和输出的维度是由下面的公式决定的。如果你用一个f × f的过滤器卷积一个n × n的图像,你的 padding 为p,步幅为s,在这个例子中s = 2,你会得到一个输出,因为现在你不是一次移动一个步子,而是一次移动s个步子,输出于是变为

如果商不是一个整数怎么办?

在这种情况下,我们向下取整。⌊ ⌋这是向下取整的符号,这也叫做对𝑨进行地板除(floor),这意味着𝑨向下取整到最近的整数。这个原则实现的方式是,你只在蓝框完全包括在图像或填充完的图像内部时,才对它进行运算。如果有任意一个蓝框移动到了外面,那你就不要进行相乘操作,这是一个惯例。你的 3×3 的过滤器必须完全处于图像中或者填充之后的图像区域内才输出相应结果,这就是惯例。因此正确计算输出维度的方法是向下取整,以免不是整数。

关于互相关和卷积:

总结来说,按照机器学习的惯例,我们通常不进行翻转操作。从技术上说,这个操作可能叫做互相关更好。但在大部分的深度学习文献中都把它叫做卷积运算,因此我们将在这些视频中使用这个约定。如果你读了很多机器学习文献的话,你会发现许多人都把它叫做卷积运算,不需要用到这些翻转。

事实证明在信号处理中或某些数学分支中,在卷积的定义包含翻转,使得卷积运算符拥有这个性质,即(𝐵 ∗ 𝐶) ∗ 𝐷 = 𝐵 ∗ (𝐶 ∗ 𝐷),这在数学中被称为结合律。这对于一些信号处理应用来说很好,但对于深度神经网络来说它真的不重要,因此省略了这个双重镜像操作,就简化了代码,并使神经网络也能正常工作

根据惯例,我们大多数人都叫它卷积,尽管数学家们更喜欢称之为互相关,但这不会影响到你在编程练习中要实现的任何东西,也不会影响你阅读和理解深度学习文献。

现在你已经看到了如何进行卷积,以及如何使用填充,如何在卷积中选择步幅。但到目前为止,我们所使用的是关于矩阵的卷积,例如 6×6 的矩阵。

1.6 三维卷积(Convolutions over volumes)

你已经知道如何对二维图像做卷积了,现在看看如何执行卷积不仅仅在二维图像上,而是三维立体上。

我们从一个例子开始,假如说你不仅想检测灰度图像的特征,也想检测 RGB 彩色图像的特征。彩色图像如果是 6×6×3,这里的 3 指的是三个颜色通道,你可以把它想象成三个 6×6图像的堆叠。为了检测图像的边缘或者其他的特征,不是把它跟原来的 3×3 的过滤器做卷积,而是跟一个三维的过滤器,它的维度是 3×3×3,这样这个过滤器也有三层,对应红、绿、蓝三个通道。

3×3×3 的过滤器,最后一个数字通道数必须和过滤器中的通道数相匹配。为了简化这个 3×3×3过滤器的图像,我们不把它画成 3 个矩阵的堆叠,而画成这样,一个三维的立方体。

为了计算这个卷积操作的输出,你要做的就是把这个 3×3×3 的过滤器先放到最左上角的位置,这个 3×3×3 的过滤器有 27 个数,27 个参数就是 3 的立方。依次取这 27 个数,然后乘以相应的红绿蓝通道中的数字。先取红色通道的前 9 个数字,然后是绿色通道,然后再是蓝色通道,乘以左边黄色立方体覆盖的对应的 27 个数,然后把这些数都加起来,就得到了输出的第一个数字。如果要计算下一个输出,你把这个立方体滑动一个单位,再与这 27 个数相乘,把它们都加起来,就得到了下一个输出,以此类推。

所有三个通道都是这样。所以通过设置第二个过滤器参数,你就有了一个边界检测器,3×3×3 的边界检测器,用来检测任意颜色通道里的边界。参数的选择不同,你就可以得到不同的特征检测器,所有的都是 3×3×3 的过滤器。按照计算机视觉的惯例,当你的输入有特定的高宽和通道数时,你的过滤器可以有不同的高,不同的宽,但是必须一样的通道数。理论上,我们的过滤器只关注红色通道,或者只关注绿色或者蓝色通道也是可行的。

如果我们不仅仅想要检测垂直边缘怎么办?如果我们同时检测垂直边缘和水平边缘,还有 45°倾斜的边缘,还有 70°倾斜的边缘怎么做?换句话说,如果你想同时用多个过滤器怎么办?

这是我们上一张幻灯片的图片,我们让这个 6×6×3 的图像和这个 3×3×3 的过滤器卷积,得到 4×4 的输出。(第一个)这可能是一个垂直边界检测器或者是学习检测其他的特征。第二个过滤器可以用橘色来表示,它可以是一个水平边缘检测器。

1.7 单层卷积网络

如何构建卷积神经网络的卷积层

假设使用第一个过滤器进行卷积,得到第一个 4×4 矩阵。使用第二个过滤器进行卷积得到另外一个 4×4 矩阵。(4x4x2)

最终各自形成一个卷积神经网络层,然后增加偏差,它是一个实数,通过 Python 的广播机制给这 16 个元素都加上同一偏差。

对于第二个 4×4 矩阵,我们加上不同的偏差,它也是一个实数,16 个数字都加上同一个实数,然后应用非线性函数,也就是一个非线性激活函数 ReLU,最终得到另一个 4×4 矩阵。然后重复我们之前的步骤,把这两个矩阵堆叠起来,最终得到一个 4×4×2 的矩阵。我们通过计算,从 6×6×3 的输入推导出一个 4×4×2 矩阵,它是卷积神经网络的一层,把它映射到标准神经网络中四个卷积层中的某一层或者一个非卷积神经网络中。

这一部分(图中蓝色边框标记的部分)就是应用激活函数 ReLU 之前的值似于z,最后应用非线性函数,得到的这个 4×4×2 矩阵,成为神经网络的下一层,也就是激活层。

这就是a [0] 到a [1] 的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做是运用线性函数再加上偏差,然后应用激活函数 ReLU。这样就通过神经网络的一层把一个6×6×3 的维度𝑏 [0] 演化为一个 4×4×2 维度的𝑏 [1] ,这就是卷积神经网络的一层。

示例中我们有两个过滤器,也就是有两个特征,因此我们才最终得到一个 4×4×2 的输出。但如果我们用了 10 个过滤器,而不是 2 个,我们最后会得到一个 4×4×10 维度的输出图像,因为我们选取了其中 10 个特征映射,而不仅仅是 2 个,将它们堆叠在一起,形成一个4×4×10 的输出图像,也就是𝑏 [1] 。

请注意一点,不论输入图片有多大,1000×1000 也好,5000×5000 也好,参数始终都是280 个。用这 10 个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作“ 避免过拟合”。

最后我们总结一下用于描述卷积神经网络中的一层(以l层为例),也就是卷积层的各种标记。

我们知道卷积一个 6×6×3 的图片需要一个 3×3×3 的过滤器,因此过滤器中通道的数量必须与输入中通道的数量一致。因此,输出通道数量就是输入通道数量,所以过滤器维度等于
[𝑚−1] 。

1.8 简单卷积网络示例

假设你有一张图片,你想做图片分类或图片识别,把这张图片输入定义为𝑦,然后辨别图片中有没有猫,用 0 或 1 表示,这是一个分类问题,我们来构建适用于这项任务的卷积神经网络。

这张 39×39×3 的输入图像就处理完毕了,为图片提取了 7×7×40 个特征,计算出来就是 1960 个特征。然后对该卷积进行处理,可以将其平滑或展开成 1960 个单元。平滑处理后可以输出一个向量,其填充内容是 logistic 回归单元还是 softmax 回归单元,完全取决于我们是想识图片上有没有猫,还是想识别K种不同对象中的一种,用Y表示最终神经网络的预测输出。明确一点,最后这一步是处理所有数字,即全部的 1960 个数字,把它们展开成一个很长的向量。为了预测最终的输出结果,我们把这个长向量填充到 softmax 回归函数中。

这是卷积神经网络的一个典型范例,设计卷积神经网络时,确定这些超参数比奥费工夫。要决定过滤器的大小、步幅、padding 以及使用多少个过滤器。这周和下周,我会针对选择参数的问题提供一些建议和指导。

随着神经网络计算深度不断加深,通常开始时的图像也要更大一些,初始值为 39×39,高度和宽度会在一段时间内保持一致,然后随着网络深度的加深而逐渐减小,从 39 到 37,再到 17,最后到 7。而通道数量在增加,从 3 到 10,再到 20,最后到 40。在许多其它卷积神经网络中,你也可以看到这种趋势。关于如何确定这些参数,后面课上我会更详细讲解,这是我们讲的第一个卷积神经网络示例。

一个典型的卷积神经网络通常有三层:

一个是卷积层,我们常常用 Conv 来标注。上一个例子,我用的就是 CONV。还有两种常见类型的层,我们留在后两节课讲。

一个是池化层,我们称之为 POOL。

最后一个是全连接层,用 FC 表示。虽然仅用卷积层也有可能构建出很好的神经网络,但大部分神经望楼架构师依然会添加池化层和全连接层。幸运的是,池化层和全连接层比卷积层更容易设计。后两节课我们会快速讲解这两个概念以便你更好的了解神经网络中最常用的这几种层,你就可以利用它们构建更强大的网络了。

1.9 池化层(Pooling layers )

除了卷积层,卷积网络也经常使用池化层来缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性

先举一个池化层的例子,然后我们再讨论池化层的必要性。假如输入是一个 4×4 矩阵,用到的池化类型是最大池化(max pooling)。执行最大池化的树池是一个 2×2 矩阵。执行过程非常简单,把 4×4 的输入拆分成不同的区域,我把这个区域用不同颜色来标记。对于 2×2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。

人们使用最大池化的主要原因是此方法在很多实验中效果都很好。下降没有什么可学的,一旦确定了𝑔和𝑡,它就是一个固定运算,梯度下降无需改变任何值。最大池化只是计算神经网络某一层的静态属性,没有什么需要学习的,它只是一个静态属性。

1.10 卷积神经网络示例

人们发现在卷积神经网络文献中,卷积有两种分类,这与所谓层的划分存在一致性。

一类卷积是一个卷积层和一个池化层一起作为一层,这就是神经网络的 Layer1。

另一类卷积是把卷积层作为一层,而池化层单独作为一层。人们在计算神经网络有多少层时,通常只统计具有权重和参数的层。因为池化层没有权重和参数,只有一些超参数。

接下来我们讲讲神经网络的激活值形状,激活值大小和参数数量。输入为 32×32×3,这些数做乘法,结果为 3072,所以激活值a [0] 有 3072 维,激活值矩阵为 32×32×3,输入层没有参数。计算其他层的时候,试着自己计算出激活值,这些都是网络中不同层的激活值形状激活值大小。

有几点要注意,第一,池化层和最大池化层没有参数;第二卷积层的参数相对较少,前面课上我们提到过,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为 6000,然后减少到 1600,慢慢减少到 84,最后输出 softmax结果。我们发现,许多卷积网络都具有这些属性,模式上也相似。

1.11 为什么使用卷积?(Why convolutions?)

和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接

卷积网络映射这么少参数有两个原因

一是参数共享。观察发现,特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。也就是说,如果你用一个 3×3 的过滤器检测垂直边缘,那么图片的左上角区域,以及旁边的各个区域都可以使用这个 3×3 的过滤器。因此在计算旁边的各个区域时,你不需要添加其它特征检测器。假如有一个这样的数据集,其左上角和右下角可能有不同分布,也有可能稍有不同,但很相似,整张图片共享特征检测器,提取效果也很好。

第二个方法是使用稀疏连接,我来解释下。这个 0 是通过

3×3 的卷积计算得到的,它只依赖于这个 3×3 的输入的单元格,右边这个输出单元(元素 0)仅与 36 个输入特征中 9 个相连接。而且其它像素值都不会对输出产生任影响,这就是稀疏连接的概念。

神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。你们也可能听过,卷积神经网络善于捕捉平移不变。通过观察可以发现,向右移动两个像素,图片中的猫依然清晰可见,因为神经网络的卷积结构使得即使移动几个像素,这张图片依然具有非常相似的特征,应该属于同样的输出标记。实际上,我们用同一个过滤器生成各层中,图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。

这就是卷积或卷积网络在计算机视觉任务中表现良好的原因

我们要构建一个猫咪检测器,我们有下面这个标记训练集,x表示一张图片,y是二进制标记或某个重要标记。我们选定了一个卷积神经网络,输入图片,增加卷积层和池化层,然后添加全连接层,最后输出一个 softmax,即y 。卷积层和全连接层有不同的参数w和偏差b,我们可以用任何参数集合来定义代价函数。一个类似于我们之前讲过的那种代价函数,并随机初始化其参数w和b,代价函数 J 等于神经网络对整个训练集的预测的损失总和再除以 m (即Cost J 。所以训练神经网络,你要做的就是使用梯度下降法,或其它算法,例如 Momentum 梯度下降法,含 RMSProp 或其它因子的梯度下降来优化神经网络中所有参数,以减少代价函数J的值。通过上述操作你可以构建一个高效的猫咪检测器或其它检测器。

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐