DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换
一、什么是人脸识别
老实说这一节中的人脸识别技术的演示的确很牛bi,但是演技好尴尬,233333
啥是人脸识别就不用介绍了,下面笔记会介绍如何实现人脸识别。
二、One-shot(一次)学习
假设我们发财了,开了一家公司。然后作为老板的我们希望与时俱进,所以想使用人脸识别技术来实现打卡。
假如我们公司只有4个员工,按照之前的思路我们训练的神经网络模型应该如下:
如图示,输入一张图像,经过CNN,最后再通过Softmax输出5个可能值的大小(4个员工中的一个,或者都不是,所以一一共5种可能性)。
看起来好像没什么毛病,但是我们要相信我们的公司会越来越好的啊,所以难道公司每增加一个人就要重新训练CNN以及最后一层的输出数量吗?
这显然有问题,所以有人提出了一次学习(one-shot),更具体地说是通过一个函数来求出输入图像与数据库中的图像的差异度,用\(d(img1,img2)\)表示。
如上图示,如果两个图像之间的差异度不大于某一个阈值 τ,那么则认为两张图像是同一个人。反之,亦然。
下一小节介绍了如何计算差值。
三、Siamese网络
注意:下图中两个网络参数是一样的。
先看上面的网络。记输入图像为\(x^{(1)}\),经过卷积层,池化层和全连接层后得到了箭头所指位置的数据(一般后面还会接上softmax层,但在这里暂时不用管),假设有128个节点,该层用\(f(x^{(1)})\)表示,可以理解为输入\(x^{(1)}\)的编码。
那么下一个网络同理,不再赘述。
因此上一节中所说的差异度函数即为
\(d(x^{(1)},x^{(2)})=||f(x^{(1)})-f(x^{(2)})||^2\)
问题看起来好像解决了,但总感觉还漏了点什么。。。
没错!!!
你没错!!!
神经网络的参数咋确定啊?也就是说\(f(x^{(i)})\)的参数怎么计算呢?
首先我们可以很明确的是如果两个图像是同一个人,那么所得到的参数应该使得\(||f(x^{(1)})-f(x^{(2)})||^2\)的值较小,反之较大。(如下图示)
沿着这个思路我们继续看下一小节内容~~~
四、Triple损失
1. Learning Objective
这里首先介绍一个三元组,即 (Anchor, Positive, Negative),简写为(A,P,N)
Anchor: 可以理解为用于识别的图像
Positive: 表示是这个人
Negative: 表示不是同一个人
由上一节中的思路,我们可以得到如下不等式:
\(d(A,P)\leqq d(A,N)\),即\(||f(A)-f(P)||^2-||f(A)-f(N)||^2\leqq0\) (如下图示)
但是这样存在一个问题,即如果神经网络什么都没学到,返回的值是0,也就是说如果\(f(x)=\vec{0}\)的话,那么这个不等式是始终成立的。(如下图示)
为了避免上述特殊情况,而且左边值必须小于0,所以在右边减去一个变量\(α\),但是按照惯例是加上一个值,所以将\(α\)加在左边。
综上,所得到的参数需要满足如下不等式
\(||f(A)-f(P)||^2-||f(A)-f(N)||^2+α\leqq0\)
2. Lost function
介绍完三元组后,我们可以对单个图像定义如下的损失函数(如下图示)
\(L(A,P,N)=max(||f(A)-f(P)||^2-||f(A)-f(N)||^2+α,0)\)
解释一下为什么用max函数,因为如果只要满足\(||f(A)-f(P)||^2-||f(A)-f(N)||^2+α\leqq0\),我们就认为已经正确识别出了图像中的人,所以对于该图像的损失值是0.
所以总的损失函数是 : \(J=\sum{L(A^{(i)},P^{(i)},N^{(i)})}\)
要注意的是使用这种方法要保证每一个人不止有一张图像,否则无法训练。另外要注意与前面的One-shot区分开来,这里是在训练模型,所以训练集的数量要多一些,每个人要有多张照片。而One-shot是进行测试了,所以只需一张用于输入的照片即可。
3. Choosing the triplets(A,P,N)
还有一个很重要的问题就是如何选择三元组(A,P,N)。因为实际上要满足不等式\(d(A,P)+α\leqq d(A,N)\)是比较简单的,即只要将Negative选择的比较极端便可,比如anchor是一个小女孩,而Negative选择一个老大爷。
所以还应该尽量满足\(d(A,N)\approx{d(A,N)}\)
五、面部验证与二分类
通过以上内容,我们可以确定下图中的网络的参数了,那么现在开始进行面部验证了。
上面的是测试图,下面的是数据库中的一张照片。
和之前一样假设\(f(x^{(i)})\)有128个节点,之后这两个数据作为输入数据输入到后面的逻辑回归模型中去,即
\(\hat{y}=σ(\sum_{k=1}^{128}w_i|f(x^{(i)})_k-f(x^{(j)})_k|+b_i)\)
若\(\hat{y}=1\),为同一人。反之,不是。
如下图示,绿色下划线部分可以用其他公式替换,即有
\(\hat{y}=σ(\sum_{k=1}^{128}w_i \frac{(f(x^{(i)})_k-f(x^{(j)})_k)^2}{f(x^{(i)})_k+f(x^{(j)})_k}+b_i)\)
当然数据库中的图像不用每次来一张需要验证的图像都重新计算,其实可以提前计算好,将结果保存起来,这样就可以加快运算的速度了。
六、什么是神经风格转换
如下图示,不多赘述。
七、深度卷积网络在学什么?
八、代价函数
如下图示:
左上角的包含Content的图片简称为C,右上角包含Style的简称S,二者融合后得到的图片简称为G。
我们都知道计算问题必须是有限的,所以融合的标准是什么?也就是说Content的保留程度和Style的运用程度如何取舍呢?
此时引入损失函数,并对其进行最优化,这样便可得到最优解。
\(J(G)=αJ_{Content}(C,G)+βJ_{Style}(S,G)\)
\(J_{Content}(C,G)\)表示图像C和图像G之间的差异,\(J_{Style}(S,G)\)同理。
计算过程示例:
- 随机初始化图像G,假设为100*100*3 (如下图右边四个图像最上面那个所示)
- 使用梯度下降不断优化J(G)。 (优化过程如下图右边下面3个图像所示)
下面一小节将具体介绍损失函数的计算。
九、内容代价函数
- 首先假设我们使用第\(l\)层隐藏层来计算\(J_{Content}(C,G)\),注意这里的\(l\)一般取在中间层,而不是最前面的层,或者最后层。
原因如下:
- 假如取第1层,那么得到的G图像将会与图像C像素级别的相似,这显然不行。
- 假如取很深层,那么该层已经提取出了比较重要的特征,例如图像C中有一条狗,那么得到的图像G会过度的保留这个特征。
然后使用预先训练好的卷积神经网络,如VGG网络。这样我们就可以得到图像C和图像G在第\(l\)层的激活函数值,分别记为\(a^{[l][C]},a^{[l][G]}\)
内容损失函数 \(J_{Content}(C,G)=\frac{1}{2}||a^{[l][C]}-a^{[l][G]}||^2\)
十、风格损失函数
1.什么是“风格”
要计算风格损失函数,我们首先需要知道“风格(Style)”是什么。
我们使用\(l\)层的激活来度量“Style”,将“Style”定义为通道间激活值之间的相关系数。(Define style as correlation between activation across channels)
那么我们如何计算这个所谓的相关系数呢?
下图是我们从上图中所标识的第\(l\)层,为方便说明,假设只有5层通道。
如上图示,红色通道和黄色通道对应位置都有激活项,而我们要求的便是它们之间的相关系数。
但是为什么这么求出来是有效的呢?为什么它们能够反映出风格呢?
继续往下看↓
2.图像风格的直观理解
如图风格图像有5层通道,且该图像的可视化特征如左下角图所示。
其中红色通道可视化特征如图中箭头所指是垂直条纹,而黄色通道的特征则是橘色背景。
那么通过计算这两层通道的相关系数有什么用呢?
其实很好理解,如果二者相关系数性强,那么如果出现橘色背景,那么就应该很大概率出现垂直条纹。反之,亦然。
3.风格相关系数矩阵
令\(a_{i,j,k}^{[l]}\)表示(i,j,k)的激活项,其中i,j,k分别表示高度值(H),宽度值(W)以及所在通道层次(C)。
风格矩阵(也称为“Gram Matrix”)用\(G^{[l]}\)表示,其大小为\(n_c^{l]}*n_c^{l]}\).
因此风格图像的风格矩阵为:
\[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)}\]
生成图像的相关系数矩阵
\[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)}\]
4.风格损失函数
第\(l\)层的风格损失函数为:
\[J_{Style}^{[l]}=\frac{1}{(2n_H^{[l]}n_W^{[l]}n_C^{[l]})^2}\sum_{k}\sum_{k'}(G_{kk'}^{[l](S)}-G_{kk'}^{[l](G)})\]
总的风格损失函数:
\[J_{Style}(S,G)=\sum_{l}λ^{[l]}J_{Style}^{[l]}(S,G)\]
DeepLearning.ai学习笔记(四)卷积神经网络 -- week4 特殊应用:人力脸识别和神经风格转换的更多相关文章
- DeepLearning.ai学习笔记汇总
第一章 神经网络与深度学习(Neural Network & Deeplearning) DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络 DeepLe ...
- DeepLearning.ai学习笔记(三)结构化机器学习项目--week2机器学习策略(2)
一.进行误差分析 很多时候我们发现训练出来的模型有误差后,就会一股脑的想着法子去减少误差.想法固然好,但是有点headlong~ 这节视频中吴大大介绍了一个比较科学的方法,具体的看下面的例子 还是以猫 ...
- CNN学习笔记:卷积神经网络
CNN学习笔记:卷积神经网络 卷积神经网络 基本结构 卷积神经网络是一种层次模型,其输入是原始数据,如RGB图像.音频等.卷积神经网络通过卷积(convolution)操作.汇合(pooling)操作 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍
一.计算机视觉 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计算量会巨大,显然这不现实.所以需要引入其他的方法来 ...
- DeepLearning.ai学习笔记(四)卷积神经网络 -- week2深度卷积神经网络 实例探究
一.为什么要进行实例探究? 通过他人的实例可以更好的理解如何构建卷积神经网络,本周课程主要会介绍如下网络 LeNet-5 AlexNet VGG ResNet (有152层) Inception 二. ...
- DeepLearning.ai学习笔记(一)神经网络和深度学习--Week3浅层神经网络
介绍 DeepLearning课程总共五大章节,该系列笔记将按照课程安排进行记录. 另外第一章的前两周的课程在之前的Andrew Ng机器学习课程笔记(博客园)&Andrew Ng机器学习课程 ...
- deeplearning.ai 卷积神经网络 Week 4 特殊应用:人脸识别和神经风格转换 听课笔记
本周课程的主题是两大应用:人脸检测和风格迁移. 1. Face verification vs. face recognition Verification: 一对一的问题. 1) 输入:image, ...
- 深度学习笔记 (一) 卷积神经网络基础 (Foundation of Convolutional Neural Networks)
一.卷积 卷积神经网络(Convolutional Neural Networks)是一种在空间上共享参数的神经网络.使用数层卷积,而不是数层的矩阵相乘.在图像的处理过程中,每一张图片都可以看成一张“ ...
- 【学习笔记】卷积神经网络 (CNN )
前言 对于卷积神经网络(cnn)这一章不打算做数学方面深入了解,所以只是大致熟悉了一下原理和流程,了解了一些基本概念,所以只是做出了一些总结性的笔记. 感谢B站的视频 https://www.bili ...
随机推荐
- 好程序员技术教程分享JavaScript运动框架
好程序员技术教程分享JavaScript运动框架,有需要的朋友可以参考下. JavaScript的运动,即让某元素的某些属性由一个值变到另一个值的过程.如让div的width属性由200px变到400 ...
- .NET CORE微服务中CONSUL的相关使用
.NET CORE微服务中CONSUL的相关使用 1.consul在微服务中的作用 consul主要做三件事:1.提供服务到ip的注册 2.提供ip到服务地址的列表查询 3.对提供服务方做健康检查(定 ...
- Linux内核入门到放弃-Ext2数据结构-《深入Linux内核架构》笔记
Ext2文件系统 物理结构 结构概观 块组是该文件系统的基本成分,容纳了文件系统的其他结构.每个文件系统都由大量块组组成,在硬盘上相继排布: ----------------------------- ...
- AI 强化学习
强化学习(reinforcement learning,简称RL), agent policy state action 目标 最大化累计reward 参考链接: https://en.wikipe ...
- TensorRT&Sample&Python[introductory_parser_samples]
本文是基于TensorRT 5.0.2基础上,关于其内部的introductory_parser_samples例子的分析和介绍. 1 引言 假设当前路径为: TensorRT-5.0.2.6/sam ...
- keepalived--小白博客
一.HA集群中的相关术语 1.节点(node) 运行HA进程的一个独立主机,称为节点,节点是HA的核心组成部分,每个节点上运行着操作系统和高可用软件服务,在高可用集群中,节点有主次之分,分别称之为主节 ...
- 工具(3): 转换Excel表格到MarkDown:exceltk
源码和下载: 0.1.3 mac: https://github.com/fanfeilong/exceltk/blob/master/pub/exceltk.0.1.3.pkg windows: h ...
- fiddler抓包App数据
在做手机或移动端APP的接口测试时,需要从开发人员那里获取接口文档,接口文档应该包括完整的功能接口.接口请求方式.接口请求URL.接口请求参数.接口返回参数.如果当前项目没有接口文档,则可以使用fid ...
- vue組件傳值及vuex的使用
https://blog.csdn.net/u011175079/article/details/79161029 https://blog.csdn.net/sisi_chen/article/de ...
- Linux squid代理
代理的作用: 共享网络 : 加快访问速度,节约通信带宽 : 防止内部主机受到攻击 : 限制用户访问,完善网络管理: 标准代理: 首先要在内部主机指定代理服务器的IP和port,然后通过代理服务器访问外 ...