例:我们有维度为[Batch_size,T,V,C] 的数据,想得到维度为[Batch_size,T,V,V]的数据:
方法:
def calculate_dis(x): #N,T,V,C
#x = np.array(x)
sum_x = np.sum(np.square(x),3,keepdims = True)#先求对应元素的平方,然后按列相加,得到(N,T,V,1)的矩阵
#print(a.shape)
dist = np.add(np.add(-2*np.matmul(x,x.swapaxes(2,3)),sum_x),sum_x.swapaxes(2,3))
#np.matmull()函数可以求矩阵指定维度内积,这里x = np.add()函数是将sum_x的转置行向量依次加到前面的(N,T,V,V)向量的每一行上。
#这里x,x.swapaxes维度分别为[N,T,V,C] 和 [N,T,C,V]
return dist
这里我们主要用到:np.square(x);
np.sum(x,dims,keepdims);
np.add(x,y) #将y转置加到x的每一行上,对y维度有要求
np.matmul(x,y) #求x,y内积
x.swapaxes(a,b) # 将x的a,b维度交换位置。
例:我们有维度为[Batch_size,T,V,C] 的数据,想沿T维度求相邻項的内积之和。
def attention_matrix(x,N,T,V,fps):
dis_ = 0
for k in range(T//fps + 1):
#print(k)
index_start = (k * fps if k is 0 else (k * fps - 1) )
index_end = (k+1) * fps - 1
if k == T//fps:
dis_ += np.sum(np.square(x[:,index_start,:,:] - x[:,-1,:,:]),2) #[N,V]
else:
dis = np.sum(np.square(x[:,index_start,:,:] - x[:,index_end,:,:]),2)
dis_ += dis
attention_m = np.zeros([N,V,V])
#将列向量扩展为对角线元素维向量元素的方阵
for i in range (V):
attention_m[:,i,i] = dis[:,i]
return attention_m
这里我们主要搞清楚如何设置array的索引即可!!
注意:选取高维数据的某一维时应该用 ', N ,' 来操作:
例a 尺寸为 [100,25,7,7]
想依次获取第二维度所代表的所有数据[100,7,7]
就这样操作:
for i in range (25):
b[i] = a[:,i,:,:]