1.人脸验证和人脸识别
人脸验证是1to1问题,输入图片,名字,ID等,输出是否为正确的人
人脸识别有一个包含K个人的数据库,输入一张图片,输出对应ID
人脸识别相对于人脸验证需要更高的精度,因为错误率会被放大K倍(K为数据库包含的人数)
2.one short learning
对于一个包含K个人的数据库,输入一张图片,如果输出是一个K维softmax向量的话,那么对于数据库每一次更新,都需要重新训练,而且需要改变输出的维度,因此提出了one short learning,即输出为两个图片的差异,低于一定值即可认为是同一个人。
3.Siamese Network
针对上述问题提出了Siamese 网络
上方和下方是完全相同的两个卷积神经网络。该网络去掉最后的softmax层,输出一个N维向量,称为图片的“encoding“”,并定义了similarity函数
4. Triplet loss
对于输出的图片的encoding,定义了 Triplet loss:
选取三元组A,N,P分别代表anchor,negative负样本,和positive正样本。满足:
同时为了使等式左右两边不为0或不相等,这里加上一个
使正负样本之间差距变大:
至于triplet loss定义:
所要做的是最小化总triplet cost:
(末尾小加号表示max(x,0))对于三元组的选择,要满足
这样算法会尽可能使d(A,P)变小,d(A,N)变大
5.面部验证与二分类
根据之前的网络进一步改进,输出1表示相同的人,0表示不同的人
可将两个向量对应元素之间差值的绝对值输入到逻辑回归单元中
还可以用
公式代替作为输入:
在实际的人脸识别系统中,会对保存的图片进行预处理,存储图片编码,仅对需要识别的图片进行编码处理,如此可提高效率。
6.神经风格迁移
由内容图片C和风格图片S,生成最终图片G
代价函数J定义如下:
用梯度下降法最小化代价函数
对于内容代价函数,浅层网络趋向于检测简单的低等级特征,深层网络趋向于检测复杂的特征,我们需要使生成图片与内容图片的内容相似,因而选取中间层计算代价函数
作业中定义的内容代价函数:
对于风格代价函数,首先介绍gram matrix
# GRADED FUNCTION: compute_layer_style_cost
def compute_layer_style_cost(a_S, a_G):
"""
Arguments:
a_S -- tensor of dimension (1, n_H, n_W, n_C), hidden layer activations representing style of the image S
a_G -- tensor of dimension (1, n_H, n_W, n_C), hidden layer activations representing style of the image G
Returns:
J_style_layer -- tensor representing a scalar value, style cost defined above by equation (2)
"""
### START CODE HERE ###
# Retrieve dimensions from a_G (≈1 line)
m, n_H, n_W, n_C = a_G.get_shape().as_list()
# Reshape the images to have them of shape (n_H*n_W, n_C) (≈2 lines)
a_S = tf.reshape(a_S, [n_H * n_W, n_C])
a_G = tf.reshape(a_G, [n_H * n_W, n_C])
# Computing gram_matrices for both images S and G (≈2 lines)
GS = gram_matrix(tf.transpose(a_S))
GG = gram_matrix(tf.transpose(a_G))
# Computing the loss (≈1 line)
J_style_layer = (1/(4 * n_C * n_C * n_H * n_W * n_H * n_W))*tf.reduce_sum(tf.square(tf.subtract(GS, GG)))
### END CODE HERE ###
return J_style_layer
风格损失函数:
其中
,
分别表示风格矩阵S,生成矩阵G的gram matrix,L为层数,然后与权重相乘再相加: