SGPN:代码解析——相似矩阵计算

  本文的目的是解析SGPN代码中由矩阵 F S I M \boldsymbol F_{SIM} FSIM(维度为 N p × N f N_p \times N_f Np×Nf)如何得到相似矩阵 S \boldsymbol S S(维度为 N p ×   N p N_p \times\ N_p Np× Np)。 S i , j S_{i,j} Si,j 的值是点 P i \boldsymbol P_i Pi和 点 P j \boldsymbol P_j Pj属于相同物体实例的度量。 S i , j S_{i,j} Si,j 越小表示点 P i \boldsymbol P_i Pi和 点 P j \boldsymbol P_j Pj属于相同实例的可能性越大。
数学分析
 首先假设 F S I M = [ x 1 T x 2 T ⋮ x N p T ] \boldsymbol F_{SIM}=\left[ \begin{matrix} \boldsymbol x_{1}^T \\ \boldsymbol x_{2}^T \\ \vdots \\ \boldsymbol x_{N_p}^T \end{matrix} \right] FSIM=x1Tx2TxNpT  其中 x i = [ x i , 1 x i , 2 ⋯ x i , N f ] T \boldsymbol x_{i}=\left [\begin{matrix}x_{i,1}&x_{i,2}&\cdots&x_{i,N_f} \end{matrix}\right]^T xi=[xi,1xi,2xi,Nf]T
  因为
标 量 S i , j = ∥ F S I M i − F S I M j ∥ 2 = ∥ x i − x j ∥ 2 = ( x i − x j ) T ( x i − x j ) = x i T x i − 2 x i T x j + x i T x i \begin{aligned} 标量S_{i,j} &=\lVert \boldsymbol F_{SIM_i}-\boldsymbol F_{SIM_j}\rVert_2=\lVert \boldsymbol x_{i}- \boldsymbol x_{j}\rVert_2\\ &=(\boldsymbol x_{i}-\boldsymbol x_{j})^T(\boldsymbol x_{i}-\boldsymbol x_{j})=\boldsymbol x_{i}^T\boldsymbol x_{i}-2\boldsymbol x_{i}^T\boldsymbol x_{j}+\boldsymbol x_{i}^T\boldsymbol x_{i} \end{aligned} Si,j=FSIMiFSIMj2=xixj2=(xixj)T(xixj)=xiTxi2xiTxj+xiTxi  所以
S = A − B + C (1) \boldsymbol S = \boldsymbol A-\boldsymbol B+\boldsymbol C \tag{1} S=AB+C(1)  其中
A = [ x 1 T x 1 x 1 T x 1 ⋯ x 1 T x 1 x 2 T x 2 x 2 T x 2 ⋯ x 2 T x 2 ⋮ ⋮ ⋮ ⋮ x N p T x N p x N p T x N p ⋯ x N p T x N p ] N P × N p \boldsymbol A = \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{1}^T\boldsymbol x_{1} & \cdots & \boldsymbol x_{1}^T\boldsymbol x_{1} \\ \boldsymbol x_{2}^T\boldsymbol x_{2} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{2}^T\boldsymbol x_{2} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} &\boldsymbol x_{N_p}^T\boldsymbol x_{N_p} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p} A=x1Tx1x2Tx2xNpTxNpx1Tx1x2Tx2xNpTxNpx1Tx1x2Tx2xNpTxNpNP×Np
C = [ x 1 T x 1 x 2 T x 2 ⋯ x N p T x N p x 1 T x 1 x 2 T x 2 ⋯ x N p T x N p ⋮ ⋮ ⋮ ⋮ x 1 T x 1 x 2 T x 2 ⋯ x N p T x N p ] N P × N p = A T \boldsymbol C= \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \\ \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}=A^T C=x1Tx1x1Tx1x1Tx1x2Tx2x2Tx2x2Tx2xNpTxNpxNpTxNpxNpTxNpNP×Np=AT
B = 2 ∗ [ x 1 T x 1 x 1 T x 2 ⋯ x 1 T x N p x 2 T x 1 x 2 T x 2 ⋯ x 2 T x N p ⋮ ⋮ ⋮ ⋮ x N p T x 1 x N p T x 2 ⋯ x N p T x N p ] N P × N p = F S I M ∗ F S I M T \boldsymbol B=2* \left[ \begin{matrix} \boldsymbol x_{1}^T\boldsymbol x_{1} &\boldsymbol x_{1}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{1}^T\boldsymbol x_{N_p} \\ \boldsymbol x_{2}^T\boldsymbol x_{1} &\boldsymbol x_{2}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{2}^T\boldsymbol x_{N_p} \\ \vdots & \vdots & \vdots & \vdots\\ \boldsymbol x_{N_p}^T\boldsymbol x_{1} &\boldsymbol x_{N_p}^T\boldsymbol x_{2} & \cdots & \boldsymbol x_{N_p}^T\boldsymbol x_{N_p} \end{matrix} \right]_{N_P\times N_p}= \boldsymbol F_{SIM}* \boldsymbol F_{SIM}^T B=2x1Tx1x2Tx1xNpTx1x1Tx2x2Tx2xNpTx2x1TxNpx2TxNpxNpTxNpNP×Np=FSIMFSIMT  到此理论分析完毕,接下来为代码实现分析,SGPN的github源码是用TensorFlow写的,其中计算相似矩阵 S \boldsymbol S S的代码如下:

# Similarity matrix
Fsim = tf_util.conv2d(F, 128, [1, 1], padding='VALID', stride=[1, 1], bn=False, is_training=is_training, scope='Fsim')
 #Fsim shape:BxNx1x128
Fsim = tf.squeeze(Fsim, [2])
 #Fsim shape:BxNx128
r = tf.reduce_sum(Fsim * Fsim, 2)
 #r shape:BxN
r = tf.reshape(r, [batch_size, -1, 1])
#r shape:BxNx1
print(r.get_shape(),Fsim.get_shape())
D = r - 2 * tf.matmul(Fsim, tf.transpose(Fsim, perm=[0, 2, 1])) + tf.transpose(r, perm=[0, 2, 1])

  其中 D D D为相似矩阵 S S S,代码中的r+ tf.transpose(r, perm=[0, 2, 1])的效果相当于公式(1)中的 A + C A+C A+C。你可能疑惑rtf.transpose(r, perm=[0, 2, 1])维度不同怎么能相加呢?针对这个地方我没查到tesorflow怎么对不同维度的向量相加,但是我查着了numpy关于不同维度相加的博客介绍,即如下:
  广播是指不同形状的输足之间执行算数运算额方式。当两个数组的shape不一致时,numpy会实行广播机制。遵循4个原则:
  (1)让所有的输入数组向其中shape最长的数组看齐,shape中不足的部分通过在前面加1补齐。
  (2)输出数组的shape是输入数组shape的各个轴上的最大值。
  (3)如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1,则这个数组能够用来计算,否则出错。
  (4)当输入数组的某个轴的长度为1时,沿着此轴运算时使用此轴上的第一组值。
最后2 * tf.matmul(Fsim, tf.transpose(Fsim, perm=[0, 2, 1]))相当于公式(1)中的 B B B
 到此结束。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值