课程来源:网易云课堂与coursera
一、神经风格转化
1、理论
- 问题描述:给定一张需要转化的内容图像(C)一张想要转化成的风格的图像(S),通过无监督学习的方法将其转化为有S风格的内容图像G。
- 解决方案:对C、S、G三个图像定义一个损失函数J,在对损失函数的优化过程中完成对G的训练,也就是说C、S是固定输入,G是通过训练优化的参数。
- 损失函数J分为两个部分:内容损失函数,与C、G有关;风格损失函数,与S、G有关。
- 内容损失函数定义:C图像的某一层的卷积输出与G图像的某一层的卷积输出的相似程度,公式如下,C和G的大小都是(nH,nW,nC),a表示某一层激活层的输出:
J c o n t e n t ( C , G ) = 1 4 × n H × n W × n C ∑ all entries ( a ( C ) − a ( G ) ) 2 J_{content}(C,G) = \frac{1}{4 \times n_H \times n_W \times n_C}\sum _{ \text{all entries}} (a^{(C)} - a^{(G)})^2 Jcontent(C,G)=4×nH×nW×nC1all entries∑(a(C)−a(G))2 - 风格损失函数定义:定义Gram matrix表示图像的风格表征,也就是下面公式中的Gij。计算图像S和图像G各自风格表征的接近程度。
J s t y l e ( S , G ) = ∑ l λ [ l ] J s t y l e [ l ] ( S , G ) J_{style}(S,G) = \sum_{l} \lambda^{[l]} J^{[l]}_{style}(S,G) Jstyle(S,G)=l∑λ[l]Jstyle[l](S,G)
这个是每一层的风格损失值的加权和,风格损失计算方法如下:
J s t y l e [ l ] ( S , G ) = 1 4 × n C 2 × ( n H × n W ) 2 ∑ i = 1 n C ∑ j = 1 n C ( G i j ( S ) − G i j ( G ) ) 2 J_{style}^{[l]}(S,G) = \frac{1}{4 \times {n_C}^2 \times (n_H \times n_W)^2} \sum _{i=1}^{n_C}\sum_{j=1}^{n_C}(G^{(S)}_{ij} - G^{(G)}_{ij})^2 Jstyle[l](S,G)=4×nC2×(nH×nW)21i=1∑nCj=1∑nC(Gij(S)−Gij(G))2
其中,Gram matrix的定义是 G i j = v i T v j = n p . d o t ( v i , v j ) {\displaystyle G_{ij} = v_{i}^T v_{j} = np.dot(v_{i}, v_{j}) } Gij=viTvj=np.dot(vi,vj),最后得到的矩阵是nc*nc,每一个元素都一定程度代表对应的两个通道之间的相似程度。
- 注意,这里内容损失函数只计算一层,但是风格损失函数计算多层
- 两个损失值合并,α和β都是超参:
J ( G ) = α J c o n t e n t ( C , G ) + β J s t y l e ( S , G ) J(G) = \alpha J_{content}(C,G) + \beta J_{style}(S,G) J(G)=αJcontent(C,G)+βJstyle(S,G)
2、代码
可以参考【中英】【吴恩达课后编程作业】Course 4 -卷积神经网络 - 第四周作业
二、人脸识别
1、理论
- 人脸识别的应用可以分为两类:
- Face Verification:研究的问题是给定一个人脸+id与数据中存有的对应id的人脸进行比对,判断是否是这个人,是1比照1的应用(目前高铁站使用的就是这种)
- Face Recognition:研究问题是给定一个人脸与数据中存有的所有人脸进行比对,判断是否在其中,是1比照K的应用
- 虽然这两种应用是不一样的,但是后者实际上是前者的升级版,两者有很多共同之处,可以借鉴。
- 人脸识别问题的解决思路:
- 首先,不能直接用图像进行比较,应该利用dnn将其表征为向量
- 这部分其实也是一个无监督问题,我们希望从这个神经网络中得到的是每个图对应的表征
- 训练的时候,我们通过对loss函数的构造,使得训练出来的表征可以使得同一个人的脸相似,不同的人的脸不同,对loss的定义如下:
(3) J = ∑ i = 1 m [ ∣ ∣ f ( A ( i ) ) − f ( P ( i ) ) ∣ ∣ 2 2 − ∣ ∣ f ( A ( i ) ) − f ( N ( i ) ) ∣ ∣ 2 2 + α ] + \mathcal{J} = \sum^{m}_{i=1} \large[ \small \mid \mid f(A^{(i)}) - f(P^{(i)}) \mid \mid_2^2 - \mid \mid f(A^{(i)}) - f(N^{(i)}) \mid \mid_2^2+ \alpha \large ] \small_+ \tag{3} J=i=1∑m[∣∣f(A(i))−f(P(i))∣∣22−∣∣f(A(i))−f(N(i))∣∣22+α]+(3)
其中,A表示输入的要验证的图像,P表示对应ID的图像,N表示随意的负例图像(具体训练,细节不明,待研究,可能类似于word2vec的负采样?),f()表示表征。
- 其次,比较向量之间的相似程度就可以判断人脸是否相似
- Face Verification研究的问题就是,给定的人脸的表征向量与给定id在数据中的表征向量的相似函数是否满足某个阈值
- Face Recognition研究的问题就是,从数据中找到给定的人脸的表征向量对应的id
- 首先,不能直接用图像进行比较,应该利用dnn将其表征为向量
- 可以提升准确程度的一些细节:
- 对图像进行剪裁预处理,只保留人脸部分,可以去掉一些干扰信息
- 对数据中的每个人多放几张照片(不同光线,不同时间下的)