吴恩达深度学习笔记- lesson4 卷积神经网络

文章目录

      • Week 1 卷积神经网络基础
        • 4.1.1 计算机视觉(Computer vision)
        • 4.1.2 边缘检测示例(Edge detection example)
        • 4.1.3 更多边缘检测内容(More edge detection)
        • 4.1.4 Padding
        • 3.1.5 卷积步长(Strided convolutions)
        • 4.1.6 三维卷积(Convolutions over volumes)
        • 4.1.7 单层卷积网络(One layer of a convolutional network)
        • 4.1.8 简单卷积网络示例(A simple convolution network example)
        • 4.1.9 池化层(Pooling layers)
        • 4.1.10 卷积神经网络示例(Convolutional neural network example)
        • 4.1.11 为什么使用卷积?(Why convolutions?)
      • Week 2 深度卷积网络:实例探究(Deep convolutional models: case studies)
        • 4.2.1 为什么要进行实例探究?(Why look at case studies?)
        • 4.2.2 经典网络(Classic networks)
        • 4.2.3 残差网络(Residual Networks (ResNets))
        • 4.2.4 残差网络为什么有用?(Why ResNets work?)
        • 4.2.5 网络中的网络以及 1×1 卷积(Network in Network and 1×1 convolutions)
        • 4.2.6 谷歌 Inception 网络简介(Inception network motivation)
        • 4.2.7 Inception 网络(Inception network)
        • 4.2.8 使用开源的实现方案(Using open-source implementations)
        • 4.2.9 迁移学习(Transfer Learning)
        • 4.2.10 数据增强(Data augmentation)
        • 4.2.11 计算机视觉现状(The state of computer vision)
      • Week 3 目标检测(Object detection)
        • 4.3.1 目标定位(Object localization)
        • 4.3.2 特征点检测(Landmark detection)
        • 4.3.3 目标检测(Object detection)
        • 4.3.4 滑动窗口的卷积实现(Convolutional implementation of sliding windows)
        • 4.3.5 Bounding Box预测(Bounding box predictions)
        • 4.3.6 交并比(Intersection over union)
        • 4.3.7 非极大值抑制(Non-max suppression)
        • 4.3.8 Anchor Boxes(锚框)
        • 4.3.9 合起来:YOLO 算法(Putting it together: YOLO algorithm)
        • 4.3.10 候选区域(选修)(Region proposals (Optional))
      • Week 4 特殊应用:人脸识别和神经风格转换(Special applications: Face recognition &Neural style transfer)
        • 4.4.1 什么是人脸识别?(What is face recognition?)
        • 4.4.2 One-Shot学习(One-shot learning)
        • 4.4.3 Siamese 网络(Siamese network)
        • 4.4.4 三元组损失(Triplet loss)
        • 4.4.5 人脸验证与二分类(Face verification and binary classification)
        • 4.4.6 什么是神经风格迁移?(What is neural style transfer?)
        • 4.4.7 CNN特征可视化(What are deep ConvNets learning?)
        • 4.4.8 代价函数(Cost function)
        • 4.4.9 内容代价函数(Content cost function)
        • 4.4.10 风格代价函数(Style cost function)
        • 4.4.11 一维到三维推广(1D and 3D generalizations of models)

Week 1 卷积神经网络基础

4.1.1 计算机视觉(Computer vision)

计算机视觉的一个挑战:数据的输入可能会非常大,难以获得足够的数据来防止神经网络发生过拟合和竞争需求,巨大的内存需求让人不太能接受。

解决方案:卷积计算

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

过滤器(或称为核):类似 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\end{bmatrix} 111000111的矩阵,与输入进行卷积(*)运算(与乘法符号相同,意义不同,此处是一个重载符号)

卷积运算后右边的图片我们可以理解为另一张图片

卷积运算的实现:如conv_forward函数。如果在tensorflow下,这个函数叫tf.conv2d。在Keras这个框架下用Conv2D实现卷积运算。所有的编程框架都有一些函数来实现卷积运算。

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

在上文 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & -1\\ 1 & 0 & -1\\ 1 & 0 & -1\end{bmatrix} 111000111过滤器中:若运算后值为正数,则原图该值对应的部分过渡是由亮到暗(从左往右)

注:如果你不在乎这两者的区别,你可以取出矩阵的绝对值

其他过滤器:

  • 水平边缘检测: [ 1 1 1 0 0 0 − 1 − 1 − 1 ] \begin{bmatrix}1 & 1 & 1\\ 0 & 0 & 0\\ -1 & -1 & -1\end{bmatrix} 101101101

  • Sobel的过滤器: [ 1 0 − 1 2 0 − 2 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 2 & 0 & - 2 \\ 1 & 0 & - 1 \\\end{bmatrix} 121000121(可提高结果的鲁棒性)

  • Scharr过滤器: [ 3 0 − 3 10 0 − 10 3 0 − 3 ] \begin{bmatrix} 3& 0 & - 3 \\ 10 & 0 & - 10 \\ 3 & 0 & - 3 \\\end{bmatrix} 31030003103(垂直边缘检测)

把这矩阵中的9个数字当成9个参数,使用反向传播算法以理解这9个参数。让神经网络自动去学习它们,神经网络可以学习一些低级的特征,例如边缘的特征

4.1.4 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意义:

  • 防止图像变小

  • 防止边缘信息丢失

如果 p p p是填充的数量,输出则为 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1)×(n+2p-f+1) (n+2pf+1)×(n+2pf+1)

习惯上,一般用0去填充

  • Valid卷积:无填充

  • Same卷积:填充后输出大小和输入大小保持一致(可求解 n + 2 p − f + 1 = n n+2p-f+1=n n+2pf+1=n得到 p p p值)

计算机视觉中, f f f通常是奇数,甚至可能都是这样,原因:

  • 如果 f f f​是一个偶数,那么你只能使用一些不对称填充(因为 p = f − 1 2 p = \frac{{f - 1}}{2} p=2f1
  • 一个奇数维过滤器有一个中心点

3.1.5 卷积步长(Strided convolutions)

输出的维度: ( ⌊ n H + 2 p − f s + 1 ⌋ , ⌊ n W + 2 p − f s + 1 ⌋ ) (⌊\frac{{{n_H} + 2p - f}}{s} + 1⌋,⌊\frac{{{n_W} + 2p - f}}{s} + 1⌋) (snH+2pf+1,snW+2pf+1) s s s为步长)

⌊ x ⌋ ⌊x⌋ x是向下取整的符号,这也叫做对 x x x进行地板除(floor),这意味着 x x x向下取整到最近的整数

互相关(cross-correlation)与卷积(convolution):

严格来说,深度学习中的”卷积运算“实质上是指互相关,真正的卷积运算需要先将过滤器上下、左右分别翻转一次,如:
[ 1 0 0 0 0 0 0 0 2 ] \begin{bmatrix}1 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 2 \\\end{bmatrix} 100000002 -> [ 0 0 1 0 0 0 2 0 0 ] \begin{bmatrix}0 & 0 & 1 \\ 0 & 0 & 0 \\ 2 & 0 & 0 \\\end{bmatrix} 002000100-> [ 2 0 0 0 0 0 0 0 1 ] \begin{bmatrix}2 & 0 & 0 \\ 0 & 0 & 0 \\ 0 & 0 & 1 \\\end{bmatrix} 200000001

4.1.6 三维卷积(Convolutions over volumes)

三维卷积后的输出是二维的

图示:

吴恩达深度学习笔记- lesson4 卷积神经网络_第1张图片

  • 如果你想检测图像红色通道的边缘,那么你可以将第一个过滤器设为 [ 1 0 − 1 1 0 − 1 1 0 − 1 ] \begin{bmatrix}1 & 0 & - 1 \\ 1 & 0 & - 1 \\ 1 & 0 & - 1 \\\end{bmatrix} 111000111,而绿色通道全为 0 0 0 [ 0 0 0 0 0 0 0 0 0 ] \begin{bmatrix} 0& 0 & 0 \\ 0 &0 & 0 \\ 0 & 0 & 0 \\\end{bmatrix} 000000000,蓝色也全为 0 0 0,不关心颜色则可全部设置为非 0 0 0

按照惯例,当输入有特定的高宽和通道数时,过滤器可以有不同的高,不同的宽,但是必须有一样的通道数。

同时用多个过滤器:分别处理,最后逐层堆叠。层数即为提取的特征数。

4.1.7 单层卷积网络(One layer of a convolutional network)

z [ 1 ] = W [ 1 ] a [ 0 ] + b [ 1 ] z^{[1]} = W^{[1]}a^{[0]} + b^{[1]} z[1]=W[1]a[0]+b[1] W W W即为过滤器, a [ 0 ] a^{[0]} a[0]即为输入, a [ 1 ] a^{[1]} a[1](举例)为 Relu ⁡ ( z [ 1 ] + b ) \operatorname{Relu} \left( {{z^{[1]}} + b} \right) Relu(z[1]+b)= Relu ⁡ ( [ 0 10 0 0 10 0 0 10 0 ] + b ) \operatorname{Relu} \left( {\begin{bmatrix}0 & 10 & 0\\ 0 & 10 & 0\\ 0 & 10 & 0\end{bmatrix} + b} \right) Relu000101010000+b

实际情况下: a [ 1 ] a^{[1]} a[1]可能为多层

避免过拟合:图片很大,参数却很少,这是卷积神经网络的一个特征

高、宽、通道数: n H {n_H} nH n W {n_W} nW n c {n_c} nc

4.1.8 简单卷积网络示例(A simple convolution network example)

构成:多层卷积层 → \to 平滑处理 → \to logistic回归单元或softmax回归单元 → \to y ^ \hat y y^

趋势: n H {n_H} nH n W {n_W} nW逐渐变小, n c {n_c} nc逐渐变大

一个典型的卷积神经网络通常有三层,一个是卷积层,我们常常用CONV来标注。还有两种常见类型的层,一个是池化层(POOL)。最后一个是全连接层,用FC表示。

4.1.9 池化层(Pooling layers)

意义:缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性

树池、平均池化、最大池化。同样有 f f f s s s参数,执行过程类似卷积,输出大小为 ( ⌊ n H + 2 p − f s + 1 ⌋ , ⌊ n W + 2 p − f s + 1 ⌋ , c ) (⌊\frac{{{n_H} + 2p - f}}{s} + 1⌋,⌊\frac{{{n_W} + 2p - f}}{s} + 1⌋,c) (snH+2pf+1,snW+2pf+1,c)

最大池化的直观理解:将对应区域提取到的特征保留,值大则说明提取到了相应特征

常用的参数值为 f = 2 f=2 f=2 s = 2 s=2 s=2,一般用最大池化

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

层的划分:一类卷积是一个卷积层和一个池化层一起作为一层(以此为准);另一类卷积是把卷积层作为一层,而池化层单独作为一层。

标记:Layer1、CONV1、POOL1、FC3等

全连接层类似单层神经网络,所有神经元与上层神经元相互连接

卷积神经网络示例:

在这里插入图片描述

特征:池化层和最大池化层没有参数;第二卷积层的参数相对较少,其实许多参数都存在于神经网络的全连接层。观察可发现,随着神经网络的加深,激活值尺寸会逐渐变小,如果激活值尺寸下降太快,也会影响神经网络性能。

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

和只用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接,从而减少参数,以便用更小的训练集来训练,从而预防过度拟合

  • 参数共享:特征检测如垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。

  • 稀疏连接:输出中的一个值只与对应的 f × f f\times f f×f单元格相关,与其他值无关

Week 2 深度卷积网络:实例探究(Deep convolutional models: case studies)

4.2.1 为什么要进行实例探究?(Why look at case studies?)

在计算机视觉任务中表现良好的神经网络框架往往也适用于其它任务

经典网络:

  • LeNet-5
  • AlexNet
  • VGG

4.2.2 经典网络(Classic networks)

LeNet-5吴恩达深度学习笔记- lesson4 卷积神经网络_第2张图片

作用:识别灰度图像(如手写识别)

AlexNet吴恩达深度学习笔记- lesson4 卷积神经网络_第3张图片

VGG-16吴恩达深度学习笔记- lesson4 卷积神经网络_第4张图片

原则简单、特征数量巨大

4.2.3 残差网络(Residual Networks (ResNets))

非常深的神经网络是很难训练的,因为存在梯度消失和梯度爆炸问题。跳跃连接Skip connection)可以从某一层网络层获取激活,然后迅速反馈给另外一层,

残差块Residual block):将 a [ l ] a^{[l]} a[l]直接向后,拷贝到神经网络的深层,在ReLU非线性激活函数前加上 a [ l ] a^{[l]} a[l]。等式 a [ l + 2 ] = g ( z [ l + 2 ] ) a^{\left\lbrack l + 2 \right\rbrack} = g(z^{\left\lbrack l + 2 \right\rbrack}) a[l+2]=g(z[l+2])去掉了,取而代之的是另一个ReLU非线性函数,仍然对 z [ l + 2 ] z^{\left\lbrack l + 2 \right\rbrack} z[l+2]进行 g g g函数处理,但这次要加上 a [ l ] a^{[l]} a[l],即:   a [ l + 2 ] = g ( z [ l + 2 ] + a [ l ] ) \ a^{\left\lbrack l + 2 \right\rbrack} = g\left(z^{\left\lbrack l + 2 \right\rbrack} + a^{[l]}\right)  a[l+2]=g(z[l+2]+a[l])。跨越的这几层构成一个残差块。

对于一个普通网络来说,深度越深意味着用优化算法越难训练。实际上,随着网络深度的加深,训练错误会越来越多。

吴恩达深度学习笔记- lesson4 卷积神经网络_第5张图片

跳跃连接:指 a [ l ] a^{[l]} a[l]跳过一层或者好几层,从而将信息传递到神经网络的更深层

4.2.4 残差网络为什么有用?(Why ResNets work?)

残差块学习恒等函数非常容易,能确定网络性能不会受到影响,很多时候甚至可以提高效率

能实现跳跃连接的前提:same卷积保留了维度。若维度不一致,再增加一个矩阵,这里标记为 W s W_{s} Ws,其维度为跳转后维度$ \times 跳 转 前 维 度 。 这 个 新 增 项 是 256 维 度 的 向 量 。 你 不 需 要 对 跳转前维度。这个新增项是256维度的向量。你不需要对 256W_{s}$做任何操作,它是网络通过学习得到的矩阵或参数,它是一个固定矩阵,padding值为0。

4.2.5 网络中的网络以及 1×1 卷积(Network in Network and 1×1 convolutions)

对于单通道图片而言, 1 × 1 1 \times 1 1×1卷积效果不佳。

吴恩达深度学习笔记- lesson4 卷积神经网络_第6张图片

意义:压缩通道数量并减少计算

例:一个28×28×192的输入层,可以使用池化层压缩它的高度和宽度,但如果通道数量很大,可以用32个大小为1×1×192维的过滤器,输出层为28×28×32,从而压缩通道数( n c n_{c} nc

4.2.6 谷歌 Inception 网络简介(Inception network motivation)

Inception网络的作用:代替决定过滤器大小、是否需要创建卷积层或池化层等

实现:得到一些不同的输出结果,把它堆积起来

吴恩达深度学习笔记- lesson4 卷积神经网络_第7张图片

瓶颈层:通常是网络中最小的部分(如某一层的 n c {n_c} nc比其前后都更小)。只要合理构建瓶颈层,你既可以显著缩小表示层规模,又不会降低网络性能

4.2.7 Inception 网络(Inception network)

为了能在最后将这些输出都连接起来,必要时可会使用same类型的padding来池化,使得输出的高和宽保持一致。当有过多通道时可再加上一个1×1的卷积层,将通道的数量缩小。

Inception模块Inception网络

Inception网络的分支:确保了即便是隐藏单元和中间层也参与了特征计算,它们也能预测图片的分类。它在Inception网络中,起到一种调整的效果,并且能防止网络发生过拟合。

吴恩达深度学习笔记- lesson4 卷积神经网络_第8张图片

4.2.8 使用开源的实现方案(Using open-source implementations)

“一个常见的工作流程是,先选择一个你喜欢的架构,或许是你在这门课中学习到的,或者是你从朋友那听说的,或者是从文献中看到的,接着寻找一个开源实现,从GitHub下载下来,以此基础开始构建。这样做的优点在于,这些网络通常都需要很长的时间来训练,而或许有人已经使用多个GPU,通过庞大的数据集预先训练了这些网络,这样一来你就可以使用这些网络进行迁移学习。” ——吴恩达

4.2.9 迁移学习(Transfer Learning)

迁移学习的概念见笔记3.2.7

冻结:把某些层看作是冻结的,冻结网络中这些层的参数,设置方法如trainableParameter=0freeze=1

一个技巧:将前面冻结的层视作一个函数(softmax层之前的所有层视为一个固定映射),输入图像 X X X,然后计算它的某个特征向量或激活值并保存在硬盘中,这样训练的就是一个很浅的softmax模型,这样就不需要每次遍历训练集再重新计算这个激活值了

数据集较大:取后面几层的权重,用作初始化,然后从这里开始梯度下降;或者直接去掉这几层,换成自己的隐藏单元和自己的softmax输出层

4.2.10 数据增强(Data augmentation)

概念、基本操作见之前笔记

彩色转换:给RGB三个通道上加上不同的失真值

PCA(主成分分析):具体颜色改变的细节在AlexNet的论文中有时候被称作PCA颜色增强,PCA颜色增强的大概含义是,如果图片呈现紫色,即主要含有红色和蓝色,绿色很少,然后PCA颜色增强算法就会对红色和蓝色增减很多,绿色变化相对少一点,使总体的颜色保持一致。

数据集极大时:CPU线程持续加载数据,然后实现任意失真变形,从而构成批数据或者最小批数据,这些数据持续的传输给其他线程或者其他的进程,然后开始训练,可以在CPU或者GPU上实现训练一个大型网络的训练

4.2.11 计算机视觉现状(The state of computer vision)

数据不足:更优的架构、手工处理

提高Benchmark 基准测试的小技巧(对实际应用提升不大):

  • 独立训练几个神经网络,并平均它们的输出

  • Multi-crop at test time:将数据扩充应用到你的测试图像中

    • 10-crop:图像正向及镜像分别取中心、四角用分类器判断

Week 3 目标检测(Object detection)

4.3.1 目标定位(Object localization)

两个任务:识别和定位

输出: y =   [ p c b x b y b h b w c 1 c 2 c 3 ] y= \ \begin{bmatrix} p_{c} \\ b_{x} \\ b_{y} \\ b_{h} \\ b_{w} \\ c_{1} \\ c_{2}\\ c_{3} \\\end{bmatrix} y= pcbxbybhbwc1c2c3

这是一个向量,第一个组件 p c p_{c} pc表示是否含有对象,有则 p c = 1 p_{c}= 1 pc=1,无则 p c = 0 {p_c}= 0 pc=0。物体位置中心为 ( b x , b y ) (b_{x},b_{y}) (bx,by),高度为 b h {b_h} bh,宽度为 b w {b_w} bw c 1 {c_1} c1 c 2 {c_2} c2 c 3 {c_3} c3…表示物体的分类, p c = 0 p_{c} =0 pc=0时, y y y的其它参数无意义,即KaTeX parse error: Unknown column alignment: * at position 29: …{\begin{array}{*̲{20}{c}} 0 \\ …

神经网络的损失函数:
L ( y ^ , y ) = ( y 1 ^ − y 1 ) 2 + ( y 2 ^ − y 2 ) 2 + … + ( y n ^ − y n ) 2 L\left(\hat{y},y \right) = \left( \hat{y_1} - y_{1} \right)^{2} + \left(\hat{y_2} - y_{2}\right)^{2} + \ldots+\left( \hat{y_{n}} - y_{n}\right)^{2} L(y^,y)=(y1^y1)2+(y2^y2)2++(yn^yn)2

  • y 1 = 0 y_{1} = 0 y1=0,也就是 p c = 0 p_{c} = 0 pc=0,损失值是 ( y 1 ^ − y 1 ) 2 \left(\hat{y_1} - y_{1}\right)^{2} (y1^y1)2

  • y 1 = 1 y_{1} = 1 y1=1,所以 p c = y 1 = 1 p_{c}=y_{1}=1 pc=y1=1,损失值为 0 + ( y 2 ^ − y 2 ) 2 + … + ( y n ^ − y n ) 2 0+\left(\hat{y_2} - y_{2}\right)^{2} + \ldots+\left( \hat{y_{n}} - y_{n}\right)^{2} 0+(y2^y2)2++(yn^yn)2

4.3.2 特征点检测(Landmark detection)

检测特征点:设置第一个特征点( l 1 x l_{1x} l1x l 1 y l_{1y} l1y),第二个特征点( l 2 x l_{2x} l2x l 2 y l_{2y} l2y)……

作用:如定义脸部轮廓、下颌轮廓、判断表情、判断情绪、判断人体动作等

输出:KaTeX parse error: Unknown column alignment: * at position 27: …{\begin{array}{*̲{20}{c}} {\b…

注:所以标签在所有图片中必须保持一致,比如特征点1始终是右眼的外眼角,特征点2是右眼的内眼角等。

4.3.3 目标检测(Object detection)

基于滑动窗口的目标检测算法:首先创建一个标签训练集,其中都是裁剪好的,只包含目标物体的图片,用于训练物体识别

然后按一定大小、步长滑动窗口,不论物体在图片的什么位置,总有一个窗口可以检测到它。

缺点:计算成本高

4.3.4 滑动窗口的卷积实现(Convolutional implementation of sliding windows)

把神经网络的全连接层转化成卷积层:(示例)

吴恩达深度学习笔记- lesson4 卷积神经网络_第9张图片

当输入测试图片 ( m × m ) (m \times m) (m×m)后,以训练集分辨率 ( n × n ) (n \times n) (n×n)为窗口,步骤中过滤器等照旧,输出结果中一个单元格即对应一个窗口的结果,相当于以大小为池化层宽度(上图为 2 2 2)的步幅在原始图片上应用神经网络

  • 原理:重复区域可共享计算,不需要把输入图像分割成四个子集,分别执行前向传播

  • 缺点:边界框位置可能不够准确

4.3.5 Bounding Box预测(Bounding box predictions)

输出更精确边框:YOLO算法

实现:做标签时以单元格为单位,每个单元格标记 1 × 1 × 8 1 \times 1 \times 8 1×1×8(举例)大小的矩阵。实际操作时按物体中点分配单元格并输出 n × n × 8 n \times n \times 8 n×n×8大小的矩阵。

优点:

  • 是卷积实现,速度快,可实时处理
  • 输出长宽比不受限制,精确度高

量化:一般定义一个单元格的长度、宽度为 1 1 1

4.3.6 交并比(Intersection over union)

吴恩达深度学习笔记- lesson4 卷积神经网络_第10张图片

Intersection_Over_Union(loU) = Square_Of_Intersection Square_Of_Union \text{Intersection\_Over\_Union(loU)}= \frac{{{\text{Square\_Of\_Intersection}}}}{{{\text{Square\_Of\_Union}}}} Intersection_Over_Union(loU)=Square_Of_UnionSquare_Of_Intersection

一般约定,在计算机检测任务中,如果 l o U ≥ 0.5 \rm{loU}≥0.5 loU0.5就认为检测正确,可根据实际情况调整阈值

4.3.7 非极大值抑制(Non-max suppression)

问题:可能会对同一个对象做出多次检测

实现:对于每个输出类别,找到 p c {p_c} pc最大的边框输出成预测结果,抑制交并比高但非最大的边框,可以事先设定阈值,直接将 p c ≤ T h r e s h o l d _ V a l u e {p_c} \le {\rm{Threshold\_Value}} pcThreshold_Value的边框全部去掉(不抑制交并比低的边框是因为那可能是另外一个物体了)

4.3.8 Anchor Boxes(锚框)

anchor box的思路:预先定义多个不同形状的anchor box形状,把预测结果和这两个anchor box关联起来。 y = [ p c b x b y b h b w c 1 c 2 c 3 p c b x b y b h b w c 1 c 2 c 3 ] T y= \begin{bmatrix} p_{c} & b_{x} & b_{y} &b_{h} & b_{w} & c_{1} & c_{2} & c_{3} & p_{c} & b_{x} & b_{y} & b_{h} & b_{w} &c_{1} & c_{2} & c_{3} \\\end{bmatrix}^{T} y=[pcbxbybhbwc1c2c3pcbxbybhbwc1c2c3]T,前面的 p c , b x , b y , b h , b w , c 1 , c 2 , c 3 p_{c},b_{x},b_{y},b_{h},b_{w},c_{1},c_{2},c_{3} pc,bx,by,bh,bw,c1,c2,c3是和anchor box 1关联的8个参数,后面的8个参数(橙色方框标记的元素)和anchor box 2相关联。anchor box将按形状和边框匹配(交并比)。

y y y的深度重复次数为anchor box个数

一般手工指定anchor box形状极其个数,也可以用k-平均算法自动选出有代表性的anchor box

4.3.9 合起来:YOLO 算法(Putting it together: YOLO algorithm)

  1. 构造训练集:指定背景、类别,遍历添加标签,选用anchor box,

  2. 做出预测:don’t care-s一般是一些噪音

  3. 非极大值抑制

4.3.10 候选区域(选修)(Region proposals (Optional))

R-CNN:带区域的卷积网络,不再针对每个滑动窗运行检测算法,而是只选择一些窗口,在少数窗口上运行卷积网络分类器

图像分割后,按色块放置边界框,但输出并非按照这个边框

优化:Fast R-CNN、Faster R-CNN

Week 4 特殊应用:人脸识别和神经风格转换(Special applications: Face recognition &Neural style transfer)

4.4.1 什么是人脸识别?(What is face recognition?)

人脸验证(face verification):有一张输入图片,以及某人的ID或者是名字,这个系统要做的是,验证输入图片是否是这个人

人脸识别(face recognition):有一张输入图片,从数据库中匹配信息

  • 人脸验证之所以难,原因之一在于要解决“一次学”(one-shot learning problem)问题

4.4.2 One-Shot学习(One-shot learning)

Similarity函数: d ( i m g 1 , i m g 2 ) = Degree_Of_Difference_Between_Images d(\text img1,\text img2) = \text {Degree\_Of\_Difference\_Between\_Images} d(img1,img2)=Degree_Of_Difference_Between_Images,它以两张图片作为输入,然后输出这两张图片的差异值。如果你放进同一个人的两张照片,它能输出一个很小的值,如果放进两个长相差别很大的人的照片,它就输出一个很大的值。在识别过程中,如果这两张图片的差异值小于某个阈值 τ \tau τ,则预测这两张图片是同一个人。

步骤:将图片用函数 d d d与数据库中数据一一比对。

4.4.3 Siamese 网络(Siamese network)

Siamese 网络架构:

吴恩达深度学习笔记- lesson4 卷积神经网络_第11张图片

输出层的向量可看作一张图片的编码

x ( 1 ) x^{(1)} x(1) x ( 2 ) x^{(2)} x(2)的距离为图片的编码之差的范数: d ( x ( 1 ) , x ( 2 ) ) = ∣ ∣ f ( x ( 1 ) ) − f ( x ( 2 ) ) ∣ ∣ 2 2 d(x^{(1)},x^{(2)}) =|| f(x^{(1)}) - f(x^{(2)})||_{2}^{2} d(x(1),x(2))=f(x(1))f(x(2))22

实现:学习参数得到编码函数 f ( x ( i ) ) f(x^{(i)}) f(x(i))若,两个图片 x ( i ) x^{( i)} x(i) x ( j ) x^{( j)} x(j)是同一个人,那么你得到的两个编码的距离就小。

4.4.4 三元组损失(Triplet loss)

三元组:用于比对的数据、同一个人的照片、不同人的照片,记为 A A A P P P N N N

需要的特性:
∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + α ≤ 0 || f(A) - f(P)||^{2} -||f(A) - f(N)||^{2} + \alpha \leq0 f(A)f(P)2f(A)f(N)2+α0
即:
d ( A , P ) − d ( A , N ) + α ≤ 0 d(A,P) - d(A,N) + \alpha \le 0 d(A,P)d(A,N)+α0

α \alpha α为间隔(margin),避免 d ( A , P ) d(A,P) d(A,P) d ( A , N ) d(A,N) d(A,N)都为 0 0 0,也可使算法更严格

三元组损失函数:
L ( A , P , N ) = m a x ( ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + a , 0 ) L( A,P,N) = max(|| f( A) - f( P)||^{2} -|| f( A) - f( N)||^{2} + a,0) L(A,P,N)=max(f(A)f(P)2f(A)f(N)2+a,0)

作用:只要 ∣ ∣ f ( A ) − f ( P ) ∣ ∣ 2 − ∣ ∣ f ( A ) − f ( N ) ∣ ∣ 2 + α ≤ 0 ||f(A) - f(P)||^{2} -|| f(A) - f(N)||^{2} + \alpha \leq0 f(A)f(P)2f(A)f(N)2+α0,那么损失函数就是 0 0 0,只要这个损失函数小于等于 0 0 0,网络不会关心它负值有多大

整个网络的代价函数是训练集中这些单个三元组损失的总和。

注意:

  • 训练数据中应有成对的 A A A P P P

  • A A A N N N不要随机,要尽可能相似

4.4.5 人脸验证与二分类(Face verification and binary classification)

选取一对Siamese网络,同时计算这些嵌入,将其输入到逻辑回归单元进行预测。

吴恩达深度学习笔记- lesson4 卷积神经网络_第12张图片

最后的逻辑单元的激活函数可以是:
y ^ = σ ( ∑ k = 1 n w k ∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ + b ) \hat y = \sigma(\sum_{k = 1}^{n}{w_{k}| f( x^{( i)})_{k} - f( x^{( j)})_{k}| + b}) y^=σ(k=1nwkf(x(i))kf(x(j))k+b)

注:下标 k k k代表向量中的第 k k k个元素,n是编码的维数。

∣ f ( x ( i ) ) k − f ( x ( j ) ) k ∣ |f(x^{(i)})_{k} - f(x^{(j)})_{k}| f(x(i))kf(x(j))k 的其他替代方式,如 χ 2 \chi ^{2} χ2公式( χ \chi χ平方相似度):
( f ( x ( i ) ) k − f ( x ( j ) ) k ) 2 f ( x ( i ) ) k + f ( x ( j ) ) k \frac{(f( x^{(i)})_{k} - f(x^{(j)})_{k})^{2}}{f(x^{(i)})_{k} + f( x^{(j)})_{k}} f(x(i))k+f(x(j))k(f(x(i))kf(x(j))k)2
技巧:提前用Siamaese网络计算好数据库中图片的 f ( x ( i ) ) f(x^{(i)}) f(x(i))的值,既可以节省空间,也可减少计算量。

4.4.6 什么是神经风格迁移?(What is neural style transfer?)

符号: C C C来表示内容图像(content), S S S表示风格图像(Style), G G G表示生成的图像(Generated image)

实现思路:网络的深层、浅层提取的特征。

4.4.7 CNN特征可视化(What are deep ConvNets learning?)

可视化方法:寻找使单元激活最大化的一些图片块

特点:

  • 浅层一般检测边缘或者颜色阴影
  • 深层一个隐藏单元会看到一张图片更大的部分,在极端的情况下,可以假设每一个像素都会影响到神经网络更深层的输出

具体原理可见此论文

4.4.8 代价函数(Cost function)

代价函数:
J ( G ) = α J content ( C , G ) + β J style ( S , G ) J( G) = \alpha J_{\text{content}}( C,G) + \beta J_{\text{style}}(S,G) J(G)=αJcontent(C,G)+βJstyle(S,G)
步骤:

  1. 随机初始化生成图像 G G G

  2. 使用梯度下降的方法将其最小化,更新 G : = G − ∂ ∂ G J ( G ) G:= G - \frac{\partial}{\partial G}J(G) G:=GGJ(G)

4.4.9 内容代价函数(Content cost function)

用于计算内容代价函数的隐藏层不要太浅也不要太深。
J content ( C , G ) = 1 2 ∣ ∣ a [ l ] [ C ] − a [ l ] [ G ] ∣ ∣ 2 J_{\text{content}}( C,G) = \frac{1}{2}|| a^{[l][C]} - a^{[l][G]}||^{2} Jcontent(C,G)=21a[l][C]a[l][G]2

这里用的符号都是展成向量形式的,展开后就变成了两个图片之间 l l l层激活值差值的平方和。

4.4.10 风格代价函数(Style cost function)

取出第 l l l层激活值,其大小为 n H × n W × n c n_H \times n_W \times n_c nH×nW×nc

相关性:设 l l l层的第一个通道识别垂直线段,第二个通道识别橙色,若出现橙色的地方大概率也有垂直线段,则说明这两个通道相关性高。

a i ,   j ,   k [ l ] a_{i,\ j,\ k}^{[l]} ai, j, k[l]为隐藏层 l l l ( i , j , k ) (i,j,k) (i,j,k)位置的激活项, i i i j j j k k k分别代表该位置的高度、宽度以及对应的通道数。接下来计算一个关于 l l l层和风格图像的矩阵,即 G [ l ] ( S ) G^{[l](S)} G[l](S) l l l表示层数, S S S表示风格图像),( G [ l ] ( S ) G^{[l]( S)} G[l](S))是一个 n c × n c n_{c} \times n_{c} nc×nc的矩阵,公式为:
G k k ′ [ l ] ( S ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i ,   j ,   k [ l ] ( S ) a i ,   j ,   k ′ [ l ] ( S ) G_{kk^{'}}^{[l]( S)} = \sum_{i = 1}^{n_{H}^{[l]}}{\sum_{j = 1}^{n_{W}^{[l]}}{a_{i,\ j,\ k}^{[l](S)}a_{i,\ j,\ k^{'}}^{[l](S)}}} Gkk[l](S)=i=1nH[l]j=1nW[l]ai, j, k[l](S)ai, j, k[l](S)

注意:如果两个通道中的激活项数值都很大,那么 G k k ′ [ l ] G_{{kk}^{'}}^{[l]} Gkk[l]也会变得很大,对应地,如果他们不相关那么 G k k ′ [ l ] G_{{kk}^{'}}^{[l]} Gkk[l]就会很小。严格来讲,它其实是一种非标准的互协方差,因为我们并没有减去均值而只是把这些元素直接相乘

然后,我们再对生成图像做同样的操作。

G k k ′ [ l ] ( G ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i ,   j ,   k [ l ] ( G ) a i ,   j ,   k ′ [ l ] ( G ) G_{kk^{'}}^{[l]( G)} = \sum_{i = 1}^{n_{H}^{[l]}}{\sum_{j = 1}^{n_{W}^{[l]}}{a_{i,\ j,\ k}^{[l](G)}a_{i,\ j,\ k^{'}}^{[l](G)}}} Gkk[l](G)=i=1nH[l]j=1nW[l]ai, j, k[l](G)ai, j, k[l](G)
得到这两个矩阵后,可计算风格代价函数:
J s t y l e [ l ] ( S , G ) = 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 ∑ k ∑ k ′ ( G k k ′ [ l ] [ s ] − G k k ′ [ l ] [ G ] ) 2 J_{{\rm{style}}}^{[l]}(S,G) = \frac{1}{{{{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}^2}}}{\sum\limits_k {\sum\limits_{k'} {(G_{kk'}^{[l][s]} - G_{kk'}^{[l][G]})} } ^2} Jstyle[l](S,G)=(2nH[l]nW[l]nC[l])21kk(Gkk[l][s]Gkk[l][G])2
即:
J s t y l e [ l ] ( S , G ) = 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 ∥ G [ l ] ( G ) − G [ l ] ( G ) ∥ F 2 J_{{\rm{style}}}^{[l]}(S,G) = \frac{1}{{{{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}^2}}}\left\| {{G^{[l](G)}} - {G^{[l](G)}}} \right\|_F^2 Jstyle[l](S,G)=(2nH[l]nW[l]nC[l])21G[l](G)G[l](G)F2

实际应用时,归一化常数 1 ( 2 n H [ l ] n W [ l ] n C [ l ] ) 2 \frac{1}{{{{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})}^2}}} (2nH[l]nW[l]nC[l])21可用 β \beta β代替

∥ A ∥ F {\left\| A \right\|_F} AFFrobenius范数

最后将各层的风格函数加起来形成整体:
J style ( S , G ) = ∑ l λ [ l ] J style [ l ] ( S , G ) {J_{\text{style}}}(S,G) = \sum\limits_l {{\lambda ^{[l]}}J_{\text{style}}^{[l]}(S,G)} Jstyle(S,G)=lλ[l]Jstyle[l](S,G)

其中, λ [ l ] \lambda ^{[l]} λ[l]为不同层数的权重

全体代价函数:
J ( G ) = α J content ( C , G ) + β J style ( S , G ) J(G) = \alpha J_{\text{content}}{(C,G)} + \beta J_{{\text{style}}}(S,G) J(G)=αJcontent(C,G)+βJstyle(S,G)

4.4.11 一维到三维推广(1D and 3D generalizations of models)

原理基本一致,主要是过滤器大小适当调整

对于许多1维数据应用,实际更多上会使用递归神经网络进行处理

三维的应用:

  • CT扫描结果等立体对象

  • 将视频的时间轴看作第三维

你可能感兴趣的:(深度学习,人工智能,机器学习,python)