撒拉嘿哟


  • 首页

  • 归档

  • 标签

【Translate】Learning a Similarity Metric Discriminatively, with Application to Face Verification

发表于 2019-02-01

翻译:Learning a Similarity Metric Discriminatively, with Application to Face Verification

1.Introduction

传统的方法使用对抗的方法(discriminative methods)解决识别问题,例如神经网络或者SVM,通常需要所有的类别(categories)提前知道。这些方法同样需要所有类别的训练例子都可以被使用。更重要的是,这些方法本质上受限于相当少的类别个数。这些方法不适合那些类别比较大的应用,和那些在训练过程中只知道类别的一部分子集的应用。这些应用包括人脸识别和人脸认证:类别的数量可以是几百或者上千,然鹅只有很少的例子对于每个类别。解决这类问题的常见的方法是基于距离(distanced-based method)的方法,基于距离的方式通过计算两个模式(two patterns)或者一个的相似矩阵来进行认证或者识别或者计算 a library of stored prototypes.另外一种常见的作法是降维操作(reduced-dimension space),这个方法中一个类别的训练只需要很少的样本数。为了应用对抗的学习技巧到这类问题,我们必须设计出一个方法,这个方法能够从足够的数据中提取有关问题的信息,但是不需要每个类别的精准的信息。
本文提出的解决方法是从数据在学习相似矩阵(learn a similarity metric from data)。这个相似矩阵能够用来比较或者匹配之前没有见过的类别中样本(例如:在训练过程中没有的人脸)。我们提出一个新的对抗训练方法,用来寻来你相似矩阵。这个方法能够应用到类别的数量非常大或者类别中的例子不够再训练过程中的识别问题。
这个方法的核心思想就是寻找一个函数,这个函数将输入模式(input patterns)映射到目标空间(target space),并且目标空间中的单一距离(simple distance)(欧拉距离)近似于输入空间的“语义”距离。更准确的来说,给定一簇函数(a family of functions)$G_W(X)$(其中$W$是参数),我们要求寻找一个参数$W$,并且如果$X_1,X_2$属于相似的类别,相似矩阵$E_W(X_1,X_2) = \mid\mid G_W(X_1) - G_W(X_2) \mid\mid$会很小,相反如果属于不同的类别会很大。这个系统从训练集中匹配进行训练(the system is trained on pairs of patterns taken from a trainning set)。损失函数在$X_1$和$X_2$属于相似类别时,最小化$E_W(X_1,X_2)$并且在$X_1$和$X_2$属于不同类别时,最大化$E_W(X_1, X_2)$。对于不同的$W$,$G_W(X)$没有做任何前提假设。因为对于同样的参数$W$,同样的函数$G$被用来处理一样的输入,相似矩阵时对称的。这被称作孪生结构(siamese architecture)
为了使用这种方法去搭建人脸识别系统,我们首先训练模型产生输出向量,这些向量在处理来自同一个人的照片会很接近,处理来自不同人的照片会很远。这个模型能够被用做相似矩阵在一个新的人脸的照片。
这个方法提出的一个非常重要的观点是我们用完全的自由在选择$G_W(X)$。尤其是我们将会使用那些设计好去提取输入的几何失真的架构,例如卷积神经网络。产生的相似矩阵将会非常健全产生非常少的区别。
因为目标空间的维度非常小并且自然距离对于不相关的输入是不变的,我们能够轻松的从非常小的样本量中估计每个新的类别的概率模型。

1.1 Previous Work

在比较之前将人脸照片映射到低位目标空间有一个较长的历史,从基于PCA的Eigenface方法开始,Eigenface方法中$G(X)$是一个线性投影,并且训练采取的是非对抗的方法去最大化方差。基于LDA的Fisherface方法也是线性的,但是是对抗来训练为了最大化类间和类内方差的比率。基于核-PCA和核-LDA的非线性的扩展已经讨论过。可以看一下有关人脸识别的子空间的方法的评论(See for a review of subspace methods for face recognition)。这些方法的一个最主要的缺点就是它们对输入图片的几何变换(shift, scaling, rotation)和变形(人脸标签、眼睛和遮挡物的变化)和非常敏感。一些学者已经描述相似矩阵具有局部不变性对于一些列一直的变换。一个例子就是Tangent Distance method。另一个例子是elastic maching,这已经应用在人脸识别中。另外的学者提倡wrap-based normalization算法来最大程度上减少由于姿势的不同的变量的出现。这些模型的不变的性质是手动提前设置好的。在本文中提到的方法,不变的性质不是从有关这个任务的先验知识中得到的,而是从数据中学到的。当使用卷积网络作为映射函数,我们提出的方法可以从数据中学到一个大范围的不变的性质。
我们的方法在某种程度上与文献[4]类似,文献[4]使用一种孪生的架构来实现签名识别。这个方法与我们的方法的主要的区别在于在训练过程中最小化损失函数的特性。我们的损失函数从对抗学习的架构中派生出来应用于EBM(基于能量的模型, energy-based models)。
我们的方法于其他降维的方法例如MDS(Multi-Dimensional Scalling)和LLE(Local Linear Embedding)又很大的不同。MDS基于成对的差异,而不是构建一个映射关系,从训练集中的每个输入物体计算目标向量。相反的,我们的方法产生一个非线性的映射关系,这个映射关系能够将输入向量映射到一个对应的低维向量。

2. The General Framework

虽然概率模型为正在建模的变量分配一个归一化的概率给每个可能的配置,但是EBM能够分配一个非归一化的能能量给这些配置。这种系统中的预测通过搜索最小化能量变量的配置来执行。EBMs应用于各种配置的能量必须进行比较来做出抉择(分类、验证等等。。。)。一个可以训练的相似矩阵能被看作一个能量$E_W(X_1,X_2)$和输入模式的匹配。在最简单的人脸验证射中中,我们简单的设$X_2$是所有可以的照片的生成身份id并且与最小化$E_W(X_1,X_2)$得到的提前决定的阈值做比较。
与传统概率模型相比,特别是产生模型,EBM的优势在于没有必要估计输出空间规范化的概率分布。没有规范化保证我们不去计算那些部分比较棘手的函数。这也能够给我在选择模型的架构时相对更自由。
学习通过寻找$W$来最小化一个合适设计好的损失函数,并且在训练集上进行评估。首先,我们可能会认为简单的在一个平均输入和相同类中进行最小化$E_W(X_1,X_2)$会很充分。但是这通常会导致一个重大的灾难:能量和随时可能会变为0通过简单将$G_W(X_1)$变成不变的函数。因此我们的损失函数需要一个对比用语(constrstive term)去确保不仅仅与来自相同类别的与输入匹配的能量比较小,并且来自不同种类的很大。这个问题不会发生在相对规范化的概率模型因为在一个特定匹配的概率会比较高而在其他匹配中会很低。

2.1 Face Vertification with Learned Similarity Metrics

人脸验证的任务时接受或者拒绝图像中主题的身份认证。通过两个标准来评估表现:错误接受率和错误拒绝率。一个好的人脸验证系统应该最小化这两个标准同时。
我们的方法是为了建立一个可以训练的系统,这个系统是非线性的将人脸的原生图片映射到一个低位空间中的点并且如果这些图片属于同一个人这些点的距离会非常小,如果属于不同人则会非常大。学习相似矩阵可以通过训练一个有两个identical卷积神经网络并且这两个网络共享同样的权重来实现,这个结构也成为孪生结构A Siamese Architecture。

'img'

2.2 The energy function of the EBM

机器学习的框架如上图。$G_W(X)$框架的细节将在第3.2节。
设$X_1,X_2$为一对图片展示在我们的学习机器中。设$Y$为这组的二值标签,如果$X_1,X_2$同属于一个人则$Y=0$(也被称作“一个真正的匹配”)否则则$Y=1$(“一个假的匹配”)。设$W$为共享的参数向量,与学习有关,并且设$G_W(X_1)$和$G_W(X_2)$是低维空间中的两个点,是$X_1$和$X_2$的映射。然后我们的系统可以被认为是一个标量“能量函数”$E_W(X_1,X_2)$,用来度量$X_1$和$X_2$的兼容性(compatibility)。它被定义为:

\(E_W(X_1, X_2) = \mid\mid G_W(X_1) - G_W(X_2) \mid\mid\) 假设训练集中一个正真的匹配$(X_1, X_2)$,并且一个假的匹配$(X_1^{‘}, X_2^{‘})$如果下列条件满足的话,机器会按照我们所像的方向进行表现:
条件1:$\exists m \gt 0, such\ that\ E_W(X_1,X_2) + m \lt 0$。其中,正数$m$可以被解释为边界(margin)
为了简单的标记$E_W(X_1,X_2)$,可以简写为$E_W^G$并且$E_W(X_1,X_2^{‘})$写为$E_W^I$。

2.3 Contrastive Loss Function used for Training

我们假设损失函数取决于输入并且参数只是直接通过能量。我们的损失函数为:

\[\mathcal L(W) = \sum_{i=1}^PL(W,(Y,X_1,X_2)^i)\]

\(L(W,(Y,X_1,X_2)^i) = (1-Y)L_G(E_W(X_1,X_2)^i) + YL_I(E_W(X_1,X_2)^i)\) 其中$(Y,X_1,X_2)^i$为第i个样本,有一组图片和一个标签组成(可能是真的组合也可能是假的组合),$L_G$是一个部分损失函数对于一个真的组合,$L_I$是一个部分损失函数对于一个假的组合,并且$P$是训练样本的个数。$L_G$和$L_I$应该一某种方式进行设计,这种方式是最小化$L$将会减少真实匹配的能量并且增加增加假匹配的数量。一个简单方法去实现这的方法是使$L_G$单调递增,$L_I$单调递减。然而,存在一个更普遍的条件,最小化$L$将使得机器更接近条件1。我们的做法和LeCun提出的类似。我们考虑到一个训练级有真实匹配$(X_1, X_2)$、能量$E_W^G$ 和错误匹配$(X_1,X_2^{‘})$、能量$E_W^I$。那么我们定义:

\[H(E_W^G,E_W^I) = L_G(E_W^G) + L_I(E_W^I)\]

作为全部的损失函数对于两个匹配。我们将假设$H$对于它的两个参数是凸的(注意:我们不认为对于$W$,$H$是凸的)。我们也假设存在$W$队医一个单一的训练样本条件1是满足的。下面的条件必须满足对于损失函数$H$所有的值$E_W^G$和$E_W^I$

条件2 $H(E_W^G, E_W^I)$的最小值应该在$E_W^G + m \lt E_W^I$的半平面。
这个条件清楚的保证了当我们最小化$H$对应一个参数$W$,机器可以达到满足这个条件1的区域。
对于$H$的最小值存在有限区域,下面的条件是充分的:

'img'

条件3$H(E_W^G,E_W^I)$的负梯度在边缘线$E_W^G + m = E_W^I$有一个正点积方向在$[-1, 1]$之间。
为了证明这些,我们陈述并且证明以下的理论。
理论1:假设$H(E_W^G,E_W^I)$在参数$E_W^G$和$E_W^I$为凸并且在有限区间有一个最小值。假设存在一个$W$并且条件1满足。如果条件3满足,然后给定$W$最小化$H$时会导致发现满足条件1的$W$。
证明:考虑由$E_W^G$和$E_W^I$组成的平面的正象限的区域。假设两个半平面$E_W^G + m \lt E_W^I$ 和 $E_W^G + m \ge E_W^I$ 分别记为$HP_1$和$HP_2$。我们在$E_W^G$和$E_W^I$最小化$H$对于在任意$W$的区域内。假设$\mathcal R$作为$E_W^G$和$E_W^I$形成的平面内的内部区域。在大多数设置的。。。(略)

阅读全文 »

1.2 PRML Introduction Probability Theory Part Two

发表于 2019-01-22

1.2 PRML Introduction Probability Theory Part Two

贝叶斯概率

  • 贝叶斯理论是将先验概率(prior probability)转换成后验概率(posterior probability),通过包括由观察数据得到的证据(evidence)
  • 以曲线拟合作为例子
    • 首先,在观察数据之前,对$\mathbf w$作为假设已知,并且$\bf w$服从先验概率$p(\bf w)$
    • 观察数据的影响可以有条件概率$p(\mathbf w \mid \mathcal D)$,其中$\mathcal D$是观察数据且$\mathcal D = {t_1 … t_N}$
    • $p(\mathbf w \mid \mathcal D) = \frac{p(\mathcal D \mid \mathbf w)p(\mathbf w)}{p(\mathcal D)}$,其中$p(\mathbf w \mid \mathcal D)$为后验概率,并且$p(\mathcal D \mid \mathbf w)$为似然函数(likelihood function)
    • posterior $\sim$ likelihood $\times$ prior

高斯分布

  • 单一变量
    • $\mathcal N(x\mid \mu, \sigma^2) = \frac{1}{(2\pi\sigma^2)^{\frac12}}exp{-\frac{1}{2\sigma^2}(x-\mu)^2}$,$\mu$为均值,$\sigma^2$为方差,将$\frac{1}{\sigma^2}$记为$\beta$
    • $\int^{\infty}_{-\infty}\mathcal N(x\mid \mu, \sigma^2)dx = 1$
    • $\mathbb E[x] = \int^{\infty}_{-\infty}\mathcal N(x\mid \mu, \sigma^2)xdx = \mu$
    • $\mathbb E[x^2] = \int^{\infty}_{-\infty}\mathcal N(x\mid \mu, \sigma^2)x^2dx = \mu^2 + \sigma^2$
    • $var[x] = \mathbb E[x^2] - \mathbb E[x]^2 = \sigma^2$
  • 多个变量(用向量表示)
    • $\mathcal N(\mathbf x \mid \mathbf \mu, \mathbf \Sigma) = \frac{1}{(2\pi)^{\frac{D}{2}}}\frac{1}{\mid \mathbf \Sigma\mid^{\frac{1}{2}}}exp{-\frac12(\mathbf x - \mathbf \mu)^T\mathbf \Sigma^{-1}(\mathbf x - \mathbf \mu)}$,其中$\bf \mu$为$D$维向量的均值,$\bf \Sigma$为$D\times D$的矩阵为协方差,$\mid \mathbf \Sigma \mid$为矩阵的行列式
  • 使用观察到的数据区决定概率分布中的参数的一个通用表准是最大化似然函数
  • 假设每个$x_i$独立同分布(iid)
    • $p(\mathbf x \mid \mu, \sigma^2) = \prod_{n=1}^N\mathcal N(x_n \mid \mu, \sigma^2)$,用另外的形式表达写成,$lnp(\mathbf x \mid \mu, \sigma^2) = -\frac{1}{2\sigma^2}\sum_{n=1}^N(x_n - \mu)^2 - \frac{N}{2}ln\sigma^2 - \frac{N}{2}ln(2\pi)$
    • 最大化似然函数,那么可以得到$\mu_{ML} = \frac1N\sum_{n=1}^Nx_n$(样本均值),同理,$\sigma^2{ML} = \frac1N\sum{n=1}^N(x_n - \mu_{ML})^2$(样本方差)

贝叶斯曲线拟合

  • 在曲线拟合问题中,给定$\bf w$和$\bf t$,我们的目标是给定一个新的$x$预测出$t$。也可以认为是,我们想估计分布$p(t\mid x, \mathbf x, \mathbf t)$.
  • 这里我们假设$\alpha$和$\beta$事先给定,$p(t\mid x, \mathbf x, \mathbf t) = \int p(t\mid x, \mathbf w)p(\mathbf w\mid \mathbf x, \mathbf t)d\mathbf w$
    • 其中, $p(t\mid x, \mathbf w)$是$p(t\mid x, \mathbf w, \beta^{-1}) = \mathcal N(t\mid y(x, \mathbf w), \beta^{-1})$的简化形式
阅读全文 »

【deep learning】dl-with-python-Summary

发表于 2019-01-19

Summary of Chapter 1-5 DataSet : Mnist Architecture: Two Layer network, Two Affine ,Activation: Relu and the last layer is softmax, loss is cross-entropy

目标

用两层网络实现

架构

  • LayerOne : Input([图片展开向量], )
    • Weights:
    • Bais
    • Activation: Relu
  • LayerTwo
    • Weights:
    • Bais
    • Activation : Relu
  • Output
    • Softmax
  • Loss
    • crossentropy

      Details

      全连接层

  • forward : $Y = WX + b$
  • backward :
    • 传递参数:out$=\frac{dL}{dY}$
      $\frac{dL}{dX} = \frac{dL}{dY} * \frac{dY}{dX} = dout * W^T$
      $\frac{dL}{dW} = \frac{dL}{dY} * \frac{dY}{dW} = X^T * dout$
      $\frac{dL}{db} = \frac{dL}{dY} * \frac{dY}{db} = dout * 1$

      ReLu层

  • $y =\begin{cases} x, & x \ge 0 \\ 0 , & x \lt 0\end{cases}$
  • $\frac{\partial y}{\partial x} = \begin{cases} 1, & x \ge 0 \\ 0 , & x \lt 0\end{cases}$
  • mask = x <= 0
  • forward : out[mask] = 0
  • backward : dout[mask] = 0

Softmax With CrossEntropy 层

  • softmax:
    • $y_k = \frac {exp(a_k)}{\sum_{i=1}^n exp(a_i)}$
      • 改进:$y_k = \frac {exp(a_k)}{\sum_{i=1}^n exp(a_i)} = \frac {Cexp(a_k)}{C\sum_{i=1}^n exp(a_i)} = \frac {exp(a_k + logC)}{\sum_{i=1}^n exp(a_i + logC)}= \frac {exp(a_k + C^{‘})}{\sum_{i=1}^n exp(a_i + C^{‘})}$
  • crossentropy:
    • $\mathbf E = -\sum_kt_klogy_k$,$y_k$是正确输出,$t_k$是正确理解标签,并且$t_k$中只有正确解标签为1,其他均为0(one-hot表示)
  • softmaxwithcrossentropy
    • forward : 先进行softmax,再计算crossentropy
      $y = softmax(x)$
      $loss = cross_entropy(y, t)$
    • backward:
      $\frac{\partial L}{\partial a_k} = \frac{\partial L}{\partial y_k}\frac{\partial y_k}{\partial a_k} =-t_k\frac{1}{y_k}(\frac{exp(a_k)\sum_{i=1}^nexp(a_i) - exp(a_k)^2}{(\sum_{i=1}^nexp(a^i))^2}) =-t_k\frac{1}{y_k}(\frac{exp(a_k)}{\sum_{i=1}{n}} - (\frac{exp(a_k)}{\sum_{i=1}^n})^2) = -t_k\frac{1}{y_k}(y_k - y_k^2) = t_k(y_k - 1) = \begin{cases} y_k - 1 = y_k - t_k & t_k = 1 \\ 0(y_k - 1) = y_k - t_k & t_k = 0\end{cases} = y_k -t_k$

数据导入

  • 通过tensorflow自带的导入数据
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets('MNIST_data',one_hot=True)
  • 操作数据,获取图片,标签
train_nums = mnist.train.num_examples
validation_nums = mnist.validation.num_examples
test_nums = mnist.test.num_examples

train_data = mnist.train.images
val_data = mnist.validation.images
test_data = mnist.test.images

train_labels = mnist.train.labels

网络搭建

  • 前向传播
def __init__(self, input_size, hidden_size, output_size,weight_init_std=0.01):
    
    self.params = {}
    self.params['W1'] = weight_init_std * np.random.randn(input_size, hidden_size)
    self.params['b1'] = np.zeros(hidden_size)
    self.params['W2'] =  weight_init_std * np.random.randn(hidden_size, output_size)
    self.params['b2'] = np.zeros(output_size)
    
    
    self.layers = OrderedDict()
    self.layers['Affine1'] = Affine(self.params['W1'], self.params['b1'])
    self.layers['Relu'] = Relu()
    self.layers['Affine2'] = Affine(self.params['W2'], self.params['b2'])
    self.lastLayer = SoftmaxWithLoss()

def predict(self, x):
    for name, layer in self.layers.items():
      print(name, layer)
      x = layer.forward(x)
    return x
阅读全文 »

dl-with-pythonChapter5

发表于 2019-01-19

deep learning with python

5.1 计算图

  • 局部计算

    5.2 链式法则

  • 计算图的反向传播
    • $y = f(x)$
    • 乘上局部导数

      5.2.2 链式法则

  • $\frac{\partial z}{\partial x} = \frac{\partial z}{\partial t}\frac{\partial t}{\partial x}$

    5.2.3 链式法则与计算图

  • 'chain'

    5.3 反向传播

    5.4 实现乘法节点和加法节点

    5.5 激活函数的实现

    5.5.1 ReLU 层

  • $y = \begin{cases}x & (x \gt 0) \\ 0 & (x \le 0)\end{cases}$
  • $\frac{\partial y}{\partial x} = \begin{cases}1 & (x \gt 0) \\ 0 & (x \le 0)\end{cases}$

    5.5.2 sigmoid层

  • $y = \frac{1}{1 + exp(-x)}$
  • $\frac{\partial y}{\partial x} = \frac{exp(-x)}{(1+exp(-x)^2)} = exp(-x)y^2 = (1-y)y$,($exp(-x) = \frac{1-y}{y}$)

    5.6 Affine/Softmax 层

    5.6.1 Affine层

  • 正向传播中进行的矩阵的乘积运算称为“放射变换”

    5.6.2 批版本的Affine层

    5.6.3 Softmax-with-loss

  • 除了softmax层之外还包括交叉熵误差(cross-entropy error)
  • softmax: $y_k = \frac{exp(a_k)}{\sum^n_{i = 1}exp(a_i)}$
  • 交叉熵: $L = -\sum_kt_klogy_k$
    $\frac{\partial L}{\partial a_k} = \frac{\partial L}{\partial y_k}\frac{\partial y_k}{\partial a_k} =-t_k\frac{1}{y_k}(\frac{exp(a_k)\sum_{i=1}^nexp(a_i) - exp(a_k)^2}{(\sum_{i=1}^nexp(a^i))^2}) =-t_k\frac{1}{y_k}(\frac{exp(a_k)}{\sum_{i=1}{n}} - (\frac{exp(a_k)}{\sum_{i=1}^n})^2) = -t_k\frac{1}{y_k}(y_k - y_k^2) = t_k(y_k - 1)$

    5.7 误差反向传播法的实现

    5.7.1学习步骤

  • 步骤一、mini-batch 从训练数据中选择一部分数据
  • 步骤二、计算梯度
  • 步骤三、更新参数
阅读全文 »

dl-with-python Chapter4

发表于 2019-01-17

deep learning with python

4.2 损失函数

  • 损失函数表示神经网络性能的“恶劣”程度的指标。

    4.2.1 均方误差

  • $\mathbf E = \frac 12 \sum_k(y_k - t_k)^2$,$y_k$表示神经网络的输出,$t_k$表示监督数据,$k$表示数据的维数
  • 将正确理解标签表示为1, 其他标签表示为0的表示方法为one-hot表示

    4.2.2 交叉熵误差

  • $\mathbf E = -\sum_kt_klogy_k$,$y_k$是正确输出,$t_k$是正确理解标签,并且$t_k$中只有正确解标签为1,其他均为0(one-hot表示)

    4.2.3 mini-batch 学习

  • 前面的是针对单个数据的损失函数,所有数据的损失函数之和$\mathbf E = -\frac1N\sum_n\sum_kt_{nk}logy_{nk}$,这里数据有N个, $t_{nk}$表示第n个数据的第k个元素的值
  • 从训练数据中选出一批数据(称为mini-batch),然后对每个mini-batch进行学习

    4.2.4 mini-batch版交叉熵误差??

    4.3 数值微分

    4.3.1

  • $\frac{df(x)}{dx} = \lim_{h\to 0}\frac{f(x+h) - f(x)}{h}$
  • 舍入误差:省略小数的精细部分而造成最终的误差
  • 中心差分:以$x$为中心,计算左右的差分
  • 利用微小的差分求导数的过程为数值微分。基于数学式的推导求导数的过程为解析微分,“真导数”

4.4 梯度

  • $(\frac{\partial f}{\partial x_0}, \frac{\partial f}{\partial x_1})$偏微分的汇总的向量为梯度

    4.4.1 梯度法

  • $\begin{cases} x_0 = x_0 - \eta \frac{\partial f}{\partial x_0} \ x_1 = x_1 - \eta \frac{\partial f}{\partial x_1}\end{cases}$, $\eta$为学习率
  • 'gradient'

4.5 学习算法实现

  • mini-batch
  • 计算梯度
  • 更新参数
  • 重复
阅读全文 »

源码tf_smpl

发表于 2019-01-15

SMPL

预处理后的Model.pkl里的数据

参数:params:

\[\begin{array}{c|rlc} param.name & \text{Shape} & \text{含义} \\ \hline J\_regressor & (24, 6890) & 1 \\ weights & (6890, 24) & 权重 \\ posedirs & (6890, 3, 207) & \\ v\_template & (6890, 3) \\ shapedirs & (6890, 3, 10) \\ f & (13776, 3)\\ kintree\_table & (2, 24) & 各个关键点链接的关系 \\ \\ \hline \end{array}\]

类SMPLModel:

\[\begin{array}{r | l} 成员变量 & 初始化值 & 含义 \\ \hline J\_regressor & params.J\_regressor \\ weights & params.weights \\ posedirs & params.posedirs \\ v\_template & params.v\_template \\ shapedirs & params.shapedirs \\ faces & params.f \\ kintree\_table & params.kintree\_table \\ \hline parent & kintree\_table\\ \hline pose\_shape & [24, 3] \\ beta\_shape & [10] \\ trans\_shape & [3] \\ \hline pose & 0 \\ beta & 0 \\ trans & 0 \\ \hline verts & None \\ J & None \\ R & None \end{array}\]

成员方法update:

  • v_shaped = self.shapedirs.dot(self.beta) + self.v_template
    测量$\beta$如何影响body的形状。对应于论文中的公式 $\mathbf B(\overrightarrow \beta;S) = \sum_{n=1}^{\mid\overrightarrow \beta \mid}\beta_nS_n$;可以推测出shapedirs是$S_n$
  • self.J = self.J_regressor.dot(v_shaped)
    pose_cube = self.pose.reshape((-1, 1, 3))
    1. 计算关节点的位置J等于J_regressor与前一步v_shaped点乘
    2. $J(\overrightarrow \beta;\mathcal J, \overline \mathbf T, \mathcal S) = \mathcal J(\overline\mathbf T +B_S(\overrightarrow \beta; \mathcal S))$ 其中$\mathcal J$是学习到的即J_regressor
    3. 将$\beta$进行reshape,shape为(24, 1, 3)
  • self.R = self.rodrigues(pose_cube) ——————– 1
    I_cube = np.broadcast_to(
        np.expand_dims(np.eye(3), axis=0),
        (self.R.shape[0]-1, 3, 3)
    ) —————————————————————— 2
    lrotmin = (self.R[1:] - I_cube).ravel() ————– 3
    v_posed = v_shaped + self.posedirs.dot(lrotmin) — 4
    总体计算$\theta$如何影响body的形状。
    1. $\mathbf B_p(\overrightarrow \theta;\mathscr P) = \sum_{n=1}^{9K}(R_n(\overrightarrow \theta) - R_n(\overrightarrow \theta^*))P_n$
    2. 第(1)行代码计算$R_n(\overrightarrow \theta)$
    3. 第(2)行代码计算$R_n(\overrightarrow \theta^*)$
    4. 第(3)行代码计算$R_n(\overrightarrow \theta) - R_n(\overrightarrow \theta^*)$
    5. 第(4)行代码计算$\theta$对body的影响
    6. 由此可知posedirs存放的是$P_n$
  • # world transformation of each joint
    G = np.empty((self.kintree_table.shape[1], 4, 4))
    G[0] = self.with_zeros(np.hstack((self.R[0], self.J[0, :].reshape([3, 1]))))
    for i in range(1, self.kintree_table.shape[1]):
        G[i] = G[self.parent[i]].dot( # 父关节的轴角乘以关节相对旋度等于当前关节的轴角
        self.with_zeros(
          np.hstack(
            [self.R[i], ((self.J[i, :]-self.J[self.parent[i],:]).reshape([3,1]))] # 计算关节的相对位置
          )
         )
        )
    # remove the transformation due to the rest pose
    G = G - self.pack(
        np.matmul(
            G,
            np.hstack([self.J, np.zeros([24, 1])]).reshape([24, 4, 1])
          )
    )
    1. 其中with_zeros和np.hstack实现$G_k(\overrightarrow \theta, \mathbf J) = \prod_{j \in A(k)}[\begin{array}{r l} exp(\overrightarrow w_j) & j_j \ \overrightarrow 0 & 1\end{array}]$
    2. 看不懂了….
  • T = np.tensordot(self.weights, G, axes=[[1], [0]])
    ` rest_shape_h = np.hstack((v_posed, np.ones([v_posed.shape[0], 1])))<br> v = np.matmul(T, rest_shape_h.reshape([-1, 4, 1])).reshape([-1, 4])[:, :3]<br> self.verts = v + self.trans.reshape([1, 3])`
    1. 对每一个点进行变换。
    2. 实现式子$\overline t_i^{‘} = \sum_{k=1}^Kw_{k,i}G^{‘}k(\overrightarrow \theta, J(\overrightarrow \beta))(\overline t_i + b{S,i}(\overrightarrow \beta) + b_{p,i}(\overrightarrow \theta))$
阅读全文 »

dl-with-python Chapter3

发表于 2019-01-14

deep learning with python

神经网络

3.2 感知机

  • 将$y = \begin{cases} 0 & (b+w_1x_1 + w_2x_2 \le 0) \\ 1 & (b+w_1x_1+w_2x_2 \gt 0) \end{cases}$改写成$y=h(b+w_1x_1+w_2x_2)$,其中$h(x) = \begin{cases} 0 & (x \le 0) \\ 1 & (x \gt 0)\end{cases}$,称$h(x)$为激活函数/阶跃函数。

    3.2.1 sigmoid函数

  • sigmoid function : $h(x) = \frac{1}{1 + exp(-x)}$
  • 'sigmoid'

    3.2.2 阶跃函数的实现

  • 简单的数学表达式:$h(x) = \begin{cases} 0 & (x \le 0) \\ 1 & (x \gt 0)\end{cases}$

    3.2.3 阶跃函数的图形

    'step'

    3.2.5 比较

  • sigmoid函数平滑的曲线
  • 当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值
  • 当输入信号为不重要信息时,两者都输出较小的值

    3.2.6 非线性函数

  • 神经网络的激活函数必须使用非线性函数,因为使用线性函数的话,加深神经网络的层数没有意义

    3.2.7 ReLU 函数

  • $h(x) = \begin{cases} x & (x > 0) \\ 1 & (x \le 0)\end{cases}$
  • 'relu'

3.3 多维数组的运算

3.4 三层神经网络的实现

  • '3-layer'

    3.4.1 符号确认

  • $w^{(1)}_{12}$其中”$(1)$”表示权重和神经元的层号;右下角”$12$”分别表示后一次的神经元和前一次神经元的索引号。
  • ''

    3.4.2 各层之间的传递

  • ''
  • $a_1^{(1)} = w_{11}^{(1)}x_1 + w_{12}^{(1)}x_2 + b^{(1)}_1$
  • $a_2^{(1)} = w_{21}^{(1)}x_1 + w_{22}^{(1)}x_2 + b^{(1)}_2$
  • $\bf A^{(1)} = XW^{(1)} + B^{(1)}$,其中$\bf A^{(1)} = \begin{pmatrix} a_1^{(1)} & a_2^{(1)} & a_3^{(1)} & a_4^{(1)}\end{pmatrix}$,$\bf X = \begin{pmatrix} x_1 & x_2\end{pmatrix}$,$B^{(1)} = \begin{pmatrix} b_1^{(1)} & b_2^{(1)} & b_3^{(1)}\end{pmatrix}$,$\bf W^{(1)} = \begin{pmatrix} w_{11}^{(1)} & w_{21}^{(1)} & w_{31}^{(1)} \\ w_{12}^{(1)} & w_{22}^{(1)} & w_{32}^{(1)} \end{pmatrix}$
  • 输出层的激活函数用$\sigma()$代替

3.5 输出层的设计

  • 一般而言,回归问题用恒等函数, 分类问题用softmax喊

    3.5.1 恒等函数与softmax函数

  • 恒等函数会将输入按原样输出
  • softmax函数: $y_k = \frac {exp(a_k)}{\sum_{i=1}^n exp(a_i)}$

    3.5.2 softmax的改进

  • $y_k = \frac {exp(a_k)}{\sum_{i=1}^n exp(a_i)} = \frac {Cexp(a_k)}{C\sum_{i=1}^n exp(a_i)} = \frac {exp(a_k + logC)}{\sum_{i=1}^n exp(a_i + logC)}= \frac {exp(a_k + C^{‘})}{\sum_{i=1}^n exp(a_i + C^{‘})}$

code

阅读全文 »

dl-with-python Chapter2

发表于 2019-01-13

deep learning with python

感知机

2.1 感知机是什么

  • 接受多个信号,输出一个信号
  • 0 代表“不传递信号”;1 代表“传递信号”
  • 'da'
  • $w_1、w_2$权重, $x_1、x_2$输入信号, $y$输出信号
  • $(w_1x_1, w_2x_2)$为传递的信号的总和,只有这个总和超过某个界限值,$y$才输出1,这个界限值为阈值
  • $y = \begin{cases} 0 , & {w_1x_1+w_2x_2 \le \theta} \ 1 , & {w_1x_1+w_2x_2 \gt \theta}\end{cases}$

2.2 简单逻辑电路

  • 与门
    • $(w_1, w_2, \theta) = (0.5, 0.5, 0.7)$
  • 与非门和或门
    • 与非门:$(w_1, w_2, \theta) = (-0.5, -0.5, -0.7)$
    • 或门: $(w_1, w_2, \theta) = (0.5, 0.5, 0.2)$

2.3 感知机的实现

2.3.1 简单实现

2.3.2 导入权重和偏置

$y = \begin{cases}0,& {b + w_1x_1 + w_2x_2 \le \theta} \ 1, & {b + w_1x_1 + w_2x_2 \gt \theta} \end{cases}$
其中,$b= -\theta$

2.4 感知机的缺陷

  • 与门
    'and'
  • 与非门
    'nand'
  • 或门
    'or'
  • 异或门
    'xor'
    • 可以看出异或门不能用上面的方法区分开来

2.5 多层感知机

'多层感知机'


code

阅读全文 »

1.2 PRML Introduction Probaility Theory (I)

发表于 2019-01-12

PRML : 1.2 PRML Introduction Probaility Theory (I)

Rules of Probability

\(sum \ \ rule: p(X) = \sum_Yp(X,Y) \\ product \ \ rule: p(X,Y) = p(Y\mid X)p(X)\)

其中, $p(X,Y)$为联合概率 ,”X和Y的概率”;
$p(Y\mid X)$为条件概率,”在X给定的条件下, Y的概率”
$p(X)$为边缘概率, “X的概率”

Bayes’ theorem

\(\because \ \ p(X,Y) = p(Y,X) \\ p(X,Y) = p(Y\mid X)p(X) \\ p(Y ,X) = p(X \mid Y)p(Y) \\ \therefore \ \ p(Y\mid X) = \frac {p(X \mid Y)p(Y)}{p(X)}\)

使用sum rule得到$p(X) = \sum_Yp(X\mid Y)p(Y)$ 原文:We can view the denominator in Bayes' theorem as being the normalization constant required to ensure that the sum of the conditional probability on the lef-hand side of $p(Y\mid X) = \frac {p(X \mid Y)p(Y)}{p(X)}$over all values of Y equals one.

概率密度(连续变量)

  • $p(x \in (a, b)) = \int_a^bp(x)dx$表示的x的概率是a到b之前的面积
  • 两个条件:
    • $p(x) \ge 0$
    • $\int^{\infty}_{-\infty}p(x)dx = 1$
  • 考虑x变量的变化,$x = g(y)$, 则$f(x) = \overline f(y) = f(g(y))$;$x$对应的概率m密度为$p_x(x)$,$y$对应的概率密度为$p_y(y)$,$p_x(x)\delta x \simeq p_y(y)\delta y$。

\(p_y(y) = p_x(x)\mid\frac{dx}{dy} \mid = p_x(g(y))\mid g\prime(y)\mid\)

  • 根据积累分布函数(cumulative distribution function)x的概率存在于区间$(-\infty ,z)$,$\mathbf P(z) = \int_{-\infty}^zp(x)dx$,满足$\mathbf P\prime(z) = p(x)$
  • 多个连续的变量$x_1…x_D$,能够记成一个向量$\mathbf x$,联合的概率密度为$p(\mathbf x) = p(x_1,x_2,…,x_D)$
\[p(\mathbf x) \ge 0 \\ \int p(\mathbf x)d\mathbf x = 1\]
  • 如果$x$是一个离散的变量,那么$p(x)$有时被称为概率质量函数(probability mass function)
  • sum 、product and Bayes' theorem同样适用于概率密度函数
\[p(x) = \int p(x,y)dy \\ p(x, y) = p(y \mid x)p(x)\]

期望和方差

  • 在给定概率分布$p(x)$下的某个函数$f(x)$的平均值为$f(x)$的期望

\(\mathbb E = \sum_xp(x)f(x) \\ \mathbb E[f] = \int p(x)f(x)dx \\ \mathbb E[f] \simeq \frac{1}{N}\sum_{n=1}^Nf(x_n) (N \to \infty)\)

  • 多变量期望

\(\mathbb E_x[f(x,y)]\) \(\mathbb E[f\mid y] = \sum_x p(x\mid y)f(x)\)

  • $f(x)$方差的定义:$var[f] = \mathbb E[(f(x) - \mathbb E[f(x)])^2]$
\[var[f] = \mathbb E[f(x)^2] - \mathbb E[f(x)]^2 \\ var[f] = \mathbb E[x^2] = \mathbb E[x]^2\]
  • 协方差:
\[cov[x,y] = \mathbb E_{x,y}[\{ x - \mathbb E[x]\} \{ y - \mathbb E[y]\}] = \mathbb E_{x,y}[xy] - \mathbb E[x]\mathbb E[y] \\ \ \\ cov[\mathbf x,\mathbf y] = \mathbb E_{\mathbf x,\mathbf y}[\{ \mathbf x - \mathbb E[\mathbf x]\} \{ \mathbf y^T - \mathbb E[\mathbf y^T]\}] = \mathbb E_{x,y}[\mathbf x\mathbf y^T] - \mathbb E[\mathbf x]\mathbb E[\mathbf y^T]\]
阅读全文 »

源码tf_smpl

发表于 2019-01-08

SMPL

预处理后的Model.pkl里的数据

参数:params:

\[\begin{array}{c|rlc} param.name & \text{Shape} & \text{含义} \\ \hline J\_regressor & (24, 6890) & 1 \\ weights & (6890, 24) & 权重 \\ posedirs & (6890, 3, 207) & \\ v\_template & (6890, 3) \\ shapedirs & (6890, 3, 10) \\ f & (13776, 3)\\ kintree\_table & (2, 24) & 各个关键点链接的关系 \\ \\ \hline \end{array}\]

类SMPLModel:

\[\begin{array}{r | l} 成员变量 & 初始化值 & 含义 \\ \hline J\_regressor & params.J\_regressor \\ weights & params.weights \\ posedirs & params.posedirs \\ v\_template & params.v\_template \\ shapedirs & params.shapedirs \\ faces & params.f \\ kintree\_table & params.kintree\_table \\ \hline parent & kintree\_table\\ \hline pose\_shape & [24, 3] \\ beta\_shape & [10] \\ trans\_shape & [3] \\ \hline pose & 0 \\ beta & 0 \\ trans & 0 \\ \hline verts & None \\ J & None \\ R & None \end{array}\]

成员方法update:

  • v_shaped = self.shapedirs.dot(self.beta) + self.v_template
    测量$\beta$如何影响body的形状。对应于论文中的公式 $\mathbf B(\overrightarrow \beta;S) = \sum_{n=1}^{\mid\overrightarrow \beta \mid}\beta_nS_n$;可以推测出shapedirs是$S_n$
  • self.J = self.J_regressor.dot(v_shaped)
    pose_cube = self.pose.reshape((-1, 1, 3))
    1. 计算关节点的位置J等于J_regressor与前一步v_shaped点乘
    2. $J(\overrightarrow \beta;\mathcal J, \overline \mathbf T, \mathcal S) = \mathcal J(\overline\mathbf T +B_S(\overrightarrow \beta; \mathcal S))$ 其中$\mathcal J$是学习到的即J_regressor
    3. 将$\beta$进行reshape,shape为(24, 1, 3)
  • self.R = self.rodrigues(pose_cube) ——————– 1
    I_cube = np.broadcast_to(
        np.expand_dims(np.eye(3), axis=0),
        (self.R.shape[0]-1, 3, 3)
    ) —————————————————————— 2
    lrotmin = (self.R[1:] - I_cube).ravel() ————– 3
    v_posed = v_shaped + self.posedirs.dot(lrotmin) — 4
    总体计算$\theta$如何影响body的形状。
    1. $\mathbf B_p(\overrightarrow \theta;\mathscr P) = \sum_{n=1}^{9K}(R_n(\overrightarrow \theta) - R_n(\overrightarrow \theta^*))P_n$
    2. 第(1)行代码计算$R_n(\overrightarrow \theta)$
    3. 第(2)行代码计算$R_n(\overrightarrow \theta^*)$
    4. 第(3)行代码计算$R_n(\overrightarrow \theta) - R_n(\overrightarrow \theta^*)$
    5. 第(4)行代码计算$\theta$对body的影响
    6. 由此可知posedirs存放的是$P_n$
  • # world transformation of each joint
    G = np.empty((self.kintree_table.shape[1], 4, 4))
    G[0] = self.with_zeros(np.hstack((self.R[0], self.J[0, :].reshape([3, 1]))))
    for i in range(1, self.kintree_table.shape[1]):
        G[i] = G[self.parent[i]].dot( # 父关节的轴角乘以关节相对旋度等于当前关节的轴角
        self.with_zeros(
          np.hstack(
            [self.R[i], ((self.J[i, :]-self.J[self.parent[i],:]).reshape([3,1]))] # 计算关节的相对位置
          )
         )
        )
    # remove the transformation due to the rest pose
    G = G - self.pack(
        np.matmul(
            G,
            np.hstack([self.J, np.zeros([24, 1])]).reshape([24, 4, 1])
          )
    )
    1. 其中with_zeros和np.hstack实现$G_k(\overrightarrow \theta, \mathbf J) = \prod_{j \in A(k)}[\begin{array}{r l} exp(\overrightarrow w_j) & j_j \ \overrightarrow 0 & 1\end{array}]$
    2. 看不懂了….
  • T = np.tensordot(self.weights, G, axes=[[1], [0]])
    ` rest_shape_h = np.hstack((v_posed, np.ones([v_posed.shape[0], 1])))<br> v = np.matmul(T, rest_shape_h.reshape([-1, 4, 1])).reshape([-1, 4])[:, :3]<br> self.verts = v + self.trans.reshape([1, 3])`
    1. 对每一个点进行变换。
    2. 实现式子$\overline t_i^{‘} = \sum_{k=1}^Kw_{k,i}G^{‘}k(\overrightarrow \theta, J(\overrightarrow \beta))(\overline t_i + b{S,i}(\overrightarrow \beta) + b_{p,i}(\overrightarrow \theta))$
阅读全文 »
1 … 3 4 5
dcl

dcl

blog

44 日志
13 分类
13 标签
RSS
© 2022 dcl
由 Jekyll 强力驱动
主题 - NexT.Muse