使用 theano/numpy.tensordot 的外积
Outer products using theano/numpy.tensordot
我有一个 n=3
个长度为 m=10
的向量的 NumPy 数组,所以 input.shape = (n,m,1)
。我正在尝试使用 theano/numpy.tensordot
计算每个向量的外积,使得 output.shape = (n,m,m)
和 :
output[i] = np.dot(input[i],input[i].T) = np.outer(input[i],input[i])
我很确定这是可能的,但我很难弄清楚要为轴使用什么参数。这可以很容易地遍历数组,但我正在尝试使用 tensordot 完成此步骤,因为它在 theano 和 numpy 中的实现方式相同。这很重要,因为我正在使用 theano,但目前使用 numpy 进行调试。
您并没有完全使用点积的总和缩减部分,而只是使用其转置版本为每一行广播逐元素乘法。这可以通过在输入数组的两个版本中创建 singleton
维度再次使用 broadcasting
以矢量化方式实现所有行 - 一个在 axis=1
处具有 singleton dim
,另一个在 axis=1
axis=2
。因为,输入数组已经是 3D 形状的,所以我们已经有了 version #2
。要获得第一个版本,只需沿着最后两个暗淡交换轴。因此,将这两个版本相乘将为我们提供所需的输出,就像这样 -
output = input*input.swapaxes(1,2)
我有一个 n=3
个长度为 m=10
的向量的 NumPy 数组,所以 input.shape = (n,m,1)
。我正在尝试使用 theano/numpy.tensordot
计算每个向量的外积,使得 output.shape = (n,m,m)
和 :
output[i] = np.dot(input[i],input[i].T) = np.outer(input[i],input[i])
我很确定这是可能的,但我很难弄清楚要为轴使用什么参数。这可以很容易地遍历数组,但我正在尝试使用 tensordot 完成此步骤,因为它在 theano 和 numpy 中的实现方式相同。这很重要,因为我正在使用 theano,但目前使用 numpy 进行调试。
您并没有完全使用点积的总和缩减部分,而只是使用其转置版本为每一行广播逐元素乘法。这可以通过在输入数组的两个版本中创建 singleton
维度再次使用 broadcasting
以矢量化方式实现所有行 - 一个在 axis=1
处具有 singleton dim
,另一个在 axis=1
axis=2
。因为,输入数组已经是 3D 形状的,所以我们已经有了 version #2
。要获得第一个版本,只需沿着最后两个暗淡交换轴。因此,将这两个版本相乘将为我们提供所需的输出,就像这样 -
output = input*input.swapaxes(1,2)