精华内容
下载资源
问答
  • 2022-01-15 15:23:23

    一.卷积神经网络(一)

    1.1 计算机视觉

    图片分类和图片识别,目标检测,图片风格迁移

     特征向量的维度

    卷积神经网络一般应用于计算机视觉领域,由于有的时候图片的像素点很多,导致神经网络输入特征值的维数很多。

    1.2 边缘检测示例

    弄清一张照片中的物体,利用电脑进行去识别,垂直边缘检测,水平边缘检测。

    如下图所示,原图是一个661的矩阵,卷积核是一个331的矩阵,经过卷积后得到一个441的矩阵。(为了检测图像中的垂直边缘,可以构造一个3*3的矩阵,在共用习惯中,在卷积神经网络的术语中,它被称为过滤器。在论文中,有时候会被称为核)

     计算过程如下:(各方格一一对应,相乘然后进行相加) 

    | 3 | 0 | 1 |… … … …| 1 | 0 | -1 |

    | 1 | 5 | 8 |…*… . … .| 1 | 0 | -1 | =3+1+2-1-8-2=-5

    | 2 | 7 | 2 |… … … …| 1 | 0 | -1 |

    此例子与上面相同(垂直边缘的原理)

    卷积运算提供了一个比较方便的算法来发现图像中的垂直边缘。

    1.3 更多边缘检测例子

    垂直边缘检测不仅可以检测垂直方向的边缘,还可以区分该边是从亮到暗(正边)还是从暗到亮(负边)。 

    除了之前卷积核中数字组合外还有很多,在做边缘检测的过程中最好将卷积核中的数字作为参数进行学习,这样得到的神经网络效果最好。 

     滤波器的不同,会有不一样的特性

     通过反向传播,Sobel滤波器和Scharr滤波器以及其他滤波器,对于数据的捕捉能力甚至胜过任何手写的滤波器,可以检测出45度、60度或73度,甚至是任何角度的边缘。

    1.4 Padding(在边缘是否填充)

    如果有n*n个方格,乘以f*f的滤波器,那么将会得到一个(n-f+1)*(n-f+1)的输出,这样的卷积方式,其存在两个缺陷:

    一是当一个6*6的图像经过3*3的卷积核卷积后会变成一个4*4的图像,这使图像经过卷积后变小了;

    二是原矩阵边缘处只被运算一次,而中心处会被运算多次,导致边缘处大部分信息被丢失了。

    不过可以在输出边缘都填充一圈像素点。

    下图是两种卷积方式:

    Valid卷积是令padding为0,意味着不填充

    Same卷积是通过添加padding使卷积前和卷积后图像的大小相同(p=(f-1)/2)。

    引入padding后维数的公式为n+2p-f+1。

    推荐使用奇数的过滤器,其中n为n*n的图像,p为填充的像素点(可以自定义),f为过滤器(f*f的过滤器),由此出现一个(n+2p-f+1)*(n+2p-f+1)的输出。

    1.5 卷积步长stride(filer每次移动的长度)

    当步长为2时,每进行一次运算后都要向左或者下移动两个像素点,如下图。 

     有步长的情况下维数的计算公式:

    n×n * f×f =(n+2p-f)/s+1 × (n+2p-f)/s+1

    镜像操作(mirroring operation):

    | 3 | 0 | 1 |                     | 2 | 8 | 1 |

    | 1 | 5 | 8 | ========> | 7 | 5 | 0 |

    | 2 | 7 | 2 |                     | 2 | 1 | 3 |

    沿着对角线进行对称交换数值。

     一般不进行此类操作

    在B站看了吴恩达深度学习课程第四课——卷积神经网络的视频,想做个笔记,让这个寒假过得充实一点,嘻嘻,有感兴趣的同学一起来玩呀!

    B站视频来源:【中英字幕】吴恩达深度学习课程第四课 — 卷积神经网络_哔哩哔哩_bilibili

    更多相关内容
  • 吴恩达卷积神经网络介绍资料
  • 吴恩达卷积神经网络课后作业数据集。第二周keras资源。用于训练
  • 吴恩达卷积神经网络,第一周作业PyTorch版本代码(gpu-cpu通用) 1.PyCharm上运行的PyTorch项目 2.基础的卷积神经网络搭建 3.加入了gpu加速所需的代码 4.含数据集+cnn_utils.py【对原版本做了简化】 5.含训练、...
  • 吴恩达卷积神经网络——学习笔记(一)1. 边缘检测示例 (Edge Detection Example)1.1 卷积运算1.2 垂直边缘检测器的应用案例2. 更多边缘检测内容 (More Edge Detection Example)3. Padding4. 卷积步长 (Strided ...


    视频课程链接:
    https://www.bilibili.com/video/BV1FT4y1E74V?
    笔记参考链接:
    https://blog.csdn.net/weixin_36815313/article/details/105728919

    1. 边缘检测示例 (Edge Detection Example)

    1.1 卷积运算

    卷积运算是卷积神经网络最基本的组成部分。
    在这里插入图片描述

    假设有一张 6 6 6× 6 6 6的灰度图像。因为是灰度图像,即没有RGB三通道,所以它是 6 6 6× 6 6 6× 1 1 1的矩阵(如上图)。为了检测图像中的垂直边缘,你可以构造一个 3 3 3× 3 3 3矩阵。在卷积神经网络的术语中,它被称为过滤器(filter),或者也被称为核(kernel)
    在这里插入图片描述

    假设构造一个 3 3 3× 3 3 3的过滤器(如上图),对上述的 6 6 6× 6 6 6的图像进行卷积运算,卷积运算用 ∗ * 来表示。
    在这里插入图片描述

    这个卷积运算的输出将会是一个 4 4 4× 4 4 4的矩阵,你可以将它看成一个 4 4 4× 4 4 4的图像(如上图)。
    在这里插入图片描述

    首先计算 4 4 4× 4 4 4矩阵中第一个元素,使用 3 3 3× 3 3 3的过滤器,将其覆盖在输入图像,然后进行元素乘法(element-wise products)运算,即 [ 3 × 1 0 × 0 1 × ( − 1 ) 1 × 1 5 × 0 8 × ( − 1 ) 2 × 1 7 × 0 2 × ( − 1 ) ] = [ 3 0 − 1 1 0 − 8 2 0 − 2 ] \left[ \begin{matrix} 3×1 & 0×0 & 1×(-1)\\ 1×1 & 5×0 & 8×(-1)\\ 2×1 & 7×0 & 2×(-1)\\ \end{matrix} \right]=\left[ \begin{matrix} 3 & 0 & -1\\ 1 & 0 & -8\\ 2 & 0 & -2\\ \end{matrix} \right] 3×11×12×10×05×07×01×(1)8×(1)2×(1)=312000182,最后将该矩阵每个元素相加得到最左上角的元素,即 3 + 1 + 2 + 0 + 0 + 0 + ( − 1 ) + ( − 8 ) + ( − 2 ) = − 5 3+1+2+0+0+0+(-1)+(-8)+(-2)=-5 3+1+2+0+0+0+(1)+(8)+(2)=5
    在这里插入图片描述

    接下来计算第二个元素,因此要把 3 3 3× 3 3 3的过滤器向右移动一步(如上图)。继续做同样的元素乘法,然后加起来,即 0 × 1 + 5 × 1 + 7 × 1 + 1 × 0 + 8 × 0 + 2 × 0 + 2 × ( − 1 ) + 9 × ( − 1 ) + 5 × ( − 1 ) = − 4 0×1+5×1+7×1+1×0+8×0+2×0+2×(−1)+9×(−1)+5×(−1)=−4 0×1+5×1+7×1+1×0+8×0+2×0+2×(1)+9×(1)+5×(1)=4。然后继续将 3 3 3× 3 3 3的过滤器右移,直到计算完这一行的元素。
    在这里插入图片描述

    接下来为了计算下一行的元素,将 3 3 3× 3 3 3的过滤器下移(如上图)。重复进行元素乘法,然后加起来。通过计算得到 − 10 -10 10。以此类推,从而计算得到矩阵中的其他元素。
    在这里插入图片描述

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

    1.2 垂直边缘检测器的应用案例

    在这里插入图片描述

    上图是一个简单的 6 6 6× 6 6 6图像,左边一半的像素值是10,右边一半的像素值是0。如果将它看成一个图片,左边像素值为10的部分比较亮,右边像素值为0的部分则比较暗。图片中间有一个特别明显的垂直边缘,这条垂直线是从黑到白的过渡线。
    当你使用上图中的 3 3 3× 3 3 3过滤器进行卷积运算,这个 3 3 3× 3 3 3的过滤器可视为这样一张图片,左边较为明亮,中间有一个过渡,颜色与左边相比较深,然后右边是深色的。
    在这里插入图片描述

    经过卷积运算后,得到右边的矩阵。如果把这个 4 4 4× 4 4 4矩阵当成图像,可以看到在中间有一段较亮的区域,两边是较深的区域,表示在图像中间有一个特别明显的垂直边缘。

    2. 更多边缘检测内容 (More Edge Detection Example)

    计算机视觉中, 3 3 3× 3 3 3过滤器的几种常规数字组合:

    • 垂直边缘过滤器: [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \left[ \begin{matrix} 1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\\ \end{matrix} \right] 111000111
    • 水平边缘过滤器: [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \left[ \begin{matrix} 1 & 1 & 1\\ 0 & 0 & 0\\ -1 & -1 & -1\\ \end{matrix} \right] 101101101
    • Sobel过滤器:它的优点在于增加了中间一行元素的权重,这使得结果的鲁棒性会更高一些。 [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \left[ \begin{matrix} 1 & 0 & -1\\ 2 & 0 & -2\\ 1 & 0 & -1\\ \end{matrix} \right] 121000121
    • Scharr过滤器: [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \left[ \begin{matrix} 3 & 0 & -3\\ 10 & 0 & -10\\ 3 & 0 & -3\\ \end{matrix} \right] 31030003103

    在深度学习中,我们需要做的就是,把这矩阵中的9个数字当成9个参数,并且使用反向传播算法,让神经网络学习任何它所需要的 3 3 3× 3 3 3的过滤器,并在整幅图片上应用它,其目标就是去理解这9个参数。

    3. Padding

    为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是padding
    在前一章节的例子中,如果用一个 3 3 3× 3 3 3的过滤器卷积一个 6 6 6× 6 6 6的图像,最后会得到一个 4 4 4× 4 4 4的输出,也就是一个 4 4 4× 4 4 4矩阵。那是因为 3 3 3× 3 3 3的过滤器在 6 6 6× 6 6 6的矩阵中,只可能有4×4种可能的位置。这背后的数学解释是,如果我们有一个 n n n× n n n的图像,用 f f f× f f f的过滤器做卷积,那么输出图像的维度就是 ( n − f + 1 ) (n-f+1) (nf+1)× ( n − f + 1 ) (n-f+1) (nf+1)
    但是在这过程中存在如下两个缺点:
    ⒈缺点一:输出缩小

    • 每次进行卷积运算,输出图像就会缩小,比如上个例子中从 6 6 6× 6 6 6缩小到 4 4 4× 4 4 4。假如有一个深层的神经网络,图像每经过一层都缩小的话,就会得到一张很小的图片。

    ⒉缺点二:图像边缘的信息丢失

    • 6 6 6× 6 6 6的图像中看到,角落边缘的像素(绿色阴影标记)只被 3 3 3× 3 3 3的过滤器卷积过一次,即在输出中仅使用过一次,因为它位于这个 3 3 3× 3 3 3的区域的一角。但如果是在中间的像素点(红色方框标记),就会有许多 3 3 3× 3 3 3的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,也意味着丢失了图像边缘位置的许多信息。
      在这里插入图片描述

    为了解决以上两种问题,通常有如下的解决方法:

    • 在卷积操作之前填充(padding)这幅图像。你可以沿着图像边缘再填充一层像素,那么 6 6 6× 6 6 6的图像就被填充成了一个 8 8 8× 8 8 8的图像。这时如果使用 3 3 3× 3 3 3的过滤器对这个 8 8 8× 8 8 8的图像卷积,就得到了一个输出尺寸和原始图像相同的 6 6 6× 6 6 6的图像。一般情况下可以用像素值0去填充。
      在这里插入图片描述

    因为我们在周围都填充了一个像素点,则填充的数量 p = 1 p=1 p=1,输出的尺寸大小也就变成了 ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)× ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)。这样一来,角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
    实际上还可以填充更多像素,至于选择填充多少像素,通常有两个选择,分别叫做Valid卷积Same卷积

    • Valid卷积 —— 不填充。如果有一个 n n n× n n n的图像,用一个 f f f× f f f的过滤器卷积,将会得到一个 ( n − f + 1 ) (n-f+1) (nf+1)× ( n − f + 1 ) (n-f+1) (nf+1)维的输出。
    • Same卷积 —— 填充后,输出大小和输入大小相同。如果你有一个 n n n× n n n的图像,用 p p p个像素填充边缘,输出的大小就是 ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)× ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1)。因此如果想让 n + 2 p − f + 1 = n n+2p-f+1=n n+2pf+1=n的话,使得输出和输入大小相等,那么 p = ( f − 1 ) / 2 p=(f-1)/2 p=(f1)/2

    习惯上,计算机视觉中, f f f通常是奇数。这可能有如下几个原因:

    1. 如果 f f f是一个偶数,那么你只能使用一些不对称填充。只有 f f f是奇数的情况下,Same卷积才会有自然的填充。我们才能以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。
    2. 当你有一个奇数维度的过滤器,比如 3 3 3× 3 3 3 5 5 5× 5 5 5,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更加便于指出过滤器的位置。

    4. 卷积步长 (Strided Convolutions)

    卷积中的步幅(stride)是另一个构建卷积神经网络的基本操作。
    在这里插入图片描述

    假设使用一个 3 3 3× 3 3 3的过滤器来卷积这个 7 7 7× 7 7 7的图像,和之前一样取左上方的 3 3 3× 3 3 3区域的元素的乘积再求和,最后结果为91。
    在这里插入图片描述

    和之前不同的是,我们把步幅(stride)设置成了2。因此接下来把 3 3 3× 3 3 3的过滤器向右移动两步,将每个元素相乘并求和,得到的结果是100。
    在这里插入图片描述

    然后继续将 3 3 3× 3 3 3的过滤器移动两个步长,计算得到结果83。

    在这里插入图片描述

    完成第一行之后,再移动到下一行,此时也是移动两个步长(如上图)。同样的,将元素相乘并求和,得到结果69。
    在这里插入图片描述

    以此类推,最终得到一个 3 3 3× 3 3 3的输出(如上图)。如果使用一个f×f的过滤器卷积一个n×n的图像,padding p p p步幅 s s s,那么输出的尺寸大小为 ⌊ n + 2 p − f s + 1 × n + 2 p − f s + 1 ⌋ \lfloor \frac{n+2p-f}{s}+1×\frac{n+2p-f}{s}+1 \rfloor sn+2pf+1×sn+2pf+1
    注:符号 ⌊ ⌋ \lfloor \rfloor 表示向下取整,即如果遇到计算出来的商不是整数,则向下取整。

    5. 三维卷积 (Convolutions Over Volumes)

    前面章节讲的是对二维图像进行卷积,这一章节则是对三维立体进行卷积操作。

    5.1 三维卷积的计算

    在这里插入图片描述

    假设有一张 6 6 6× 6 6 6× 3 3 3的RGB彩色图像,这里的 3 3 3指的是三个颜色通道。为了检测图像的边缘或者其他的特征,使用一个 3 3 3× 3 3 3× 3 3 3的过滤器进行卷积,这个过滤器也有三层,分别对应红、绿、蓝三个通道。
    在这里插入图片描述

    为了计算这个卷积操作的输出,你要做的就是把这个 3 3 3× 3 3 3× 3 3 3的过滤器先放到最左上角的位置,这个 3 3 3× 3 3 3× 3 3 3的过滤器有27个数,依次取这27个数,乘以输入图像中对应通道的数字,即先取红色通道的前9个数字,乘以输入图像中对应的红色通道的9个数字,然后取绿色通道的9个数字,乘以输入图像中对应的绿色通道的9个数字,最后取蓝色通道的9个数字,乘以输入图像中对应的绿色通道的9个数字,分别乘以输入图像中对应的蓝色通道的9个数字,然后把这些数相加,就得到了输出的第一个数字。
    在这里插入图片描述

    然后把这个立方体滑动一个单位,再将27个数与之对应的3个通道中的数字相乘并相加,就得到了下一个输出,以此类推。

    5.2 多个过滤器的三维卷积

    在实际图像处理中,仅靠单个过滤器很难将复杂的图像特征进行充分提取。因此通常而言,我们用来进行卷积的过滤器远不止一个。
    在这里插入图片描述

    我们用第一个过滤器进行卷积得到一个 4 4 4× 4 4 4的输出,然后用第二个过滤器进行卷积又得到一个4×4的输出,将第二个输出放到第一个输出后面,从而形成了一个4×4×2的输出,这里的2表示滤波器的个数。
    总的来说,如果你有一个 n n n× n n n× n c n_c nc的输入图像,卷积上一个 f f f× f f f× n c n_c nc的过滤器,然后就得到了一个 ( n − f + 1 ) (n−f+1) (nf+1)× ( n − f + 1 ) (n−f+1) (nf+1)× n c ′ n_{c^{'}} nc 输出图像,这里 n c ′ n_{c^{'}} nc表示过滤器的个数,也表示下一层的通道数。
    注:这里假设步幅为1,并且没有padding

    6. 单层卷积网络 (One Layer of a Convolutional Network)

    6.1 单层卷积网络的简单案例

    在这里插入图片描述

    以上一章节中的例子来说,使用两个过滤器卷积处理一个三维图像,输出两个不同的4×4矩阵。首先对第一个输出增加偏差 b 1 b_1 b1(这里 b 1 b_1 b1是一个实数),然后应用非线性激活函数(这里使用ReLu函数),输出结果是一个 4 4 4× 4 4 4的矩阵。
    对于第二个输出增加不同的偏差 b 2 b_2 b2(这里 b 2 b_2 b2是一个实数),然后应用非线性激活函数(这里使用ReLu函数),最终得到另一个 4 4 4× 4 4 4的矩阵。然后将这两个矩阵堆叠起来,最终得到一个 4 4 4× 4 4 4× 2 2 2的矩阵。
    单层卷积神经网络中的前向传播过程:
    (1) z [ l ] = w [ l ] a [ l − 1 ] + b [ l ] z^{[l]}=w^{[l]}a^{[l-1]}+b^{[l]} z[l]=w[l]a[l1]+b[l]
    (2) a [ l ] = g ( z [ l ] ) a^{[l]}=g(z^{[l]}) a[l]=g(z[l])
    其中 w [ l ] a [ l − 1 ] w^{[l]}a^{[l-1]} w[l]a[l1]对应的是 6 6 6× 6 6 6× 3 3 3的输入图像与 3 3 3× 3 3 3× 3 3 3的过滤器卷积得到的 4 4 4× 4 4 4的输出矩阵, z [ l ] z^{[l]} z[l]对应的是增加了偏置的 4 4 4× 4 4 4的输出矩阵(如下图)。
    在这里插入图片描述

    这就是 a [ l ] a^{[l]} a[l] a [ l + 1 ] a^{[l+1]} a[l+1]的演变过程,首先执行线性函数,然后所有元素相乘做卷积,具体做法是运用线性函数再加上偏差,然后应用激活函数ReLU。这样就通过神经网络的一层把一个 6 6 6× 6 6 6× 3 3 3的维度 a [ 0 ] a^{[0]} a[0]演化为一个 4 4 4× 4 4 4× 2 2 2维度的 a [ 1 ] a^{[1]} a[1],这就是卷积神经网络的一层。
    假设每一层都是 3 3 3× 3 3 3× 3 3 3的过滤器,因此每个过滤器有27个参数,再加上一个偏差 b b b,一共有28个参数。现在我们有10个 3 3 3× 3 3 3× 3 3 3的过滤器,加在一起是28×10,也就是280个参数。
    不论输入图片有多大,参数始终都是280个。用这10个过滤器来提取特征,如垂直边缘,水平边缘和其它特征。即使这些图片很大,参数却很少,这就是卷积神经网络的一个特征,叫作避免过拟合

    6.2 符号定义

    以卷积神经网络中的第 l l l层卷积层为例,定义卷积层的各种标记。

    • f [ l ] f^{[l]} f[l]表示第 l l l层过滤器的大小;
    • p [ l ] p^{[l]} p[l]表示第 l l lpadding的数量,padding数量可指定为valid卷积,即无padding,也可指定same卷积,即选定padding
    • s [ l ] s^{[l]} s[l]表示第 l l l层的步幅
    • l l l层的输入图像的维度为 n H [ l − 1 ] n^{[l-1]}_H nH[l1]× n W [ l − 1 ] n^{[l-1]}_W nW[l1]× n c [ l − 1 ] n_c^{[l-1]} nc[l1],它是上一层的激活值;
    • l l l层的输出图像的维度为 n H [ l ] n^{[l]}_H nH[l]× n W [ l ] n^{[l]}_W nW[l]× n c [ l ] n_c^{[l]} nc[l]
    • n H [ l ] n^{[l]}_H nH[l]表示第 l l l层输出图像的高度,即 n H [ l ] = ⌊ n H [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_H^{[l]}=\lfloor\frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nH[l]=s[l]nH[l1]+2p[l]f[l]+1
    • n W [ l ] n_W^{[l]} nW[l]表示第 l l l层输出图像的宽度,即 n W [ l ] = ⌊ n W [ l − 1 ] + 2 p [ l ] − f [ l ] s [ l ] + 1 ⌋ n_W^{[l]}=\lfloor\frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}}+1\rfloor nW[l]=s[l]nW[l1]+2p[l]f[l]+1
    • n c [ l ] n_c^{[l]} nc[l]表示输出图像的通道数。
    • 单个过滤器的维度是 f [ l ] f^{[l]} f[l]× f [ l ] f^{[l]} f[l]× n c [ l − 1 ] n_c^{[l-1]} nc[l1],过滤器中的通道数必须与输入图像中的通道数一致;
    • 对于单个样本而言,激活值 a [ l ] a^{[l]} a[l]是一个三维体,其维度是 n H [ l ] n_H^{[l]} nH[l]× n W [ l ] n_W^{[l]} nW[l]× n c [ l ] n_c^{[l]} nc[l];对于 m m m个样本,即 m m m个激活值 a [ l ] a^{[l]} a[l]的集合,则输出 A [ l ] A^{[l]} A[l]的维度是 m m m× n H [ l ] n_H^{[l]} nH[l]× n W [ l ] n_W^{[l]} nW[l]× n c [ l ] n_c^{[l]} nc[l]
    • 权重参数 W [ l ] W^{[l]} W[l]是所有过滤器的集合再乘以过滤器的总数量,它的维度是 f [ l ] f^{[l]} f[l]× f [ l ] f^{[l]} f[l]× n c [ l − 1 ] n_c^{[l-1]} nc[l1]× n c [ l ] n_c^{[l]} nc[l]
    • 偏差参数 b [ l ] b^{[l]} b[l]在代码中通常表示为一个 1 1 1× 1 1 1× 1 1 1× n c [ l ] n_c^{[l]} nc[l]的四维向量或四维张量。每个过滤器都有一个偏差参数,它是一个实数。
      在这里插入图片描述

    7. 简单卷积网络示例 (A Simple Convolution Network Example)

    在这里插入图片描述

    假设输入一张图片,定义为 x x x,用于图片分类或图片识别。输入图片的大小是 39 39 39× 39 39 39× 3 3 3,所以 n H [ 0 ] = n W [ 0 ] n_H^{[0]}=n_W^{[0]} nH[0]=nW[0],即高度和宽度都等于39, n c [ 0 ] = 3 n_c^{[0]}=3 nc[0]=3,即第0层的通道数为3。
    假设第一层我们用10个 3 3 3× 3 3 3× 3 3 3的过滤器来提取特征,即过滤器大小 f [ 1 ] = 3 f^{[1]}=3 f[1]=3过滤器个数 n c [ 1 ] = 10 n_c^{[1]}=10 nc[1]=10。 高度和宽度使用valid卷积,即padding数量 p [ 1 ] = 0 p^{[1]}=0 p[1]=0步幅 s [ 1 ] = 1 s^{[1]}=1 s[1]=1
    因此卷积得到的输出图像的大小,或者说第一层激活值 a [ 1 ] a^{[1]} a[1]的维度为 37 37 37× 37 37 37× 10 10 10,其中37是公式 n + 2 p − f s + 1 \frac{n+2p-f}{s}+1 sn+2pf+1的计算结果,也就是 39 + 0 − 3 1 + 1 = 37 \frac{39+0-3}{1}+1=37 139+03+1=37。这样就构建完成了第一个卷积层。
    在这里插入图片描述

    接下来进入下一个卷积层,这次我们采用的过滤器是 5 5 5× 5 5 5的矩阵,过滤器大小 f [ 2 ] = 5 f^{[2]}=5 f[2]=5,因为上一层的输出图像的通道数 n c [ 1 ] n_c^{[1]} nc[1]为10,因此这一层的过滤器维度是 5 5 5× 5 5 5× 10 10 10。另外步幅 s [ 2 ] = 2 s^{[2]}=2 s[2]=2padding数量 p [ 2 ] = 0 p^{[2]}=0 p[2]=0,并且有20个这样的过滤器,因此这一层输出结果的维度为 17 17 17× 17 17 17× 20 20 20,即输出图像的高度和宽度 n H [ 2 ] = n W [ 2 ] = 17 n_H^{[2]}=n_W^{[2]}=17 nH[2]=nW[2]=17通道数 n c [ 2 ] = 20 n_c^{[2]}=20 nc[2]=20。因为步幅是2,维度缩小得很快,所以维度大小从 37 37 37× 37 37 37减小到 17 17 17× 17 17 17,减小了一半还多。这样就构建完成了第二个卷积层。
    在这里插入图片描述

    然后来构建最后一个卷积层,假设过滤器还是 5 5 5× 5 5 5,即过滤器大小 f [ 3 ] = 5 f^{[3]}=5 f[3]=5,因为输入图像的维度是 17 17 17× 17 17 17× 20 20 20,所以这一层的过滤器维度是 5 5 5× 5 5 5× 20 20 20。假设步幅 s [ 3 ] = 2 s^{[3]}=2 s[3]=2padding数量 p [ 3 ] = 0 p^{[3]}=0 p[3]=0,并且使用了40个这样的过滤器,因此最后的输出维度为 7 7 7× 7 7 7× 40 40 40。到此,这张 39 39 39× 39 39 39× 3 3 3的输入图像就处理完毕,为图片提取了 7 7 7× 7 7 7× 40 40 40个特征,即1960个特征。
    在这里插入图片描述

    然后对这1960个特征进行卷积处理,可以将其平滑或展开成1960个单元,平滑处理后可以保存到一个长向量中,然后输入到logistic回归单元softmax回归单元,最后用 y ^ \hat{y} y^表示神经网络的预测输出。

    8. 池化层 (Pooling Layers)

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

    8.1 最大池化 (Max Pooling)

    在这里插入图片描述

    假如输入是一个 4 4 4× 4 4 4矩阵,执行最大池化的树池是一个 2 2 2× 2 2 2矩阵,即 f = 2 f=2 f=2。为了计算出右侧这4个元素值,我们需要对输入矩阵的 2 2 2× 2 2 2区域做最大值运算。首先对紫色的 2 2 2× 2 2 2区域计算最大值,得到结果为9。假设步幅 s = 2 s=2 s=2,因此再向右移动2个步幅,得到蓝色的 2 2 2× 2 2 2区域中最大值为2。然后向下移动2步,得到绿色的 2 2 2× 2 2 2区域中最大值为6。最后再向右移动2步,得到红色的 2 2 2× 2 2 2区域中最大值为3。最后输出得到一个 2 2 2× 2 2 2矩阵。
    对于这个 2 2 2× 2 2 2的输出,输出的每个元素都是其对应颜色区域中的最大元素值。其中过滤器大小 f = 2 f=2 f=2步幅 s = 2 s=2 s=2是最大池化的超参数,但这两个超参数是固定值,因为其并不能在梯度下降中进行学习。

    8.2 平均池化 (Average Pooling)

    在这里插入图片描述

    这种运算顾名思义,选取的不是每个过滤器的最大值,而是平均值。假设过滤器大小 f = 2 f=2 f=2,步幅 s = 2 s=2 s=2,因此依次计算得到紫色区域的平均值是3.75,蓝色区域的平均值是1.25,绿色区域的平均值是4,红色区域的平均值是2。
    目前来说,最大池化比平均池化更常用。但也有例外,就是深度很深的神经网络,你可以用平均池化来分解规模为 7 7 7× 7 7 7× 1000 1000 1000的输出矩阵,在整个空间内求平均值,最后得到 1 1 1× 1 1 1× 1000 1000 1000的输出矩阵。

    9. 卷积神经网络示例 (Convolutional neural network example)

    假设有一张大小为 32 32 32× 32 32 32× 3 3 3的图片,这张RGB图片中含有某个手写体数字,比如7,你想识别它是0-9这10个数字中的哪一个,因此我们来构建一个卷积神经网络来实现这个功能。
    在这里插入图片描述

    首先构建第一层卷积层,输入是一个 32 32 32× 32 32 32× 3 3 3的矩阵,假设第一层使用过滤器的维度为 5 5 5× 5 5 5× 3 3 3步幅为1,padding为0,过滤器个数为6,那么该卷积层的输出矩阵的维度为 28 28 28× 28 28 28× 6 6 6,将这层标记为CONV1
    然后紧接着在卷积层后面构建一个池化层,这里选择用最大池化。假设参数 f = 2 f=2 f=2 s = 2 s=2 s=2 p = 0 p=0 p=0,即最大池化使用的过滤器为 2 2 2× 2 2 2步幅为2,padding为0,因此输出的高度和宽度会减少一半,通道数量保持不变,最终的输出矩阵维度为 14 14 14× 14 14 14× 6 6 6,将该池化层标记为POOL1
    人们在计算神经网络的层数时,通常只统计具有权重和参数的层,而池化层没有权重和参数,只有一些超参数。因此这里我们把CONV1POOL1共同作为一个卷积,并标记为Layer1
    注:另一类划分方法是把卷积层作为一层,而池化层单独作为一层。
    在这里插入图片描述

    接下来对Layer1应用另一个卷积层,假设过滤器的维度为 5 5 5× 5 5 5× 3 3 3,即 f = 5 f=5 f=5步幅为1,padding为0,过滤器个数为16个,所以卷积层CONV2的输出维度为 10 10 10× 10 10 10× 16 16 16
    继续执行最大池化计算,假设参数为 f = 2 f=2 f=2 s = 2 s=2 s=2,因此高度和宽度减半,通道数和之前一样,输出矩阵的维度为 5 5 5× 5 5 5× 16 16 16,标记为POOL2。卷积层CONV2和池化层POOL2这两个是一个卷积,即Layer2,因为它只有一个权重集和一个卷积层CONV2
    在这里插入图片描述

    Layer2的输出是一个 5 5 5× 5 5 5× 16 16 16的矩阵,即包含了400个元素。现在将POOL2平整化为一个大小为400的一维向量。我们可以把平整化结果想象成这样的一个神经元集合,然后利用这400个单元构建下一层。
    下一层含有120个单元,这400个单元与120个单元紧密相连,这就是我们第一个全连接层。它相当于一个单神经网络层,它的权重矩阵为 W [ 3 ] W^{[3]} W[3],维度为 120 120 120× 400 400 400,还有一个偏差参数 b [ 3 ] b^{[3]} b[3],维度为 120 120 120× 1 1 1
    然后我们对这个120个单元再添加一个全连接层,假设它含有84个单元,标记为FC4。最后用这84个单元填充一个softmax单元。如果我们想通过手写数字识别来识别0-9这10个数字,这个softmax单元就会有10个输出。
    关于如何选定这些超参数,常规做法是尽量不要自己设置超参数,而是查看文献中别人采用了哪些超参数,选一个在别人任务中效果很好的架构,那么它也有可能适用于你自己的应用程序。
    在神经网络中,另一种常见模式就是一个或多个卷积后面跟随一个池化层,然后一个或多个卷积层后面再跟一个池化层,然后是几个全连接层,最后是一个softmax层。
    接下来讲一下神经网络的激活值维度,激活值大小和参数数量。
    在这里插入图片描述

    有以下几点要注意:

    • 池化层和最大池化层没有参数;
    • 卷积层的参数相对较少,许多参数都存在于神经网络的全连接层。

    从上图可以发现,随着神经网络的深度加深,激活值的尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。示例中,激活值尺寸在第一层为6000,然后减少到1600,慢慢减少到84,最后输出softmax结果。

    10. 为什么使用卷积? (Why Convolutions?)

    和只用全连接层相比,卷积层的两个主要优势在于参数共享稀疏连接
    在这里插入图片描述

    假设有一张 32 32 32× 32 32 32× 3 3 3的图片,使用6个维度为 5 5 5× 5 5 5× 3 3 3的过滤器,则输出矩阵的维度为 28 28 28× 28 28 28× 6 6 6。32×32×3=3072,28×28×6=4704。假如我们构建一个普通的神经网络,其中一层含有32×32×3=3072个单元,下一层含有28×28×6=4704个单元,两层中的每个神经元彼此相连,然后计算权重矩阵 W W W,它的维度等于4074×3072≈1400万,因此需要训练的参数很多。虽然以现在的技术,我们可以用1400多万个参数来训练网络,因为这张32×32×3的图片非常小,训练这么多参数没有问题。但是如果这是一张 1000 1000 1000× 1000 1000 1000的图片,权重矩阵 W W W会变得非常大。
    假如我们构建一个卷积层,每个过滤器的维度都是 5 5 5× 5 5 5× 3 3 3,一个过滤器有75个参数,再加上偏差参数 b b b,那么每个过滤器就有76个参数,因为一共有6个过滤器,所以参数共计456个,可以看到相对而言,卷积操作中涉及的参数数量明显变少。

    • 参数共享 — 假设使用一个 3 3 3× 3 3 3的过滤器检测垂直边缘,那么图片的左上角区域,以及旁边的各个区域(左边矩阵中蓝色方框标记的部分)都可以使用这个 3 3 3× 3 3 3的过滤器,即每个特征检测器以及输出都可以在输入图片的不同区域中使用同样的参数,以便提取垂直边缘或其它特征。它不仅适用于边缘特征这样的低阶特征,同样适用于高阶特征,例如提取脸上的眼睛,猫或者其他特征对象。
    • 稀疏连接 — 例如输出矩阵中左上角的0是通过 3 3 3× 3 3 3的卷积计算得到的,它只依赖于这个 3 3 3× 3 3 3的输入的单元格,右边的输出矩阵的某一个元素仅与36个输入特征中9个相连接,而其它像素值都不会对输出产生任何影响。

    在这里插入图片描述

    卷积神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过拟合。

    展开全文
  • 自己整理的吴恩达深度学习第四课(卷积神经网络)的课件,大家一起深度学习吧。
  • YOLO,吴恩达课后编程作业,Course 4 - 卷积,训练model_data/yolov2.h5的项目,直接下载,查看我发的另一篇博客关于这个资源的使用
  • 吴恩达老师的深度学习课程的第四部分——卷积神经网络的课后作业,四周作业(包括课后的quiz和编程作业)都在里面,是搬运别人的资源,自己做了,感觉很不错。当时找资源时,各种痛苦,也受到了好心人的帮助,没有...
  • 卷积神经网络 (一)卷积运算以及编程语言中的卷积运算符 6x6图像经过3x3的过滤器转变为4x4的图像 (二)垂直边缘检测 4x4图像中间有段亮一点的区域,对应检测到6×6图像中间的垂直边缘。 (三)关于边缘检测的更...

    一、卷积神经网络介绍

    (一)卷积运算以及编程语言中的卷积运算符

    在这里插入图片描述
    6x6图像经过3x3的过滤器转变为4x4的图像

    (二)垂直边缘检测

    在这里插入图片描述
    4x4图像中间有段亮一点的区域,对应检测到6×6图像中间的垂直边缘。

    (三)关于边缘检测的更多内容

    从亮到暗或从暗到亮的过渡带

    在这里插入图片描述
    垂直边缘检测和水平边缘检测
    在这里插入图片描述
    其他类型的过滤器
    在这里插入图片描述

    (四)padding

    1.为何padding

    padding的原因:
    原本图像经过过滤器放缩(一层一层),变的越来越小,图像变小是一个原因,另一个原因是原本图像边缘信息损失。
    n x n图像经过f x f过滤器转化为(n-f+1) x (n-f+1)图像
    选择填充的步数p=padding
    在这里插入图片描述

    2.基于padding的两种常用卷积

    Valid:不填充,即p=0
    Same:填充的步数使得输入大小和输出大小相同
    ( n + 2 p − f + 1 ) (n+2p-f+1) (n+2pf+1) X ( n + 2 p − f + 1 ) = n (n+2p-f+1)=n (n+2pf+1)=n X n n n
    得到 p = f − 1 2 p=\frac{f-1}{2} p=2f1
    因此卷积核 f f f通常为奇数
    在这里插入图片描述

    (五)步长stride

    在这里插入图片描述
    给定n,f,p,s,计算输出图像大小
    在这里插入图片描述
    数学中的卷积和神经网络中的卷积不一样
    数学中的卷积需要对过滤器顺时针旋转90度再镜像
    神经网络中不需要这项操作
    在这里插入图片描述

    (六)三维卷积

    6 x 6 x 1是指灰色图像
    6 x 6 x 3是指彩色图像,3是通道数
    在这里插入图片描述
    三维卷积的计算
    输入图像的通道数必须和过滤器的通道数保持一致。
    过滤器的参数不同,得到不同的检测器。
    在这里插入图片描述
    如果同时想检测多个特征,比如既想检测垂直边缘特征,又想检测水平边缘特征,则可以使用多个滤波器。最后输出图像的通道数即是使用滤波器的个数。
    在这里插入图片描述

    (七)单层卷积网络

    在这里插入图片描述
    某一层卷积网络的工作原理
    在这里插入图片描述

    (八)简单卷积网络示例

    在这里插入图片描述
    卷积神经网络中常见的层
    卷积层、池化层、 全连接层
    在这里插入图片描述

    (九)池化层

    池化层的用处:缩减模型的大小,提高计算速度,同时提高提取特征的鲁棒性。
    不需要用梯度下降学习参数,因为进行的是固定的运算。

    对每个通道进行最大池化
    在这里插入图片描述
    平均池化
    在神经网络中,最大池化要比平均池化用的多,但是在深度很深的神经网络中,会用到平均池化。
    在这里插入图片描述
    f=2,s=2表示输出图像的高和宽是输入图像的高和宽的一半,比较常用。
    不需要学习参数,只要设置超级参数。
    在这里插入图片描述

    (十)全连接层(fully connected layer)

    全连接层和普通神经网络是一样的

    (十一)卷积网络示例

    池化层不含参数W和b,所以不单独记为一层,而是和卷积层共同看作一层。
    在这里插入图片描述
    激活函数值下降的很快的话,会影响神经网络的性能。
    在这里插入图片描述

    (十一)为什么使用卷积神经网络

    相比全连接层,卷积神经网络的两个特点
    参数共享
    连接稀疏

    在这里插入图片描述

    在这里插入图片描述

    二、代码实现

    这里使用的是keras

    (一)导入数据集

    import h5py
    
    train_dataset=h5py.File('/Users/renjianmei/Downloads/深度学习/未命名文件夹/第三周/datasets/train_signs.h5', "r")
    test_dataset = h5py.File('/Users/renjianmei/Downloads/深度学习/未命名文件夹/第三周/datasets/test_signs.h5', "r")
    

    在这里插入图片描述
    导入的h5py文件属于字典形式

    (二)数据预处理

    1.对X进行归一化处理

    train_set_x=train_dataset['train_set_x'][:]
    train_set_y=train_dataset['train_set_y'][:]
    classes1=train_dataset['list_classes'][:]
    
    test_set_x = test_dataset["test_set_x"][:]
    test_set_y = test_dataset["test_set_y"][:]
    
    #classes2 = test_dataset["list_classes"][:]     
    

    对于图像数据,通常除以255进行归一化处理。

    train_x=train_set_x/255
    test_x=test_set_x/255
    

    查看数据维度
    在这里插入图片描述

    train_y=train_set_y.reshape(train_set_y.shape[0],-1)
    test_y=test_set_y.reshape(test_set_y.shape[0],-1)
    

    在这里插入图片描述
    在这里插入图片描述

    (三)one_hot函数

    def convert_to_one_hot(Y, C):
        """
        Y————标签变量,维度为(m,1)其中m为样本量
        C————类别数
        返回 Y————维度为(m,C)
        """
        Y = np.eye(C)[Y.reshape(-1)]
        
        return Y
    
    

    1.对y进行ONE-HOT处理

    train_y=convert_to_one_hot(train_y, len(classes1))
    test_y=convert_to_one_hot(test_y,len(classes1) )
    

    在这里插入图片描述

    (四)keras构建卷积框架

    Keras中文文档
    Tensorflow官网

    1.keras.models.Sequential()

    是一个容器,描述了神经网络的网络结构,在Sequential()中的输入参数描述了从输入层到输出层的网络结构。输入参数即可直接写在Sequential()中,也可通过add()添加。通常为了便于读懂代码,使用add()来添加参数

    import tensorflow as tf
    from tensorflow import keras
    model = keras.models.Sequential()   #描述各层网络  
    

    2.model.add()

    添加卷积层、池化层、全连接层

    (1)卷积层keras.layers.Conv2D

    卷积层过滤器的维度(高度,宽度,通道数,过滤器数)
    这里指定为(3,3,n_c,32),n_c与输入层的通道数相同

    model.add(keras.layers.Conv2D(filters=32,kernel_size=3,padding='same',activation='relu',input_shape=(64,64,3)))
        
        #filters: 卷积核(就是过滤器)的数目
        #kernel_size:过滤器的大小,即卷积核(过滤器)的高度和宽度,单个整数或由两个整数构成的list/tuple
        #strides: 卷积步长, 默认为 1
        #padding: 卷积如何处理边缘。补0策略,选项包括 ‘valid’ 和 ‘same’。默认为 ‘valid’。"valid"不填充
        #activation: 激活函数,通常设为 relu
        #input_shape: 指定输入层的高度,宽度和深度的元组(高度,宽度,通信数)
    

    (2)最大池化层keras.layers.MaxPool2D()

    最大池化层(2,2,n_c),n_c与输入层的通道数相同

    model.add(keras.layers.MaxPool2D(pool_size=32,padding='same'))
        #pool_size:用于指定池窗口的大小.2个整数的元组/列表:(pool_height,pool_width),可以是单个整数,以指定所有空间维度的值相同.
        #strides:用于指定池操作的步幅
        #padding:一个字符串,表示填充方法,“valid”或“same”.
        #data_format:一个字符串,表示输入维度的顺序.支持channels_last(默认)和channels_first;
    #channels_last对应于具有形状(batch, height, width, channels)的输入,而channels_first对应于具有形状(batch, channels, height, width)的输入.
        
    

    (3)卷积层keras.layers.Conv2D

    这里指定为(3,3,n_c,64),n_c与输入层的通道数相同

    model.add(keras.layers.Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
    

    (4)最大池化层keras.layers.MaxPool2D()

    最大池化层(2,2,n_c),n_c与输入层的通道数相同

    model.add(keras.layers.MaxPool2D(pool_size=2))
    
    

    (5)一维化keras.layers.Flatten()

    model.add(keras.layers.Flatten())
        #用于将输入层的数据压成一维的数据,一般用在卷积层和全连接层之间,因为全连接层只能接收一维数据,卷积层可以处理二维数据
        #(m,n_h,n_w,n_c)------( m, n_h*n_w*n_c) 
    

    (6)全连接层keras.layers.Dense()

     model.add(keras.layers.Dense(6,activation='softmax'))
        #输出大小:(batch_size, units)
    
    """
    keras.layers.Dense(units, activation=None, use_bias=True,kernel_initializer='glorot_uniform', bias_initializer='zeros',kernel_regularizer=None, bias_regularizer=None,  activity_regularizer=None, kernel_constraint=None, bias_constraint=None)
        #units: 正整数,输出空间维度。
        #activation:激活函数.如果不指定该参数,将不会使用任何激活函数(即使用线性激活函数:a(x)=x)
        #use_bias: 布尔值,该层是否使用偏置向量
        #kernel_initializer: kernel 权值矩阵的初始化器。
        #bias_initializer: 偏置向量的初始化器。
    """
    

    output = activation(dot(input, kernel) + bias)
    activation 是按逐个元素计算的激活函数
    kernel 是由网络层创建的权值矩阵
    bias 是其创建的偏置向量 (只在 use_bias 为 True 时才有用)。

    3.模型编译model.compile()

    model.compile()方法用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准

    model.compile(optimizer='Adam',
                      loss='mse',
                      metrics = ['categorical_accuracy'])
    

    4.model.summary()

    model.summary()输出模型各层的参数状况

     model.summary()
    

    5.model.fit()

    history = model.fit(x=X_train,y=Y_train,batch_size=64,epochs=num_epochs)
        # validation_split=0.0, #:浮点数0-1之间,用作验证集的训练数据的比例。模型将分出一部分不会被训练的验证数据,并将在每一轮结束时评估这些验证数据的误差和任何其他模型指标。
        #  validation_data=None, #这个参数会覆盖 validation_split,即两个函数只能存在一个,它的输入为元组 (x_val,y_val),这作为验证数据。
         #  shuffle=True, #布尔值。是否在每轮迭代之前混洗数据
    
        #batch_size:整数,每次梯度更新的样本数。未指定,默认为32
        #epochs:整数,训练模型迭代次数
        #verbose:日志展示,整数,0:为不在标准输出流输出日志信息;1:显示进度条;2:每个epoch输出一行记录
        
    

    6.model.evaluate()

    score = model.evaluate(x=X_test,y=Y_test)
    model.save('model.h5')
    #model.save()保存了模型的图结构和模型的参数,保存模型的后缀是.hdf5  
    

    综上代码为
    输入数据(m,64,64,3) → p a d d i n g = ′ s a m e ′ 卷 积 层 ( 3 , 3 , 3 , 32 ) \xrightarrow[padding='same']{卷积层(3,3,3,32)} (3,3,3,32) padding=same(m,64,64,32) → 池 化 层 ( 2 , 2 , 32 ) \xrightarrow{池化层(2,2,32)} (2,2,32) (m,32,32,32) → p a d d i n g = ′ s a m e ′ 卷 积 层 ( 3 , 3 , 32 , 64 ) \xrightarrow[padding='same']{卷积层(3,3,32,64)} (3,3,32,64) padding=same(m,32,32,64) → 池 化 层 ( 2 , 2 , 32 ) \xrightarrow{池化层(2,2,32)} (2,2,32) (m,16,16,64) → 一 维 化 \xrightarrow{一维化} (m,16*16*64) → 全 连 接 层 \xrightarrow{全连接层} (m,6)$

    model = keras.models.Sequential()   #描述各层网络
    
    
    #1.卷积层(3,3,n_c,32),n_c与输入层的通道数相同
    model.add(keras.layers.Conv2D(filters=32,kernel_size=3,padding='same',activation='relu',input_shape=(64,64,3)))
    
    
    #2.最大池化层(2,2,n_c),n_c与输入层的通道数相同
    model.add(keras.layers.MaxPool2D(pool_size=2))
    
    #3.卷积层(3,3,n_c,64)
    model.add(keras.layers.Conv2D(filters=64,kernel_size=3,padding='same',activation='relu'))
    
    #4.池化层(2,2,n_c)
    model.add(keras.layers.MaxPool2D(pool_size=2))
    
    #5.
    model.add(keras.layers.Flatten())
    #(m,n_h,n_w,n_c)------( m, n_h*n_w*n_c)
    
    #6.全连接层
    model.add(keras.layers.Dense(6,activation='softmax'))
    #输出大小:(batch_size, units)
    
    model.compile(optimizer='Adam',
                  loss='mse',
                  metrics = ['categorical_accuracy'])
    
    model.summary()
    
    
    history = model.fit(x=train_x,y=train_y,batch_size=64,epochs=100)
    
    score = model.evaluate(x=test_x,y=test_y)
    
    model.save('model.h5')
    #model.save()保存了模型的图结构和模型的参数,保存模型的后缀是.hdf5
    

    输出结果为
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    print('测试集损失值:',str(score[0]*100)[:4]+'%')
    print('测试集准确率:',str(score[1]*100)[:4]+'%')
    

    在这里插入图片描述

    在这里插入图片描述

    plt.plot(np.squeeze(history.history['loss']))
    plt.ylabel('loss')
    plt.xlabel('iterations (per tens)')
    plt.show()
    

    在这里插入图片描述

    展开全文
  • 文章目录一、计算机视觉(Computer Vision)二、边缘检测(Edge Detection)1. 边缘检测例子(Edge Detection Example)2. 更多边缘检测的例子(More Edge Detection)三... 单层卷积网络(One Layer of a Convolutiona


    《Convolutional Neural Networks》是Andrw Ng深度学习专项课程中的第四门课。这门课主要介绍卷积神经网络(CNN)的基本概念、模型和具体应用。该门课共有4周课时,所以分成4次笔记来总结,这是第一节笔记。

    一、计算机视觉(Computer Vision)

    计算机视觉(Computer Vision)的高速发展标志着新型应用产生的可能,例如自动驾驶、人脸识别、创造新的艺术风格。人们对于计算机视觉的研究也催生了很多机算机视觉与其他领域的交叉成果。一般的计算机视觉问题包括以下几类:

    • 图片分类(Image Classification)
    • 目标检测(Object detection)
    • 神经风格转换(Neural Style Transfer)

    下面展示了一个神经风格转换(Neural Style Transfer)的例子:
    在这里插入图片描述
    使用传统神经网络处理机器视觉的一个主要问题是输入层维度很大。 例如一张64x64x3的图片,神经网络输入层的维度为12288。如果图片尺寸较大,例如一张1000x1000x3的图片,神经网络输入层的维度将达到3百万,使得网络权重W非常庞大。这样会造成两个后果:①神经网络结构复杂,数据量相对不够,容易出现过拟合;②所需内存和计算量较大。

    因此,一般的神经网络很难处理蕴含着大量数据的图像。解决这一问题的方法就是使用卷积神经网络(CNN)。

    二、边缘检测(Edge Detection)

    我们之前提到过,神经网络由浅层到深层,分别可以检测出图片的边缘特征、局部特征(例如眼睛、鼻子等),到最后面的一层就可以根据前面检测的特征来识别整体面部轮廓。 这些工作都是依托卷积神经网络来实现的。在这里插入图片描述

    卷积运算(Convolutional Operation) 是卷积神经网络最基本的组成部分。我们以边缘检测为例,来解释卷积是怎样运算的。

    最常检测的图片边缘有两类:一是垂直边缘(vertical edges),二是水平边缘(horizontal edges)
    在这里插入图片描述

    1. 边缘检测例子(Edge Detection Example)

    图片的边缘检测可以通过与相应滤波器(filter)进行卷积来实现。 以垂直边缘检测为例,原始图片尺寸为6x6,滤波器filter尺寸为3x3,卷积后的图片尺寸为4x4,得到结果如下:
    在这里插入图片描述
    上图只显示了卷积后的第一个值和最后一个值。可以看到,卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。

    顺便提一下,表示卷积操作。在计算机中这个符号表示一般的乘法,而在不同的深度学习框架中,卷积操作的 API 定义可能不同:在python中,卷积用conv_forward()表示;tensorflow中,卷积用tf.nn.conv2d()表示;keras中,卷积用Conv2D()表示。

    Vertical edge detection能够检测图片的垂直方向边缘。下图对应一个垂直边缘检测的例子:
    在这里插入图片描述
    如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。

    2. 更多边缘检测的例子(More Edge Detection)

    图片边缘有两种渐变方式,一种是由明变暗,另一种是由暗变明。以垂直边缘检测为例,下图展示了两种方式的区别。实际应用中,这两种渐变方式并不影响边缘检测结果,可以对输出图片取绝对值操作,得到同样的结果。
    在这里插入图片描述
    垂直边缘检测和水平边缘检测的滤波器算子如下所示:
    在这里插入图片描述
    下图展示一个水平边缘检测的例子:
    在这里插入图片描述
    其他常用的滤波器还有 Sobel 滤波器Scharr 滤波器。它们增加了中间行的权重,以提高结果的稳健性。
    在这里插入图片描述
    上图展示的是垂直边缘检测算子,水平边缘检测算子只需将上图顺时针翻转90度即可。

    在深度学习中,如果我们想检测图片的各种边缘特征,而不仅限于垂直边缘和水平边缘,那么filter的数值一般需要通过模型训练得到,类似于标准神经网络中的权重W一样由梯度下降算法反复迭代求得。CNN的主要目的就是计算出这些filter的数值。 确定得到了这些filter后,CNN浅层网络也就实现了对图片所有边缘特征的检测。

    三、padding 与 Strided Convolutions

    1. padding

    假设输入图片的大小为 n × n n×n n×n,而滤波器的大小为 f × f f×f f×f,则卷积后的输出图片大小为 ( n − f + 1 ) × ( n − f + 1 ) (n−f+1)×(n−f+1) (nf+1)×(nf+1)

    这样就会有两个问题:①每次卷积运算后,输出图片的尺寸缩小;②原始图片的角落、边缘区像素点在输出中采用较少,输出图片丢失边缘位置的很多信息。

    为了解决这些问题,可以在进行卷积操作前,对原始图片在边界上进行填充(Padding),以增加矩阵的大小。通常将 0 作为填充值。
    在这里插入图片描述
    经过padding之后,原始图片尺寸为 ( n + 2 p ) × ( n + 2 p ) (n+2p) × (n+2p) (n+2p)×(n+2p),filter尺寸为 f × f f × f f×f,则卷积后的图片尺寸为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1) × (n+2p-f+1) (n+2pf+1)×(n+2pf+1)。若要保证卷积前后图片尺寸不变,则p应满足: p = p= p= f − 1 2 {f-1}\over2 2f1

    因此,在进行卷积运算时,我们有两种选择:

    • Valid卷积: 不填充,直接卷积。即 p = 0 p=0 p=0,结果大小为 ( n − f + 1 ) × ( n − f + 1 ) (n−f+1)×(n−f+1) (nf+1)×(nf+1)
    • Same卷积: 进行填充,并使得卷积后结果大小与输入一致,这样 p = p= p= f − 1 2 {f-1}\over2 2f1

    在计算机视觉领域, f f f 通常为奇数。原因包括Same卷积中 p = p= p= f − 1 2 {f-1}\over2 2f1 能得到自然数结果,并且滤波器有一个便于表示其所在位置的中心点。

    2. 卷积步长(Strided Convolutions)

    Stride表示filter在原图片中水平方向和垂直方向每次的步进长度。之前我们默认stride=1。若stride=2,则表示filter每次步进长度为2,即隔一点移动一次。
    在这里插入图片描述
    设步长为 s s s,填充长度为 p p p,输入图片大小为 n × n n×n n×n,滤波器大小为 f × f f×f f×f,则卷积后图片的尺寸为:
    在这里插入图片描述
    注意公式中有一个向下取整(取比自己小的最大正整数)的符号,用于处理商不为整数的情况。向下取整反映着当取原始矩阵的图示蓝框完全包括在图像内部时,才对它进行运算。

    值得一提的是,互相关(cross-correlations)卷积(convolutions) 之间是有区别的。实际上,真正的卷积运算会先将filter绕其中心旋转180度,然后再将旋转后的filter在原始图片上进行滑动计算。 filter旋转如下所示:
    在这里插入图片描述
    其实,目前为止我们介绍的CNN卷积实际上计算的是相关系数,而不是数学意义上的卷积。但是,为了简化计算,我们一般把CNN中的这种“相关系数”就称作卷积运算。之所以可以这么等效,是因为滤波器算子一般是水平或垂直对称的,180度旋转影响不大; 而且最终滤波器算子需要通过CNN网络梯度下降算法计算得到,旋转部分可以看作是包含在CNN模型算法中。总的来说,忽略旋转运算可以大大提高CNN网络运算速度,而且不影响模型性能。

    卷积运算服从结合律: ( A ∗ B ) ∗ C = A ∗ ( B ∗ C ) (A ∗ B) ∗ C = A ∗ (B ∗ C) (AB)C=A(BC)

    四、高维卷积(Convolutions Over Volume)

    对于3通道的RGB图片,其对应的滤波器算子同样也是3通道的。过程是将每个单通道(R,G,B)与对应的滤波器进行卷积运算求和,然后再将三个通道的和相加,将 27 个乘积的和作为输出图片的一个像素值。例如一个图片是6 x 6 x 3,分别表示图片的高度(height)、宽度(weight)和通道(#channel)。
    在这里插入图片描述
    不同通道的滤波器可以不相同。例如只检测 R 通道的垂直边缘,G 通道和 B 通道不进行边缘检测,则 G 通道和 B 通道的滤波器全部置零。当输入有特定的高、宽和通道数时,滤波器可以有不同的高和宽,但通道数必须和输入一致。

    如果想同时检测垂直和水平边缘,或者更多的边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。
    在这里插入图片描述
    若输入图片的尺寸为 n × n × n c n × n × n_c n×n×nc,filter的尺寸为 f × f × n c f × f × n_c f×f×nc,则卷积后的图片尺寸为 ( n − f + 1 ) × ( n − f + 1 ) × n c ′ (n-f+1) × (n-f+1) × n_c' (nf+1)×(nf+1)×nc。其中, n c n_c nc为图片通道数目, n c ′ n_c' nc滤波器组的个数

    1. 单层卷积网络(One Layer of a Convolutional Network)

    卷积神经网络的单层结构如下所示:
    在这里插入图片描述
    相比之前的卷积过程,CNN的单层结构多了激活函数ReLU和偏移量b。 整个过程与标准的神经网络单层结构非常类似:
    在这里插入图片描述
    相比之前的卷积过程,滤波器的数值对应着权重 W W W [ l ] [l] [l],卷积运算对应着 W W W [ l ] [l] [l] A A A [ l − 1 ] [l-1] [l1]的乘积运算,所选的激活函数变为 R e L U ReLU ReLU

    我们来计算一下上图中参数的数目:每个滤波器组有3x3x3=27个参数,还有1个偏移量b,则每个滤波器组有27+1=28个参数,两个滤波器组总共包含28x2=56个参数。我们发现,选定滤波器组后,参数数目与输入图片尺寸无关。所以,就不存在由于图片尺寸过大,造成参数过多的情况。 例如一张1000x1000x3的图片,标准神经网络输入层的维度将达到3百万,而在CNN中,参数数目只由滤波器组决定,数目相对来说要少得多,这是CNN的优势之一。

    最后,我们总结一下CNN单层结构的所有标记符号,设层数为 l l l

    • f f f [ l ] [l] [l]:滤波器的高(或宽)
    • p p p [ l ] [l] [l]:填充长度
    • s s s [ l ] [l] [l]:步长
    • n c n_c nc [ l ] [l] [l]:滤波器组的数量

    在这里插入图片描述
    其中,
    在这里插入图片描述
    如果有m个样本,进行向量化运算,相应的输出维度为:
    在这里插入图片描述

    2. 简单卷积网络(Simple Convolutional Network Example)

    下面介绍一个简单的CNN网络模型:
    在这里插入图片描述
    该CNN模型各层结构如上图所示。需要注意的是, a a a [ 3 ] [3] [3]的维度是7 x 7 x 40,将 a a a [ 3 ] [3] [3]排列成1列,维度为1960 x 1,然后连接最后一级输出层。输出层可以是一个神经元,即二元分类(logistic);也可以是多个神经元,即多元分类(softmax)。最后得到预测输出。

    随着神经网络计算深度不断加深,图片的高度和宽度一般都是逐渐减小,而通道数是不断增加的。

    五、池化层

    一个典型的卷积神经网络通常包含有三种层:卷积层(Convolution layer)、池化层(Pooling layer)、全连接层(Fully Connected layer)。仅用卷积层也有可能构建出很好的神经网络,但大部分神经网络还是会添加池化层和全连接层,它们更容易设计。

    池化层的作用是缩减模型的大小,提高计算速度,同时减小噪声提高所提取特征的稳健性。

    1. 最大池化(Max Pooling)

    采用较多的一种池化过程叫做最大池化(Max Pooling)。将输入拆分成不同的区域,输出的每个元素都是对应区域中元素的最大值,如下图所示:
    在这里插入图片描述
    池化过程类似于卷积过程,上图所示的池化过程中相当于使用了一个大小 f = 2 f=2 f=2的滤波器,且池化步长 s = 2 s=2 s=2。卷积过程中的几个计算大小的公式也都适用于池化过程。如果有多个通道,那么就对每个通道分别执行计算过程。

    对最大池化的一种直观解释是,元素值较大可能意味着池化过程之前的卷积过程提取到了某些特定的特征,池化过程中的最大化操作使得只要在一个区域内提取到某个特征,它都会保留在最大池化的输出中。但是,没有足够的证据证明这种直观解释的正确性,而最大池化被使用的主要原因是它在很多实验中的效果都很好。

    2. 平均池化(Average Pooling)

    另一种池化过程是平均池化(Average Pooling),就是从取某个区域的最大值改为求这个区域的平均值:
    在这里插入图片描述
    池化过程的特点之一是,它有一组超参数,但是并没有参数需要学习。池化过程的超参数包括滤波器的大小 f f f、步长 s s s,以及选用最大池化还是平均池化。而填充 p p p则很少用到。

    池化过程的输入维度为: n H × n W × n c n_H × n_W × n_c nH×nW×nc

    输出维度为:
    在这里插入图片描述

    六、卷积神经网络示例(CNN Example)

    下面介绍一个简单的数字识别的CNN例子:
    在这里插入图片描述
    图中,CON层后面紧接一个POOL层,CONV1和POOL1构成第一层,CONV2和POOL2构成第二层。特别注意的是FC3和FC4为全连接层FC,它跟标准的神经网络结构一致。最后的输出层(softmax)由10个神经元构成。

    整个网络各层的尺寸和参数如下表格所示:
    在这里插入图片描述

    1. 使用卷积的原因(Why Convolutions)

    相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:

    • 参数共享(Parameter sharing): 特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
    • 稀疏连接(Sparsity of connections): 在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。

    池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。

    由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。 并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。

    参考文档:吴恩达深度学习笔记

    展开全文
  • 吴恩达卷积神经网络学习笔记【第二周 深度卷积神经网络】 目录 吴恩达卷积神经网络学习笔记【第二周 深度卷积神经网络】 2.1实例探究 2.2 经典网络 LeNet AlexNet VGG-16 VGG-19 2.3残差网络 2.1实例探究 ...
  • 文章目录1.1 计算机视觉1.2 边缘检测示例1.3 更多的边缘检测内容1.4 padding1.5 卷积步长 strided convolution1.6 三维卷积1.7 单层神经网络1.8 简单卷积网络示例1.9 池化层1.10 卷积神经网络示例1.11 为什么使用...
  • 吴恩达CNN卷积神经网络第二周作业Keras Tutorial.rar
  • 吴恩达卷积神经网络——学习笔记(三)1. 目标定位 (Object Localization)1.1 基本概念1.2 标签定义1.3 损失函数2. 目标检测 (Object Detection) 视频课程链接: https://www.bilibili.com/video/BV1FT4y1E74V? 笔记...
  • 吴恩达卷积神经网络3:目标检测 吴恩达卷积神经网络3:目标检测 3.1 目标定位(Object localization) 目标定位: 标签的定义: 损失函数: 3.2 特征点检测(landmark detection) 3.3 目标检测(object ...
  • 吴恩达卷积神经网络——学习笔记(二)1. 边缘检测示例 (Edge Detection Example) 视频课程链接: https://www.bilibili.com/video/BV1FT4y1E74V? 笔记参考链接: ...1. 边缘检测示例 (Edge Detection Example) ...
  • 下图是VGG-16神经网络的结构:每经过一次卷积和池化后图像大小减半,通道数加倍。 优点:简化了神经网络。 缺点:需要训练的特征数量非常巨大。(16是指在这个网络包含16个卷积层和全连接层) 其结构都是几个卷...
  • 卷积神经网络从浅层到深层所获取的图片信息: 浅层只能获取一些简单的特征,如边缘和颜色等。随着层数的增加,逐渐获取更加复杂的特征。 神经网络迁移:由内容图片C和风格图片S,生成风格迁移图片G 神经风格迁移...
  • 3.4通过滑动窗口实现卷积 为了构建滑动窗口的卷积应用,先要将之前神经网络中的全连接层转化为卷积层。... B站视频来源:【中英字幕】吴恩达深度学习课程第四课 — 卷积神经网络_哔哩哔哩_bilibili
  • 如果在Tensorflow中构建一个自己的神经网络,框架会自动进行后向传播,所以只需要搭建好前向传播的部分,这里面维度必须对应好,其他的调用函数就行,现在总结一下维度问题。 从最简单的说:如下图,X是一个全是...
  • 文章目录Week 1 卷积神经网络基础4.1.1 计算机视觉(Computer vision)4.1.2 边缘检测示例(Edge detection example)4.1.3 更多边缘检测内容(More edge detection)4.1.4 Padding3.1.5 卷积步长(Strided ...
  • 卷积神经网络(一) 1.1 计算机视觉 卷积神经网络一般应用于计算机视觉领域,由于有的时候图片的像素点很多,导致神经网络输入特征值的维数很多。 1.2 边缘检测示例 如下图所示,原图是一个661的矩阵,卷积核是一个...
  • 选择A,P,N: 最好不要用随机,而是用人为的方式挑选,更不像的正例和很像的反例,然后这样神经网络会学习的更好 4.5、Face verification and binary classification 不同于上一节的处理方法,人脸识别问题可抽象...
  • 输入10001000的彩色图像,则需要输入的数据量为100010003 =3M,这意味着特征向量X的维度高达3M ,如果在第一隐藏层有1000个神经元,使用标准全连接,那么权值矩阵中将会有10003M=3B的参数。参数量过于庞大,难以获得...
  • 卷积神经网络:Step by Step 1 - 导入相关包 2 - 作业大纲 3 - 卷积神经网络 3.1 - 零填充 3.2 - 单步卷积 3.3 - 卷积神经网络-前向传播 4 - 池化层(Pooling Layer) 4.1 - 前向池化 5 - 卷积神经网络的反向传播(可...
  • 最近学习了吴恩达老师讲的卷积神经网络课程,随手记录了一些笔记,这里发布出来,希望对学习的小伙伴有帮助!若有不当之处,还望大家指正。 1.我们在搭建CNN时候,在前向传播的过程中,我们会存储一些值,以便在反向...
  • [2] 【中英字幕】吴恩达深度学习课程第四课 — 卷积神经网络_哔哩哔哩_bilibili [3] 深度学习笔记-目录 (ai-start.com)——深度学习笔记 (ai-start.com) 1为什么要进行实例探究?(Why look at case studies?) ...
  • 卷积神经网络由此产生边缘检测的例子 可以设计一些专用的filter来提取图片的纵向边缘和横向边缘 - vertical edges horizontal edges 这些专用的filters是计算机视觉专家精心设计出来的,往往可以提取一些...
  • 这门课主要介绍卷积神经网络(CNN)的基本概念、模型和具体应用。该门课共有4周课时,所以我将分成4次笔记来总结,这是第一节笔记。 ### 1. Computer Vision 机器视觉(Computer Vision)是深度学习应用的主要...
  • 吴恩达深度学习 | (17) 卷积神经网络专项课程第一周编程作业-附件资源

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,197
精华内容 2,078
关键字:

吴恩达卷积神经网络