练习题: https://zhuanlan.zhihu.com/p/95510114


[第四部分]计算机视觉(卷积神经网络cnn为主)

卷积运算长什么样? (conv2d为例)

image.png

注: 自画图, 重在方便理解, 无关代码实现细节.

CNN模型长什么样? (LeNet-5为例)

image.png

上图以LeNet-5模型结构为例实现手写数字识别的任务, 该模型结构涉及到CNN常用的conv,pooling,FC三类层 CNN特征提取的模型结构特点: 尺寸减小, 通道增加. (常用输入尺寸为224x224) (个人注)

cnn注释符号&基本概念

image.png

  • padding有什么用?

解决两个问题, 1防止图片边界信息丢失 2, 控制输出的尺寸.

  • kernel_size, stride, padding 参数设置.
  1. 尺寸不变 = 3, 1, 1
  2. 2倍下采样 = 4, 2, 1

注: 用与下采样同样的参数, 进行转置反卷积,可以实现上采样. 如下2倍上采样:
image.png

  • 理解卷积的输出尺寸 (以h为例)

    公式: 向下取整[(h + 2p - f) / s] + 1 注: f = filter_size , s = strides, p = paddings

  1. padding之后, h’ = h + 2p_h
  2. kernel在featuremaps的h方向停留: 向下取整((h’-f_h)/s) + 1次. 注: 每次停留计算出一个输出值.
  3. 综上: h_out = 向下取整((h + 2p_w - f_h) / s) + 1
  4. 同理, w_out = 向下取整((h_w + 2p_w - f_w) / s) + 1
  5. 举例: 跨步卷积实现下采样, f, s, p= 4,2,1 … 那么, h_out = 向下取整((h +2 - 4) / 2) + 1 = h / 2
  • max pooling

max pooling 的特别之处 : 没有参数, 不进行梯度下降
max pooling 的作用机制 : 选择的值即为最大激活值, 如果这个激活值足够相对地大,说明该点学习到了特征.
常用超参数: f =2 , s = 2 , p=0 (尺寸减半) (注: f = filter_size , s = strides, p = paddings, 之后不再累赘)

为何用卷积conv

  1. 参数共享

    image.png

  2. 稀疏连接

    image.png

以上两个特点, 使cnn不仅参数更少, 而且实现了”(空间上)权重分享“的思想, 该思想提供了”平移不变性“(个人注: 在判断图片中是否有猫的任务中, 不管猫在图像的左边还是右边, 我们都能学到猫的特征. 这就是平移不变性) (个人注: rnn实现了”(时间上)权重分享”思想)

cnn经典网络:

  • LeNet-5 (作者: YannLeCun)

    image.png 阅读建议:该文章比较难度, 而且很多细节都过时了, 不需要读. 如果确定要读, 建议精读第二段(网络结构),泛读第三段(实验和结果)

  • AlexNet (作者: AlexKrizhenvsky)

    image.png 阅读建议: 不需要读. 如果确定要读, 比较易懂, 也值得一读.

  • VGG-16

    image.png

    1. vgg-16中的16: 指带权重的层数. 注: vgg-16和vgg-19效果接近, 推荐用vgg-16
    2. vgg优点: 真正简化了神经网络结构, 构造过程也非常条理. 缺点: 训练的参数非常爆炸(1.38亿).
    3. 阅读建议: 非常值得一读.
  • ResNet (作者: kaiminghe)

    image.png 上图: residual block(残渣模块), 蓝色箭头叫shortcut(又称short connection等). 注意: shortcut连接位置在z[l+2]和a[l+2]之间, 连接方式是”对应相加”. 另外: ResNet核心在于shortcut的添加—拥有学习恒等映射的能力(后面细说), 所以你可以将shortcut拓展到其他网络中, 让其他网络也拥有学习恒等映射的能力. image.png 上图: resnet解决了”网络退化”问题

    1. 网络退化问题是什么呢?

    答: 更深的网络反而效果更差, 产生原因是网络更难优化, 而非过拟合. 注意: resnet在上千层之后也会出现深度越深效果越差, 但这是过拟合问题, 而非网络退化

    1. 残差学习为什么奏效?

    image.png

    1. 它能学习恒等映射, 解决网络退化问题degradation problem, 使让深的网络不至于比浅层网络差. 当F(x)无用时, 可将其中网络层参数学习为0, 此时F(x)==0, 那么由H(x) = F(x) + x可知, 此时也有H(x) = x.
    2. 上图的细节
      1. 1: Resnet输出的激活函数是relu, 这意味着 g(a[l]) = a[l]
      2. 上图的细节2: 为保证残渣和主干能相加, 可以让shortcut进行卷积, 通常是1x1卷积, 以改变其尺度或通道.
  • Inception Net

    image.pngimage.png

    细节:

    1. 其他softmax分支的作用: 这是对网络的正则化, 防止过拟合. (不管是头部或中间的softmax都能用不错的效果, 这防止了网络过度学习)
    2. 大量利用了conv1x1来降低计算成本.

    阅读建议: 选读.

对conv1x1的思考

image.png

  1. conv1x1首先是参数共享的(具体而言是在hxw上是共享的, channel维度方向上并不共享) . 可以说, conv1x1并没有对featuremap做特征提取, 而是在featuremap层上进行带权重的组合的尝试, 进行多少个conv1x1, 就有多种上述的尝试, 最终的输出也是这些不同featuremap层组合的堆叠. conv1x1的整个过程非常像全连接层, 只不过神经单元被替代为了featuremap而已.
  2. 大输入和大输出之间的卷积的计算量非常大, 可以先用conv1x1来降低通道, 来降低整体计算成本, conv1x1因此被称为瓶颈层.(两头大,中间小).

github

  1. git clone https://github.com/xxx/.git

迁移学习

image.png

一般来讲, 你的数据越多, 允许你少冻结(参数不学习)一些层. (更多, 参考第三部分的迁移学习)

数据扩增

image.png

在基准数据benckmarkdata上的技巧(赢得比赛)

  • 集成Ensembling

独立地训练多个神经网络,并对这些输出的均值作为最终结果. (约提高1~2%)

  • 多重剪切Multi-crop at test time

    image.png 如上, 在分类任务中. 在测试时, 将数据进行中间以及四周的剪切, 将这些剪切都拿来测试模型, 并对这些输出的均值作为最终结果.

  • 开源代码

    image.png

目标定位

image.png

输入: 图片 输出: 向量….{类标签 ; boundingbox(bx,by,bh,bw); } 损失函数: 如上. 损失分为两部分, 1. 判断存在是否正确 2. 如果判为存在且判断正确, 那么计算boundingbox的误差.

特征点检测

image.png

输入: 图片 输出: 向量…{检测物体是否在 ; 检测点们的地标landmark}

目标检测(基于滑动窗口的思路):

image.png

  1. 滑动窗口实现目标检测的的思路: 将图片按窗口裁剪并送其到卷积网络中判断当前窗口是否有目标存在(0,1), 然后滑动窗口重复以上操作.
  2. 滑动窗口的实现: 实际上, 我们并不使用裁剪, 而是用卷积运算来实现滑动窗口(的前向计算)

image.png

目标检测(基于yolo算法)

image.png

如上, 将图片分格. 输入: 图片 输出: 3x3x”n”x8维度. 其中3x3即网格的划分规格. nx8即每个网格中的n个目标的检测结果, 该结果构成是 {Anchor box 1, Anchor box2,…, Anchor box n }, 其中每个Anchorbox表示{检测的可能性; boundingbox; 该目标的分类”hotone”} Anchor box: 多个目标出现在同一个网格(目标中心点所在网格为准)

目标检测(更好的yolo算法): 以检测2个目标(车和行人)为例

image.png

  1. boundingbox的精确度. 根据检测到的可能Pc, 丢弃部分Anchorbox.

image.png

  1. 定位准确性(交并比LoU). 根据此, 丢弃Anchorbox. 注: LoU = “(A&B)的面积 / (A|B)的面积”, 惯例LoU >=0.5比较好

image.png

  1. No max suppression. 输出最大可能性的分类判断 ,并抑制最大可能周围的那些检测框

目标检测(基于R-CNN): Region proposal (效率依然比不过yolo算法)

image.png

通过图像分割(找到约2000个颜色区域)来确定候选区域, 在上面放置boundingbox,以替代滑动窗口机制.

image.png

人脸识别(单样本学习问题与孪生网络)

image.png 解决单样本学习问题one-shot的办法是: 学习一个”相似性”函数(见孪生网络). 注: 为什么会有单样本学习呢? 比如机场的人脸识别关卡, 由于数据库只有少量你的个人的照片, 又或者难道每加入一个人都要重新训练模型吗? 基于以上原因所以进行单样本学习

image.png

如上, 孪生网络Siamese: 模型输出softmax,其语义好比”编码”, 相似性函数即L2范数
image.png

人脸识别(基于孪生网络的FaceNet为例): 三元组损失triplet loss

image.png

如上, 三元组损失triplet loss 即以Anchor,Postive,Negative构成的损失. 注1: d(A,P) = f(A) - f(P), d(A,P)含义是A和P的编码差异性(实现上是L2范数), d(A,N)同理. 注2: 公式中的theta是超参数(一般设置为0.2), theta其含义是margine, 目的是拉大d(A,P) 和 d(A,N)的距离. (另注: 如果不加margine,那么在f(A),f(P),f(N)均被学习为0的情况下, 总是被满足的损失为0, 而实际上该结果并符合我们的需求) image.png

注: 每个人都需要一定数量的人脸, 因为d(A,P)的原因.

人脸识别(基于孪生网络的DeepFace为例)

image.png

DeepFace本质: 把人脸识别当做基于孪生网络的二元分类问题 输出为0或1, 绿色字体是变种公式.

风格转换以及代价函数 (注: 涉及生成器对抗网络)

image.png

image.png 注: 内容损失函数: 其比较的是生成的图片与内容图片在同一个预训练好的网络(比如VGG)的隐藏层中特征层的相似度(用L2距离衡量). image.png 上图, 风格损失由风格矩阵的建立. 其中上标S和上标G分别表示风格图片和生成图片, 我们将这两个图片分别输入同一个预训练模型中计算Gram矩阵(即图中的大G, 衡量了不同特征层(k!=k’)的相关性(实际上未标准化的互协方差).在这里作为风格矩阵(参考链接)), 然后求风格图片和生成图片的Gram矩阵之间的F范数作为风格损失函数. Gram矩阵解释: image.png

  • 关键点: 理解feature map的含义以及将feature map不同通道之间的关系转换到风格上
  • 格拉姆矩阵可以看做feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵),在feature map中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度,而Gram计算的实际上是两两特征之间的相关性,哪两个特征是同时出现的,哪两个是此消彼长的等等,同时,Gram的对角线元素,还体现了每个特征在图像中出现的量,因此,Gram有助于把握整个图像的大体风格。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。

论文: Gatys et al., 2015. A neural algorithm of artistic style Images on slide generated by Justin Johnson 阅读建议: 看

另注: Zeiler and fergus, 2013, Visualizing and understanding convolutional networks 通过对深度卷积网络的特征层的可视化, 让我们知道特征层的含义. 这能帮助我们理解风格损失. 阅读建议: 看