zoukankan      html  css  js  c++  java
  • 吴恩达深度学习笔记 course4 week 4 特殊应用:人脸识别与神经风格转换

     1.What is face recognition?

    人脸验证:

    input:图片,名字/ID

    output:是否为对应的那个人             (一对一问题)

    人脸识别:

    有一个数据库有K个人

    input:图片

    output:如果图片是对应的K人中的一人,则输出此人ID,否则验证不通过    ,人脸识别比人脸验证更难一些,如果一个人脸验证系统的正确率为99%,即错误率为1%,将这个人脸验证系统应用到另一个人脸识别系统,犯错几率就变为了K倍.即K%

    2.One-shot learning

    one-shot learning 指数据库中的每个人都只有一个样本,利用这一个样本来训练一个CNN模型来进行人脸识别.

    若数据库有K个人,则CNN模型输出softmax层就是K维的。

    缺点:

    1.每个人只有一个样本,样本少,训练的CNN 不够健壮

    2.当加入一个新成员的时候,需要对模型进行重新训练,使softmax的维度加一,这增大了模型的计算量

    为了解决这一问题,引入similarity 函数:

    similarity  function:

    • d(img1, img2):两幅图片之间的差异度
    • 输入:两幅图片
    • 输出:两者之间的差异度
    • 如果 d(img1,img2)τd(img1,img2)≤τ,则输出“same”;
    • 如果 d(img1,img2)>τd(img1,img2)>τ,则输出“different”.

    对于人脸识别,只需要计算图片与数据库中的K张图片的d(img1,img2),取最小的为目标的匹配对象,若都很大,则数据库中没有此人

    3.Siamese Network

    Siamese network是指将一般的CNN去掉softmax所得到的网络

    将每个人的图片输入参数相同的网络结构后,将最后的一个全连接层所得到的向量看成是原图片的编码

    构建Siamese network后,Similarity funtion用两图片的编码差范数表示:

     d(x1,x2)=f(x1)f(x2)22

    接下来我们要学习参数来 使得表示同一个人的图片的范数差变得小,而表示不同人的图片的范数差变得大

    4.Triplet Loss

    让网络学习参数,构建合理的CNN,需要定义损失函数.我们引入Triplet Loss.

    学习的目标:

    Anchor(靶目标).  Positive(与靶目标相同). Negative(与靶目标相反).

    我们希望Anchor与Postive的图像编码接近一些,而Anchor与Negative的编码不同一些,即||f(A)f(D)||2尽可能小,而||f(A)f(N)||2尽可能大,我们列出如下式子:

    但这种情况的时候 f(A),f(P),f(N)都为0的时候也满足这个表达式,但不是我们想要的结果,于是我们对上式进行修改,

    其中α为超参数,且α大于0                顺便提一下,这里的α也被称为边界margin,类似与支持向量机中的margin。举个例子,若d(A,P)=0.5d(A,P)=0.5,α=0.2,则d(A,N)0.7

    Loss Function如下:

     L(A,P,N)=max(f(A)f(P)2f(A)f(N)2+α,0)  

    这里triplet损失函数:当前者<=0时,则L(A, P, N) = 0,即损失函数为0;当前者>0时,则L(A, P, N) = 前者,此时,利用梯度下降降低损失函数,正好达到训练参数的目的,最终训练好的参数只训练到d(A, N) - d(A, P) >= alpha,即满足margin要求。

    Cost Function:

    在选择我们的A,P,N时,如果A,P太容易满足d(A,P)+α<=d(A,N),

    网络不需要经过复杂训练就能实现这种明显识别,但是抓不住关键区别。所以,最好的做法是人为选择A与P相差较大(例如换发型,留胡须等),A与N相差较小(例如发型一致,肤色一致等)。这种人为地增加难度和混淆度会让模型本身去寻找学习不同人脸之间关键的差异,“尽力”让d(A,P)更小,让d(A,N)更大,即让模型性能更好。

    值得一提的是,现在许多商业公司构建的大型人脸识别模型都需要百万级别甚至上亿的训练样本。如此之大的训练样本我们一般很难获取。但是一些公司将他们训练的人脸识别模型发布在了网上,可供我们使用。

    5.Face verification and binary classfication

    除了用Trilet loss外,我们还可以使用二分类结构

    在两个Siamese Network组合在一起,在每个的编码输出后加一个逻辑处理单元,该单元使用sigmoid函数,输入两张图片,若相同则输出1,否则输出0,这就将一个人脸识别问题转化成了一个二分类问题

    其输出的表达式为

    参数w_k,和b都是经过训练得到的

    还有一个表达式为

    上式被称为χ方公式,也叫χ方相似度.

    在实际的人脸验证系统中,我们可以对数据库的人脸图片进行预计算,存储卷积网络得到的编码。当有图片进行识别时,运用卷积网络计算新图片的编码,与预计算保存好的编码输入到逻辑回归单元中进行预测。这样可以提高我们系统预测的效率,节省计算时间。

    (注:该trick也同样可以用到上面triplet loss function中,即提前将图片进行预编码(走一遍Siamese网络,得到去掉softmax层的输出神经元的值),就避免了后续再对数据库image进行计算编码,提升了效率,如果不存储图片,同时还能节省空间(对于大型数据集)。)

    6.What is nerual style transfer?

    神经风格迁移即是将一张图片的风格迁移到另一张图片的风格中,生成一张新的图片

    一般用C表示内容图片,用S表示风格图片,用G表示生成图片

    7.What is deep ConvNets learning?

    卷积神经网络每一层究竟在学什么?

    如何得知卷积神经网络在学什么?

    1.挑选一个单元

    2.遍历训练集,寻找激活输出最大的的图片或图片块

    3.对其他运算单元(不同滤波器通道)执行操作2

    可以看出第一层通常会找一些简单的特征,如边缘,阴影等

    随着层数的加深,所找的特征越来越复杂,从边缘到纹理再到具体物体。

    8.Cost funtion 

    风格迁移的Cost Function如下:

    J(G)=αJcontent(C,G)+β⋅Jstyle(S,G)

    其中 α,β为超参数,Jcontent(C,G),Jstyle(S,G)为图片C,G 与S,G的相似度

    如何得到 G:

    1.先随机初始化G

    2.根据梯度下降算法最小化cost function来计算出得到G

    9.Content cost function 

    Content cost function

    假设我们正在使用l层来计算Jcontent(C,G)

    使用已经训练好的卷积神经网络(如:VGG)

    让我们分别使用a[l](C),a[l](G)来表示图片C,图片G 在l层的激活输出

    如果a[l](C),a[l](G)相似,则两者有相似的内容

    (注:如果l层选的太小,那代价函数会使得生成图片G在像素上与内容图片C有相同的内容,如果l层选的太深,那么会使得生成图片G出现图片C上的物体,所以对l层的选取,应该既不深也不浅)


    content cost function:

    Jcontent(C,G)=1/2||a[l](C)a[l](G)||2

    通过梯度下降不断修正G的值,使得Jcontent不断减小

    10.Style cost function

    一幅图片的"style"的意思,

    假设你正在使用l层的激活来测量"style"

    定义风格为不同通道激活项之间的相关性(激活项的乘积)

    (注:上述定义是风格转义的本质,即保证生成图片各通道激活项之间的相关性与参考图片各通道激活函数项之间的相关性近似。)

     

    那么如何取判断相关或不相关,如下图所示:

    不同通道即为神经网络所学习的特征,假设红色通道即为提取图片的垂直特征,黄色通道为提取图片橙色背景

    这两个通道之间的相关性大小即为原始图片中包含垂直特征的区域同时为橙色区域的大小.

    我们将相关系数应用到风格图片S和生成图片G的对应通道上,就可以度量风格图片和生成图片的相似度。

    Style矩阵

     11.1D and 3D generalizations of models

    我们之前所讲的卷积都是2D的,我们可以推广到1D和3D

    1D:

    3D:

    补充参考自:https://blog.csdn.net/red_stone1/article/details/79055467

    https://blog.csdn.net/Dby_freedom/article/details/79883452

  • 相关阅读:
    io工具类
    并发高级知识
    HashMap相关源码阅读
    ArrayList和LinkedList部分源码分析性能差异
    我自己的JdbcTemplate
    mysql5.7.20靠谱安装步骤
    NG 转发配置
    SQLite总结
    算是不常用的东西,java中的ResultSet转List
    不常用的技能-【手动编译java类】
  • 原文地址:https://www.cnblogs.com/Dar-/p/9601503.html
Copyright © 2011-2022 走看看