Its*_*mmy 3 python linear-algebra tensorflow
我Tensor在第二维上有两个rank-2 ,大小相等,但在第一维上不相等。例如,张量A形状的[a, n]和张量B形状的[b, n]。可以将它们视为包含length矢量的两个数组n。
我有一个函数f,需要两个输入,每个输入为shape的张量[n],并返回一个标量。我想在此函数应用到每个对矢量A和B与所述结果是一个张量C形状的[a, b],使得对于每个位置(i, j)中C,C[i, j] = f(A[i], B[j])。
如果这些只是常规的Numpy数组,我可以使用以下代码完成此操作:
# Assume a, b, and n are integers, and A and B are Numpy arrays
C = numpy.zeros((a, b))
for i in range(0, a):
for j in range(0, b):
C[i, j] = f(A[i], B[j])
return C
Run Code Online (Sandbox Code Playgroud)
如果这可以通过f简单地采用A和B作为输入和返回的方式来完成C,那将是首选解决方案,从而使所有事情都以适当的张量操作发生,从而可以通过Tensorflow对其进行适当的并行化。只要最终结果是相同的。
我已经找到了专门针对此问题的解决方案,该解决方案专门用于f计算每对向量之间的欧式距离。我想将此扩展到其他函数,例如余弦距离或曼哈顿(L1)距离。
a = tf.random_normal([10,5])
b = tf.random_normal([20,5])
Run Code Online (Sandbox Code Playgroud)
我将从像这样重新定位两个数组开始:
a = a[:,tf.newaxis,:]
b = b[tf.newaxis,:,:]
Run Code Online (Sandbox Code Playgroud)
现在形状为[a,1,n]和[1,b,n],因此我们可以进行减法运算以计算每对的增量:
delta = (a-b)
Run Code Online (Sandbox Code Playgroud)
它的形状为[a,b,n]。
现在,欧几里得距离直截了当。(axis=-1最后一个轴的总和):
distance = tf.reduce_sum(delta**2,axis = -1)**0.5
Run Code Online (Sandbox Code Playgroud)
这样就完成了:
print(distance)
<tf.Tensor 'pow_3:0' shape=(10, 20) dtype=float32>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1063 次 |
| 最近记录: |