【Deep Learning】04 卷积神经网络

本文为吴恩达 Deep Learning 笔记


卷积神经网络基础


计算机视觉

计算机视觉:

Computer Vision 计算机视觉

  • 使用传统神经网络解决计算机视觉的问题:
    • 神经网络结构复杂,数据量相对不够,容易出现过拟合。
    • 所需内存、计算量较大。
  • 解决这一问题的方法就是使用卷积神经网络 (CNN)。

边缘检测

边缘检测示例:

Edge Detection 边缘检测

  • 在计算机视觉问题中,神经网络由浅层到深层,可以分别检测出图片的边缘特征 、局部特征以及整体特征。

  • 最常检测的图片边缘有两类:一是垂直边缘,二是水平边缘。

  • 图片的边缘检测可以通过与相应 Filter 进行卷积来实现。

  • 关于卷积运算:

    xVRg78.png

    图中,结果的第一行第一列计算方法为:

\[3\times1 + 1\times1 + 2\times1 + 0\times0 + 5\times0+7\times0+1\times(-1)+8\times(-1)+2\times(-1) = -5 \]

更多边缘检测内容:

  • 图片边缘有两种渐变方式,一种是由明变暗,另一种是由暗变明。实际应用中,这两种渐变方式并不影响边缘检测结果,可以对输出图片取绝对值操作,得到同样的结果。

  • 垂直边缘检测和水平边缘检测的 Filter 如下所示:

    xVRr6I.png

  • 除普通的 Filter 外,还有 Sobel Filter 和 Scharr Filter,他们增加了图片中心区域的权重:

    xVRsXt.png

  • 在深度学习中,Filter 的数值如标准神经网络中的参数 \(w\) 一样,需要学习得到。


卷积

填充:

Padding 填充

Same Convolutions 卷积前后图片尺寸不变

  • 卷积会使图片变小,于是我们需要使用 Padding 来扩展原始图片,扩展区域补零。
  • 假设原始图片尺寸为 \(n \times n\),Filter 尺寸为 \(f \times f\)
    • 卷积后图片尺寸为 \((n-f+1) \times (n-f+1)\)
    • Padding 长度为 \(p\)
    • Padding 后原始图片尺寸为 \((n+2p) \times (n+2p)\)
    • Padding 后再卷积后图片尺寸为 \((n+2p-f+1) \times (n+2p-f+1)\)
    • 为保证卷积前后图片尺寸不变,则 \(p = (f-1)/2\),其中 \(f\) 一般为奇数。

xVRc0f.png

卷积步长:

Strided Convolutions 卷积步长

Cross-correlations 相关系数

  • 步长 \(s\) 表示 Filter 在原图片中水平方向和垂直方向每次的步进长度。

  • 假设原始图片尺寸为 \(n \times n\),Filter 尺寸为 \(f \times f\),Padding 长度为 \(p\),步长为 \(s\),则卷积后图片尺寸为:

    \[\left \lfloor \frac{n+2p-f}{s} + 1 \right \rfloor \times \left \lfloor \frac{n+2p-f}{s} + 1 \right \rfloor \]

  • 相关系数与卷积:

    • 卷积运算会先将 Filter 绕其中心旋转 \(180^{\circ}\),然后再将旋转后的 Filter 在原始图片上进行滑动计算。
    • 相关系数运算过程不会对 Filter 进行旋转,目前为止我们介绍的 CNN 卷积实际上计算的是相关系数,由于 Filter 由学习得到且一般是对称的,所以这不重要。

xVR6nP.png

三维卷积:

  • 以上讨论的是灰度图片,只有一个通道,而 RGB 图片有三个通道。
  • 三通道图片的卷积运算与单通道图片的卷积运算基本一致:
    • 将每个通道与对应的 Filter 进行卷积运算,然后再将三个通道的和相加,得到输出图片的一个像素值。
    • 不同通道对应的 Filter 可以不同,如只对 R 通道进行边缘检测,则 G、B 通道的 Filter 将置零。
    • 可以设置多个 Filter 组,如第一个 Filter 组实现垂直边缘检测,第二个 Filter 组实现水平边缘检测。
  • 假设原始图片尺寸为 \(n \times n \times n_c\),Filter 尺寸为 \(f \times f \times n_c\),其中 \(n_c\) 是图片通道数,则卷积后图片尺寸为 \((n-f+1) \times (n-f+1) \times n_c'\),其中 \(n_c'\) 是 Filter 组个数。

卷积神经网络

单层卷积神经网络:

  • 深度神经网络与卷积神经网络:

    • 深度神经网络中:

      \[Z^{[l]} = W^{[l]}A^{[l-1]}+b \\ A^{[l]} = g^{[l]}(Z^{[l]}) \]

    • 卷积神经网络中:卷积对应上式的乘法运算,Filter 的取值对应上式的 \(W^{[l]}\)

      xVRRAS.png

  • 卷积神经网络的符号:

    • \(f^{[l]}\)\(l\) 层的 Filter 维度。

    • \(p^{[l]}\)\(l\) 层的 Padding 长度。

    • \(s^{[l]}\)\(l\) 层的卷积步长。

    • \(n_c^{[l]}\)\(l\) 层的 Filter 组的数量。

    • 输入维度:\(n^{[l-1]}_H \times n^{[l-1]}_W \times n^{[l-1]}_c\),其中 \(n_H\)\(n_W\) 分别代表图片的长和宽,输入图片不一定是正方形。

    • 输出维度:\(n^{[l]}_H \times n^{[l]}_W \times n^{[l]}_c\)

      \[n_H^{[l]} = \left \lfloor \frac{n_H^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}} + 1 \right \rfloor ,\quad n_W^{[l]} = \left \lfloor \frac{n_W^{[l-1]}+2p^{[l]}-f^{[l]}}{s^{[l]}} + 1 \right \rfloor \]

    • 每个 Filter 组维度为:\(f^{[l]} \times f^{[l]} \times n_c^{[l-1]}\)

    • \(w^{[l]}\) 的维度:\(f^{[l]} \times f^{[l]} \times n_c^{[l-1]} \times n_c^{[l]}\)

    • \(b^{[l]}\) 的维度:\(1\times1\times1\times n_c^{[l]}\)

简单卷积网络示例:

  • CNN 模型示例:

    \[\begin{aligned} &39 \times 39 \times 3 \xrightarrow[10 filters]{f^{[l]} = 3, s^{[l]} = 1, p^{[l]} = 0} 39 \times 39 \times 10 \xrightarrow[20 filters]{f^{[l]} = 5, s^{[l]} = 2, p^{[l]} = 0} 17 \times 17 \times 20 \xrightarrow[40 filters]{f^{[l]} = 5, s^{[l]} = 2, p^{[l]} = 0} \\ &7 \times 7 \times 40 \rightarrow 7 \times 7 \times 40 = 1960 \rightarrow \hat y \end{aligned} \]

  • 随着 CNN 层数增加,\(n_H^{[l]}\)\(n_W^{[l]}\) 一般逐渐减小,\(n_c^{[l]}\) 一般逐渐增大。

  • CNN 有三种类型的层:卷积层、池化层、全连接层。

池化层:

Pooling 池化

  • 池化层用来减小尺寸,减少噪声影响。
  • 池化层没有卷积运算,与卷积层相比,Filter 没有参数 \(p\),有参数 \(f\)\(s\)
  • Max Pooling 在 Filter 滑动区域内取最大值;Average Pooling 在 Filter 滑动区域内取平均值。

xVRfhQ.png

卷积神经网络示例:

xVR4pj.png

为什么要使用卷积:

  • 使用卷积可以减少参数。

经典 CNN 网络实例详解


经典网络

为什么要进行实例研究:

  • 经典 CNN 网络有:LeNet-5、AlexNet、VGG、ResNet、Inception Neural Network。

经典网络:

  • LeNet-5:

    • LeNet-5 是第一个成功应用于数字识别问题的卷积神经网络。

    • 典型的 LeNet-5 结构包含 CONV layer,POOL layer 和 FC layer,顺序一般是:

      \[\text{CONV} \rightarrow \text{POOL} \rightarrow \text{CONV} \rightarrow \text{POOL} \rightarrow \text{FC} \rightarrow \text{FC} \rightarrow \text{OUTPUT} \]

    • 在 LeNet-5 提出时激活函数是 Sigmoid 和 tanh,池化层是 Average Pool,现在根据需要,可以使用 ReLU 和 Max Pool。

      \[32 \times 32 \times 3 \xrightarrow[6 \ \text{Filters}]{f = 5, \ s = 1} 28 \times 28 \times 6 \xrightarrow[6 \ \text{Filters Average Pooling}]{f = 2, \ s = 2} 14 \times 14 \times 6 \xrightarrow[16 \ \text{Filters}]{f = 5, \ s = 1} \\ 10 \times 10 \times 16 \xrightarrow[16 \ \text{Filters Average Pooling}]{f = 2, \ s = 2} 5 \times 5 \times 16 \rightarrow 400 \rightarrow 120 \rightarrow 84 \rightarrow \text{Softmax Output } \hat y \]

  • AlexNet:

    • AlexNet 与 LeNet-5 类似,但是更复杂,LeNet-5 大约有六万个参数,AlexNet 大约有六千万个参数。

      \[227 \times 227 \times 3 \xrightarrow[96 \ \text{Filters}]{f = 11, \ s = 4} 55 \times 55 \times 96 \xrightarrow[96 \ \text{Filters Max Pooling}]{f = 3, \ s = 2} 27 \times 27 \times 96 \xrightarrow[256 \ \text{Filters Same Conv}]{f = 5} \\ 27 \times 27 \times 256 \xrightarrow[256 \ \text{Filters Max Pooling}]{f = 3, \ s = 2} 13 \times 13 \times 256 \xrightarrow[256 \ \text{Filters Same Conv}]{f = 3} 13 \times 13 \times 384 \\ \xrightarrow[256 \ \text{Filters Same Conv}]{f = 3} 13 \times 13 \times 384 \xrightarrow[256 \ \text{Filters Same Conv}]{f = 3} 13 \times 13 \times 256 \xrightarrow[256 \ \text{Filters Max Pooling}]{f = 3, \ s = 2} \\ 6 \times 6 \times 256 \rightarrow 9216 \rightarrow 4096 \rightarrow 4096 \rightarrow 1000 \rightarrow \text{Softmax Output } \hat y \]

  • VGG:

    • 增加网络的深度能够在一定程度上影响网络最终的性能。

    • VGG-16 在每一组卷积层进行翻倍操作。

      \[224 \times 224 \times 3 \xrightarrow[64 \text{ Filters}]{\text{CONV}} 224 \times 224 \times 64 \xrightarrow{\text{POOL}} 112 \times 112 \times 64 \xrightarrow[128 \text{ Filters}]{\text{CONV}} 112 \times 112 \times 128 \xrightarrow{\text{POOL}} \\ 56 \times 56 \times 128 \xrightarrow[256 \text{ Filters}]{\text{CONV}} 56 \times 56 \times 256 \xrightarrow{\text{POOL}} 28 \times 28 \times 256 \xrightarrow{\text{CONV}} \cdots \]


残差网络

ResNet:

Residual Networks 残差网络

Residual Block 残差块

Plain Networks 非残差网络

  • 随着神经网络层数变多和网络变深,会带来严重的梯度消失和梯度爆炸问题,残差网络是一种解决方法。

    • 残差网络人为地让神经网络某些层跳过下一层神经元的连接,隔层相连,弱化每层之间的强联系。
    • 这种模型结构对于训练非常深的神经网络效果很好。
  • 公式:

    \[\begin{aligned} z^{[l+1]} = W^{[l+1]}a^{[l]} + b^{[l+1]} &,\quad a^{[l+1]} = g(z^{[l+1]}) \\ z^{[l+2]} = W^{[l+2]}a^{[l+1]} + b^{[l+2]} &,\quad a^{[l+2]} = g(z^{[l+2]} + a^{[l]}) \end{aligned} \]

xVRWtg.png

残差网络为什么有用:

  • 通过残差网络:
    • 当发生梯度消失 (\(W^{[l+2]} \approx 0, b^{[l+2]} \approx 0\)) 时,能建立 \(a^{[l+2]}\)\(a^{[l]}\) 的线性关系。
    • 当没有发生梯度消失时,残差块会忽略 Short Cut,得到与没有使用残差网络时同样效果的非线性关系。
  • 如果残差块中 \(a^{[l]}\)\(a^{[l+2]}\) 维度不同,可以引入矩阵 \(W_s\),使 \(W_s \cdot a^{[l]}\)\(a^{[l+2]}\) 维度相同:
    • 可以将 \(W_s\) 作为参数学习。
    • 也可以使 \(W_s\) 仅起到给 \(a^{[l]}\) 截断或补零的作用。

Inception

\(1 \times 1\) 卷积:

  • \(1 \times 1\) 卷积:Filter 的维度为 \(1 \times 1\),即卷积操作等同于乘积操作。
  • 池化可以减小 \(n_H\)\(n_W\)\(1 \times 1\) 卷积可以减小通道数 \(n_c\)

Inception 网络简介:

Bottleneck Layer 瓶颈层

  • 在之前介绍的 CNN 中,单层的 Filter 尺寸是固定的,在 Inception 网络中,单层网络上可以使用不同尺寸的 Filter 进行 Same Convolutions,然后将各 Filter 得到的结果拼接。此外,还可以将卷积层与池化层混合。
  • Inception 网络的计算量很大,我们可以通过 \(1\times1\) 卷积来减少计算量,\(1 \times 1\) 卷积层将通道数减少,又被称为瓶颈层。

Inception 网络:

  • 网络中间隐藏层也可以作为输出层 Softmax,有利于防止发生过拟合。

xVR51s.png


其他

使用开源的实现方案:

  • 略。

迁移学习:

  • 参考《迁移学习》一节。
  • 越多的数据意味着冻结越少的层,训练更多的层。

数据扩充:

Color Shifting 色调转换

  • 参考《其他正则化方法》一节。
  • 当数据不够时,使用数据扩充 (Data Augmentation) 以获得更多样本,如镜像翻转、随机裁剪、色彩转换等。

计算机视觉现状:

Hand-engineering 手工工程

Ensembling 集成

Multi-crop At Test Time 测试阶段数据扩增

  • 当数据量较少时,常常需要手工工程。
  • 在模型研究或者竞赛方面,有一些方法能够有助于提升神经网络模型的性能:
    • 集成:独立地训练几个神经网络,并平均输出它们的输出。
    • 测试阶段数据扩增:将数据扩增应用到测试集,对结果进行平均。

目标检测


目标定位与特征点检测

目标定位:

Object Detection 目标检测

Object Localization 目标定位

  • 目标定位不仅要求判断出图片中物体的种类,还要在图片中标记出它的具体位置。

  • 目标定位和目标检测:

    • 目标定位,只有一个较大的对象位于图片中间位置。
    • 目标检测,图片可以含有多个对象,甚至单张图片中会有多个不同分类的对象。
  • 对于标准的 CNN 分类模型,可以输出一个 \((4\times1)\) 向量,每个元素的值分别对应 Pedestrain, Car, Motorcycle, Background 四类。

  • 对于目标定位模型,将输出 \((8\times1)\) 向量,除 \(3\) 个分类标签 (Pedestrain, Car, Motorcycle) 外,还有:

    • \(P_c\) 表示矩形区域是目标的概率,若 \(P_c = 0\),则是没有检测到目标,其他参数均可忽略。
    • \(b_x\)\(b_y\) 表示目标中心位置坐标,设定图片左上角是 \((0, 0)\),右下角是 \((1, 1)\)
    • \(b_h\)\(b_w\) 表示矩形区域的宽和高。
  • 损失函数:

    • \(P_c = 1\)

      \[L(\hat y, y) = (\hat y_1 - y_1)^2 + (\hat y_2 - y_2)^2 + \cdots +(\hat y_8 - y_8)^2 \]

    • \(P_c = 0\)

      \[L(\hat y, y) = (\hat y_1 - y_1)^2 \]

特征点检测:

Landmark Detection 特征点检测

  • 特征点检测:对目标的关键特征点坐标进行定位,而非使用矩形区域检测目标位置。例:人脸识别、人体姿势动作。
  • 如果有 \(64\) 个特征点,则输出的向量中有 \(64 \times 2 + 1 = 129\) 个值,包括每个特征点的坐标和一个标志为用来判断是否是目标。

滑动窗算法

目标检测:

Sliding Windows Detection 滑动窗算法

  • 目标检测的一种简单方法是滑动窗算法:
    • 在训练样本集上搜集相应的各种目标图片和非目标图片,图片尺寸较小,尽量仅包含相应目标。
    • 使用这些训练集构建 CNN 模型。
    • 在测试图片上,选择大小适宜的窗口、合适的步进长度,进行从左到右、从上倒下的滑动。
    • 每个窗口区域都送入之前构建好的 CNN 模型进行识别判断。
  • 滑动窗算法的优缺点:
    • 原理简单,不需要人为选定目标区域。
    • 滑动窗的大小和步进长度都需要人为直观设定:
      • 滑动窗过小或过大,步进长度过大,均会降低目标检测正确率。
      • 滑动窗和步进长度较小,整个目标检测的算法运行时间会很长。

基于卷积的滑动窗口实现:

  • 之前的滑动窗算法需要反复进行 CNN 正向计算,而利用卷积操作,则不管原始图片有多大,只需要进行一次 CNN 正向计算。

  • 首先需要对 CNN 网络结构做一些调整,以便对进入网络的单个滑动窗口区域更快捷计算:

    • 具体做法是把全连接层转变成为卷积层。
    • 将全连接层转变成为卷积层的方法是,使用与上层尺寸一致的 Filter 进行卷积运算,如:
      • \(5\times5\times16 \xrightarrow{\text{FC}} 400\)
      • \(5\times5\times16 \xrightarrow{\text{Filter}\ 5\times5} 1\times1\times400\)
  • 假设滑动窗口的大小是 \(14\times14\times3\),测试集图片的大小是 \(16\times16\times3\)

    • 单个滑动窗口的 CNN 网络为:

      \[14\times14\times3 \xrightarrow[16 \ \text{Filters}]{5\times5} 10\times10\times16 \xrightarrow[\text{Max Pool}]{2\times2} 5\times5\times16 \xrightarrow[\text{FC}]{5\times5} \\ 1\times1\times400 \xrightarrow[\text{FC}]{1\times1} 1\times1\times400 \xrightarrow[\text{FC}]{1\times1} 1\times1\times4 \]

    • 将测试集图片通过同样的 CNN 网络,最后会得到 \(2\times2\times4\) 的输出,其中 \(2\times2\) 代表一共有 \(4\) 个窗口结果:

      \[16\times16\times3 \xrightarrow[16 \ \text{Filters}]{5\times5} 12\times12\times16 \xrightarrow[\text{Max Pool}]{2\times2} 6\times6\times16 \xrightarrow[\text{FC}]{5\times5} \\ 2\times2\times400 \xrightarrow[\text{FC}]{1\times1} 2\times2\times400 \xrightarrow[\text{FC}]{1\times1} 2\times2\times4 \]

  • 窗口步进长度与选择的 Max Pool 大小有关,如果需要步进长度为 \(4\),只需设置 Max Pool 为 \(4 \times 4\) 即可。


YOLO

Bounding Box 预测:

  • 滑动窗口算法有时会出现滑动窗不能完全涵盖目标的问题,YOLO 算法可以解决这类问题。
  • YOLO 算法流程:
    • 首先将原始图片分割成 \(n \times n\) 网格,每个网格代表一块区域。
    • 对原始图片构建 CNN 网络,输出层为 \(n \times n \times 8\),其中 \(8\) 为 《目标定位》一节提到的 \(8\) 个值。
      • 如果中心坐标 \((b_x, b_y)\) 不在当前网格中,则 \(P_c = 0\)
      • 网格左上角为 \((0, 0)\),右下角为 \((1, 1)\)\(b_x\)\(b_y\) 的值在 \(0\)\(1\) 之间,\(b_h\)\(b_w\) 的值可以大于 \(1\)

交并比:

Intersection Over Union 交并比 (IoU)

  • IoU 用于评价目标检测算法的准确性。

  • 真实目标区域与检测目标区域的交集为 \(I\),并集为 \(U\)

    \[IoU = \frac{I}{U} \]

  • IoU 的值在 \(0\)\(1\) 之间,越接近 \(1\) 代表两块区域越接近。

非最大值抑制:

Non-max Suppression 非最大值抑制 (NMS)

  • YOLO 算法中,可能会出现多个网格都检测出到同一目标的情况,即几个相邻网格都判断出同一目标的中心坐标在其内。
  • 可以使用非最大值抑制判断哪个网格最为准确。
  • 非最大值抑制算法流程:
    • 剔除 \(P_c\) 值小于某阈值的所有网格。
    • 选取 \(P_c\) 值最大的网格,利用 IoU,摒弃与该网格交叠较大的网格。
    • 对剩下的网格,重复上一步。
  • 上面提到的步骤适用于单类别目标检测,如果要进行多个类别目标检测,对于每个类别,应该单独做一次非极大值抑制。

Anchor Boxes:

  • 那对于多个目标重叠的情况,如一个人站在一辆车前面,需要使用不同形状的 Anchor Boxes 来检测。
  • 例,如果同一网格出现了两个目标——人和车:
    • 我们可以设置 Anchor Box1 检测人,Anchor Box2 检测车。
    • 如果原来的输出维度是 \(3\times3\times8\),则使用 Anchor Boxes 后输出维度为 \(3\times3\times2\times8\)\(3\times3\times16\)
    • 每个 Anchor Box 都有一个 \(P_c\),若两个 \(P_c\) 都大于某一阈值,则检测到两个目标。
  • 当同一网格中有两个以上目标或两个目标的 Anchor Box 高度重合时,算法效果不好。
  • Anchor Box 可以通过 K-means 聚类,选择一组有代表性的 Anchor Box。

YOLO:

  • 算法流程:
    • 对每个网格,预测得到 Bunding Box。
    • 剔除掉概率低的预测结果。
    • 对每个类别应用非极大值抑制得到最终结果:
      • 最终结果的维度是 \(n \times n \times 2 \times 8\)
      • \(n\) 指图片分割成 \(n \times n\) 网格。
      • \(2\)\(2\) 个 Anchor Boxes。
      • \(8\)\(P_c\)\(b_x\)\(b_y\)\(b_h\)\(b_w\) 和 Pedestrain, Car, Motorcycle 三种类别。

R-CNN

候选区域:

Region CNN 带区域的 CNN

Region Proposal 候选区域

  • 滑动窗口目标检测算法对一些明显没有目标的区域也进行了扫描,这降低了算法的运行效率。
  • R-CNN 对输入图片运行图像分割算法,在不同的色块上找出候选区域,只在这些区域运行分类器。
  • R-CNN 运行速度慢,有一系列改进:Fast R-CNN、Faster R-CNN。但是大多数情况仍比 YOLO 慢。
  • YOLO 系列的算法叫做 1-stage 目标检测方法;RCNN 系列的算法也叫做 2-stage 目标检测算法,因为会先产出后候选框,再预测和调整。

人脸识别与神经风格迁移


人脸识别

人脸识别:

Face Verification 人脸验证

Face Recognition 人脸识别

  • 人脸验证:输入的人脸是否与某个已知的身份信息对应。
  • 人脸识别:输入的人脸是否与已知的多个身份信息中的某一个对应。

One-Shot 学习:

Similarity Function 相似函数

  • One-Shot 学习:
    • 每个人的训练样本只包含一张照片,然后训练一个 CNN 模型来进行人脸识别。
    • 若一共有 \(K\) 个人,则输出 Softmax 是 \(K\) 维。
    • One-Shot 的缺点:
      • 训练样本少,CNN 不够健壮。
      • 如果增加一个人,需要重新构建 CNN 网络。
  • 相似函数:
    • 为解决 One-Shot 的缺点,先介绍这一概念。
    • 相似函数表示两张图片的不同的程度 (degree of difference between images) ,用 \(d(img1, img2)\) 来表示。\(d(img1, img2)\) 越小,两张图片越相似。
    • 在人脸识别问题中,会计算输入图片与数据库中 \(K\) 个目标图片的相似函数,取其中 \(d(img1, img2)\) 最小的目标为匹配对象。若所有的 \(d(img1, img2)\) 都很大,则表示数据库没有这个人。

Siamese 网络:

Siamese 孪生网络

  • Siamese:让图片经过 CNN 网络得到全连接层 \(f(x^{(i)})\),将全连接层 \(f(x^{(i)})\) 看作原始图片的编码,表征原始图片的关键特征。
  • 相似函数可以表示为:\(d(x^{(1)}, x^{(2)}) = \left \| f(x^{(1)}) - f(x^{(2)}) \right \|^2\)
  • 不同图片所通过的 CNN 网络是相同的,我们的目标是通过梯度下降求出网络的参数。

Triplet 损失:

  • Triplet 损失需要每个样本包含三张图片:靶目标 (Anchor)、正例 (Positive)、反例 (Negative)。

  • 我们希望靶目标与正例的相似函数尽可能小,靶目标与反例的相似函数尽可能大,前者远小于后者:

    \[\left \| f(A) - f(P) \right \|^2 - \left \| f(A) - f(N) \right \|^2 + \alpha \leq 0 \]

  • 可定义损失函数和代价函数,其中 \(\alpha\) 为超参数:

    • 损失函数:

      \[L(A, P, N) = \max(\left \| f(A) - f(P) \right \|^2 - \left \| f(A) - f(N) \right \|^2 + \alpha \leq 0, 0) \]

    • 代价函数:

      \[J = \sum_{i=1}^m L(A^{(i)}, P^{(i)}, N^{(i)}) \]

人脸验证与二分类:

  • 除构造 Triplet 损失来解决人脸识别问题之外,还可以使用二分类结构。

  • 输出表达式:

    \[\hat y = \sigma(\sum_{i=1}^K w_k |f(x^{(i)})_k - f(x^{(j)})_k| + b) \]

    或:

    \[\hat y = \sigma(\sum_{k=1}^K w_k \frac{(f(x^{(i)})_k - f(x^{(j)})_k)^2}{f(x^{(i)})_k + f(x^{(j)})_k} + b) \]

  • 一种减少计算量的方法:

    • 训练好模型后,将数据库中每张图片的编码层 \(f(x^{(i)})\) 保存。
    • 使用时,只需计算输测试入图片的 Siamese 网络,即 \(f(x^{(j)})\)

神经风格迁移

什么是神经风格迁移:

Neural Style Transfer 神经风格迁移

  • 将一张图片的风格 "迁移" 到另外一张图片中,C 表示内容图片,S 表示风格图片,G 表示生成的图片。

深度卷积神经网络学到了什么:

  • 略。

代价函数:

  • G的代价函数由两部分组成:C 与 G 的相似程度和 S 与 G 的相似程度。

    \[J(G) = \alpha \cdot J_{content}(C, G) + \beta \cdot J_{style}(S, G) \]

  • 神经风格迁移的基本算法流程是:首先令 G 为随机像素点,然后使用梯度下降算法,不断修正 G 的所有像素点,使得代价函数不断减小。

内容代价函数:

Content Cost Function 内容代价函数

  • CNN 的每个隐藏层分别提取原始图片的不同深度特征,由简单到复杂。

  • 风格迁移时使用的隐藏层不能太深也不能太浅,如果太浅,G 与 C 会非常接近,如果太深,G 中会出现 C 中的物体。

  • 内容代价函数,其中 \(a^{[l]}\) 是网络中间层激活函数的输出:

    \[J_{content}(C, G) = \frac{1}{2} \left || a^{[l](C),} - a^{[l](G)} \right || \]

风格代价函数:

Style Cost Function 风格代价函数

Style Matrix 风格矩阵

  • 图片的风格可以定义成 CNN 网络中第 \(l\) 隐藏层不同通道间激活函数的相关系数。

  • 对于风格图像 S,选定网络中的第 \(l\) 层,定义图片的风格矩阵为:

    \[G^{[l](S)}_{kk'} = \sum_{i=1}^{n^{[l]}_H} \sum_{j=1}^{n^{[l]}_W} a_{ijk}^{[l](S)} a_{ijk'}^{[l](S)} \]

    其中,\(i\)\(j\) 分别为第 \(l\) 层的高和宽,\(k\)\(k'\) 为选定的通道。同理,对于生成图像 G,有风格矩阵 \(G^{[l](G)}_{kk'}\)

  • 风格代价函数,其中 \(\lambda\) 为超参数:

    \[\begin{aligned} J_{style}^{[l]}(S, G) &= \frac{1}{(2n_H^{[l]}2n_W^{[l]}2n_G^{[l]})} \sum_k \sum_{k'}(G^{[l](S)}_{kk'} - G^{[l](G)}_{kk'})^2 \\ J_{style}(S, G) &= \sum_l \lambda^{[l]} J_{style}^{[l]}(S, G) \end{aligned} \]

推广至一维和三维:

  • 对于一维数据,例:
    • 输入维度 \(14 \times 1\),Filter 维度 \(5 \times 1\),Filter 组数 \(16\)
    • 输出维度 \(10 \times 16\)
  • 对于三维数据,例:
    • 输入维度 \(14 \times 14 \times 14 \times 1\),Filter 维度 \(5 \times 5 \times 5 \times 1\),Filter 组数 \(16\)
    • 输出维度 \(10 \times 10 \times 10 \times 16\)

参考

posted @ 2022-09-26 17:11  空白4869  阅读(104)  评论(0编辑  收藏  举报