python定义向量内积_python – 沿多维数组的一维向量点积

我想使用Theano计算两个多维数组的一个维度的和积.

我将首先使用numpy准确描述我想要做的事情. numpy.tensordot和numpy.dot似乎总是做一个矩阵产品,而我本质上是在寻找一个等价的矢量产品.给定x和y,我想像这样计算z:

x = np.random.normal(size=(200, 2, 2, 1000))

y = np.random.normal(size=(200, 2, 2))

# this is how I now approach it:

z = np.sum(y[:,:,:,np.newaxis] * x, axis=1)

# z is of shape (200, 2, 1000)

现在我知道numpy.einsum可能会在这里帮助我,但是我想在Theano中做这个特殊的计算,它没有einsum等价物.我将需要使用dot,tensordot或Theano的专用einsum子集函数batched_dot或batched_tensordot.

我希望改变我的方法的原因是性能;我怀疑使用内置(CUDA)点产品将比依赖广播,元素产品和总和更快.

最佳答案 在Theano中,三维和四维张量的尺寸都不是可播放的.你必须明确地设置它们.那么Numpy原则就可以了.一种方法是使用

T.patternbroadcast.要阅读有关广播的更多信息,请参阅

this.

在其中一个张量中有三个维度.首先,您需要在末尾附加单个维度,然后使该维度成为可广播的.这两件事可以通过一个命令来实现 – T.shape_padaxis.整个代码如下:

import theano

from theano import tensor as T

import numpy as np

X = T.ftensor4('X')

Y = T.ftensor3('Y')

Y_broadcast = T.shape_padaxis(Y, axis=-1) # appending extra dimension and making it

# broadcastable

Z = T.sum((X*Y_broadcast), axis=1) # element-wise multiplication

f = theano.function([X, Y], Z, allow_input_downcast=True)

# Making sure that it works and gives correct results

x = np.random.normal(size=(3, 2, 2, 4))

y = np.random.normal(size=(3, 2, 2))

theano_result = f(x,y)

numpy_result = np.sum(y[:,:,:,np.newaxis] * x, axis=1)

print np.amax(theano_result - numpy_result) # prints 2.7e-7 on my system, close enough!

我希望这有帮助.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值