本文是卷积神经网络的笔记。
4.1 什么是人脸识别
Face verification vs face recognition
- Face verification:
验证是不是某个人的脸
- Face Recognition:
识别这个人是谁
4.2 One-Shot 学习
只给一个训练样本就要学会识别。
思路一:
假设我们有4名员工。
训练一个CNN然后通过SoftMax输出这个人的类别,一共5类,第5类表示这个人不属于4名员工之一。
这个思路不太行,原因:
- 我们的数据库里只有一张员工的照片,训练样本太少
- 万一员工数目变动,则我们还需要重新修改模型。
思路二: 学习"Similarity"函数
定义两张人脸的相似函数:d(img1,img2)
{d(img1,img2)≤τd(img1,img2)>τ 同一个人 不同的人
4.3 ???????? Siamese网络
用这个网络学习"Similarity"函数
通过正常的一个神经网络正向传播到最后一层,得到一个人脸的特征向量。对于两张不同的人脸都进行这个操作,会得到两个特征向量f(x(i)),f(x(j))。之后我们可以定义Similarity函数为d(x(i),x(j))=∣∣f(x(i))−f(x(j))∣∣22
我们训练的目的是:
- 如果是两个样本x(i),x(j)是相同的人脸,则让这两者的距离d(x(i),x(j))越小越好。
- 如果是两个样本x(i),x(j)是不同的人脸,则让这两者的距离d(x(i),x(j))越大越好。
我觉得一个可能的实现方案是,在更新参数的时候改变符号。比如多分类人脸标签y的值如果表示类别编号,则可以考虑k=min(1,abs(y(i)−y(j)))
这样更新参数的时候就有w=w−α×dw×(−1)k,原因是如果没有负号就是梯度上升了。
接下来我们看看别人是怎么做的。
4.4 Triplet 损失
我们将图像分成3类(A,P,N):
- Anchor (A): 类似于数据库里面的一张数据图
- Positive §: 跟Anchor属于同一个类别的例子
- Negative (N): 跟Anchor属于不同的类别
我们希望能有:
d(A,P)=∣∣f(A)−f(P)∣∣2≤∣∣f(A)−f(N)∣∣2=d(A,N)
为了确保不会出现d(A,P)=d(A,N)=0的情况:,引入Hyperparameter Margin α (类似于SVM中的),因此我们的目的是找到d使得:
d(A,P)−d(A,N)+α≤0
因此,我们引入损失函数和成本函数
L(A,P,N)=max(d(A,P)−d(A,N)+α,0)
J=i=1∑mL(A(i),P(i),N(i))
具体实现
我们需要从数据集合里面选择一个人的两张图作为A和P,然后另一个人的一张图作为N。
如果随机选择的话,约束条件一般很容易实现。所以我们要选择很难符合这个不等式的Trpilets,这样可以增加模型学习效率。
4.5 Face Recognition和二分类

我们可以将这个问题转变为一个二分类的问题:
- 当两个人脸属于同一个类别的时候,y=1
- 当两个人脸属于不同的类别的时候,y=0
假设卷积网络的输出为一个128∗1的向量
我们可以将用两个人的脸的相似度作为输入来训练一个逻辑回归,如:
y^=σ(k=1∑128wk∣f(x(i))k−f(x(j))k∣+b)
或者使用χ2相似度:
y^=σ(k=1∑128wkf(x(i))k+f(x(j))k(f(x(i))k−f(x(j))k)2+b)
具体部署的加速
我们可以预先利用所有员工在数据库里面的照片计算他们的特征向量并存储,所以每次门禁的时候只要计算一张图片的正向传播即可,这样可以提高速度。
4.6 什么是神经风格转换?
用两张图片(Content和Style)得到一张新的图片(Generated image)

4.8 深度卷积网络在学什么?
看看网络不同层在学习什么
我们挑选了九个代表性的神经元,每一个神经元找到9幅使得它最大化的图片

- 第一层:看一些边缘的,看到的是比较小的图片块
- 第二层:找一些Pattern
4.8 ????代价函数
为神经风格迁移定义一个代价函数。
- Recap:
- Content: C
- Style: S
- Generated Image: G
我们为神经风格迁移定义的代价函数为:
J(G)=αJcontent(C,G)+βJStyle(S,G)
Rq:
其实这个想法还是比较自然的,因为从某种程度上来说,最后得到的图片G应该和Content和Style都相似。
具体实现步骤:
- 随机初始化G:100∗100∗3
- 对G中的每一个像素进行梯度下降,以最小化J(G)
G:=G−∂G∂J(G)
4.9 ???? 内容代价函数JContent(C,G)
鉴于4.8的可视化,我们可以选择一个合适的中间层l来计算Content Cost。
具体来说:
- 我们可以选择一个预先训练的卷积神经网络,如VGG。我们选择一个合适的层数l来查看网络的输出。(因为太浅,特征不够明显,太深则运算量太大)
- 类似于人脸识别,我们分别对图像C和图像G都进行一次正向传播至第l层,即此层网络的输出为a[l](C)和a[l](G)。
- 类比人脸识别,我们也可以引入这两幅图像的相似度作为代价函数
Jcontent(C,G)=21∣∣a[l](C)−a[l](G)∣∣F2
4.10 风格代价函数JStyle(S,G)
什么是一个图像的Style?
Style:在Activation里面不同通道的Correlation。
【图片】
Rq:
因为我们最后是固定神经元的权重的,所以可以把每一个卷积核想象成在图像上不同位置提取一个特征,而我们的特征层就描述了这个特征在图像上不同位置出现的“概率”。
通过计算两个不同神经元的相关程度,我们可以知道不同特征组合在图像的不同部分出现的概率。
具体计算第l层的风格及其代价函数:
感觉有点像协方差的计算。
记第l层Activation的输出上第(i,j,k)处的元素为:ai,j,k[l]
则我们可以定义样本第l层的风格矩阵为:
Gk,k′[l],(S)=i=1∑nH[l]j=1∑nW[l]ai,.j,k[l](S)ai,.j,k′[l](S)
Gk,k′[l],(G)=i=1∑nH[l]j=1∑nW[l]ai,.j,k[l](G)ai,.j,k′[l](G)
Rq:
- (S) 表示风格图片作为样本时候的输出,(G)代表我们输出的图片。
-
k,k′表示第k和k’个Channel。
- 这里矩阵用G表示是因为数学上这个矩阵称为"Gram Matrix"
- 这里感觉类似于一个独立下联合概率的做法(如pi 表示为i的概率,则pi∗pj表示同时为i和j的概率)。或者可以理解为一个向量积(Produit Scalaire)。
通过相似程度,我们引入第l层的代价函数:
JStyle[l](S,G)=(2nH[l]nW[l]nC[l])21∣∣G[l],(S)−G[l],(G)∣∣F2=(2nH[l]nW[l]nC[l])21k∑k′∑(Gk,k′[l],(S)−Gk,k′[l],(G))2
JStyle(S,G)
我们可以考虑每一层的线性组合,来定义最后的风格代价函数:
JStyle(S,G)=l∑λ[l]JStyle[l](S,G)
总结:
- 风格矩阵G[l]度量了l层中不同的特征探测器的相关程度。
4.11 1维到3维推广
卷积的基本规则:Channels数目相同!
数据描述
一维数据:(一般用循环神经网络而不用卷积神经网络)
二维数据:
三维数据:
- 例子1:CT数据(长宽高,高为不同深度的切片)
- 例子2:电影(每一帧对应一个画面)

其中绿色的是Kernel。
输入、Kernel、输出之间的尺寸关系

第四周测试重点:
- 神经风格转换被训练为无监督的学习任务。
- 在神经风格转换中,在优化算法的每次迭代中更新的是生成图像G的像素值。