【Deep Learning】04 卷积神经网络
本文为吴恩达 Deep Learning 笔记
卷积神经网络基础
计算机视觉
计算机视觉:
Computer Vision 计算机视觉
- 使用传统神经网络解决计算机视觉的问题:
- 神经网络结构复杂,数据量相对不够,容易出现过拟合。
- 所需内存、计算量较大。
- 解决这一问题的方法就是使用卷积神经网络 (CNN)。
边缘检测
边缘检测示例:
Edge Detection 边缘检测
-
在计算机视觉问题中,神经网络由浅层到深层,可以分别检测出图片的边缘特征 、局部特征以及整体特征。
-
最常检测的图片边缘有两类:一是垂直边缘,二是水平边缘。
-
图片的边缘检测可以通过与相应 Filter 进行卷积来实现。
-
关于卷积运算:
图中,结果的第一行第一列计算方法为:
更多边缘检测内容:
-
图片边缘有两种渐变方式,一种是由明变暗,另一种是由暗变明。实际应用中,这两种渐变方式并不影响边缘检测结果,可以对输出图片取绝对值操作,得到同样的结果。
-
垂直边缘检测和水平边缘检测的 Filter 如下所示:
-
除普通的 Filter 外,还有 Sobel Filter 和 Scharr Filter,他们增加了图片中心区域的权重:
-
在深度学习中,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\) 一般为奇数。
卷积步长:
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 由学习得到且一般是对称的,所以这不重要。
三维卷积:
- 以上讨论的是灰度图片,只有一个通道,而 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 组个数。
卷积神经网络
单层卷积神经网络:
-
深度神经网络与卷积神经网络:
-
卷积神经网络的符号:
-
\(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 滑动区域内取平均值。
卷积神经网络示例:
为什么要使用卷积:
- 使用卷积可以减少参数。
经典 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 \]
- AlexNet 与 LeNet-5 类似,但是更复杂,LeNet-5 大约有六万个参数,AlexNet 大约有六千万个参数。
-
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} \]
残差网络为什么有用:
- 通过残差网络:
- 当发生梯度消失 (\(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,有利于防止发生过拟合。
其他
使用开源的实现方案:
- 略。
迁移学习:
- 参考《迁移学习》一节。
- 越多的数据意味着冻结越少的层,训练更多的层。
数据扩充:
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\)。