天天看點

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​=⎣⎢⎢⎢⎡​x1T​x2T​⋮xNp​T​​⎦⎥⎥⎥⎤​  其中 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,1​​xi,2​​⋯​xi,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​​=∥FSIMi​​−FSIMj​​∥2​=∥xi​−xj​∥2​=(xi​−xj​)T(xi​−xj​)=xiT​xi​−2xiT​xj​+xiT​xi​​  是以

S = A − B + C (1) \boldsymbol S = \boldsymbol A-\boldsymbol B+\boldsymbol C \tag{1} S=A−B+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=⎣⎢⎢⎢⎡​x1T​x1​x2T​x2​⋮xNp​T​xNp​​​x1T​x1​x2T​x2​⋮xNp​T​xNp​​​⋯⋯⋮⋯​x1T​x1​x2T​x2​⋮xNp​T​xNp​​​⎦⎥⎥⎥⎤​NP​×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=⎣⎢⎢⎢⎡​x1T​x1​x1T​x1​⋮x1T​x1​​x2T​x2​x2T​x2​⋮x2T​x2​​⋯⋯⋮⋯​xNp​T​xNp​​xNp​T​xNp​​⋮xNp​T​xNp​​​⎦⎥⎥⎥⎤​NP​×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=2∗⎣⎢⎢⎢⎡​x1T​x1​x2T​x1​⋮xNp​T​x1​​x1T​x2​x2T​x2​⋮xNp​T​x2​​⋯⋯⋮⋯​x1T​xNp​​x2T​xNp​​⋮xNp​T​xNp​​​⎦⎥⎥⎥⎤​NP​×Np​​=FSIM​∗FSIMT​  到此理論分析完畢,接下來為代碼實作分析,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。你可能疑惑

r

tf.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。

 到此結束。

繼續閱讀