我想知道如何获得与朱莉娅中的numpy.einsum类似的功能。
具体来说,我有一个三阶张量,我想把它乘以一个二阶张量(矩阵),收缩两个维度,得到一个一阶张量(向量)。
目前,我使用的是PyCall,所以我可以使用numpy.einsum函数,如下所示:
using PyCall
@pyimport numpy as np
a = rand(5,4,3)
b = rand(5,4)
c = np.einsum("ijk,ij", a,b)
size(c) == (3,)
依赖于调用python来做张量数学是有点愚蠢的。我还设想,julia实现将具有速度优势。然而,在朱莉娅中
操作:我有维度[n x m x c]的pytorch张量A和维度[1 x 1 x c]的B。我想将每个1 x 1 x c向量的内积与A的B相乘,从而生成[n x m]维的张量C。 在我的网络的前向函数中,在特定的步骤我接收维度[N, channels, Height, Width]的张量,其中N是图像的数量,通道是特征映射中的通道的数量,高度和宽度是当前特征映射的。我还有一个来自其他子网的[N x channels]功能图。下一步,我想执行上面提到的操作。 有人能解释一下pytorch中实现这一步的最佳方式和功能吗? 我刚接触pytorch,找不到合适的方法。Tensorflow支持NHWC
我需要在numpy (或py手电筒)中取两个张量的乘积:
我有过
A = np.arange(1024).reshape(8,1,128)
B = np.arange(9216).reshape(8, 128, 9)
想要得到C,用点积加在A (axis=2)的最后一个昏暗和B的中间暗(axis=1)上。这应该有维度8x9。目前,我正在做:
C = np.zeros([8, 9])
for i in range(8):
C[i,:] = np.matmul(A[i,:,:], B[i,:,:])
如何优雅地做这件事?
我试过:
np.tensordot(weights, feature
我在寻找numpy中的一个矩阵运算,或者最好是在py手电筒中,它允许一个向量(1xN)乘以一个张量(Numpy)并得到(1xMxM)。这很容易使用for循环实现,但是for循环不允许在训练期间反向传播。我试着在numpy和py手电筒中使用matmul (还有其他几种,比如点和bmm),但都无法工作。下面是一个示例(其中有M=2,但在我的用例中是256个),它说明了我要做的事情:
a = np.array([1,2,3])
b = np.array([[[1,2],[3,4]],[[5,6],[7,8]],[[9,10],[11,12]]])
我想执行以下操作:1*[[1,2],[3,4]] +
我试图实现N,x,N,x,P张量的双随机归一化,如第3.2节所述。这可以很容易地在can的情况下使用矩阵运算,但我被困在三维张量的情况。我到目前为止
def doubly_stochastic_normalise(E):
"""E: n x n x f"""
E = E / torch.sum(E, dim=1, keepdim=True) # normalised across rows
F = E / torch.sum(E, dim=0, keepdim=True) # normalised across col
我试图把张量(m,n,o)分解成矩阵A(m,r),B (n,r)和C (k,r)。这被称为PARAFAC分解。已经完成了这种分解。
一个重要的步骤是将A、B和C相乘,得到形状的张量(m,n,o)。
最近这样做的情况如下:
def kt_to_tensor(A, B, C):
factors = [A, B, C]
for r in range(factors[0].shape[1]):
vecs = np.ix_(*[u[:, r] for u in factors])
if r:
res += reduce(np.mul
我想计算一维两个三维张量之间的点积。我尝试了以下einsum符号:
import numpy as np
a = np.random.randn(30).reshape(3, 5, 2)
b = np.random.randn(30).reshape(3, 2, 5)
# Expecting shape: (3, 5, 5)
np.einsum("ijk,ikj->ijj", a, b)
遗憾的是,它返回了以下错误:
ValueError: einstein sum subscripts string includes output subscript 'j&
在科学计算中,三维场可以离散为F[nx, ny, nz],其中nx、ny和nz是网格点在三个方向上的个数。在每一点上,假设我们附加了n-by-n张量。所以对于张量场,我们可以用一个5D数组来表示T[n, n, nx, ny, nz]。任意点[i, j, k]的张量可以选择为T[:, :, i, j, k]。如果我想计算每个点的非对角元素之和,我想使用代码。
import numpy as np
r = np.zeros((nx, ny, nz))
for i in range(nx):
for j in range(ny):
for k in range(nz):
我想用张量来计算两个张量的一个特定的点乘积。比如:
A是张量,其形状为(3,4,5) B是张量,其形状为(3,5)
我想做一个点,用A的第三个,B的第二个,得到一个输出,它的dims是(3,4)
如下所示:
for i in range(3):
C[i] = dot(A[i], B[i])
怎么用紧固件做呢?
我对张量代数不太熟悉,我很难理解如何让numpy.tensordot做我想做的事。
我使用的示例很简单:给定一个带有形状(2,2,3)的张量(2,2,3)和另一个具有形状(2,1,3)的b,我想要一个具有shape (2,1)的结果张量c。此张量将是以下等效python代码的结果:
n = a.shape[2]
c = np.zeros((2,n))
for k in range(n):
c += a[:,:,k]*b[:,:,k]
文档中说,可选参数axes
如果是int N,则a的最后N轴与b的第一N轴之和。对应轴的大小必须匹配。
但我不明白这里需要哪一个“轴”(此外,当轴
在python中,可以定义两个不同尺寸的多维张量,并将它们相乘。例如,数组"a“的形状为(1,3),b为(2,1)。产品的形状为(2,3)。张量积的意义是:c_ij = b_i a_j。虽然在本征中具有相同形状的张量积(A C++库)是可能的,但我们能在本征中做同样的事情吗?
from numpy import array as arr
a = arr([[1,2,3]])
b = arr([[5], [10]])
c = a * b
# Outputs
a
array([[1, 2, 3]])
b
array([[ 5],
[10]])
c
array([[ 5, 10
给定PyTorch A (a X m)和B (m X B)中的2个张量2-D,是否有任何有效的方法来获得张量C (m X A X b),其中C[i,:,:] = A[:,i] @ B[i,:] 这里我将给出一个问题的例子: A = torch.FloatTensor([[1,2],[3,4]])
B = torch.FloatTensor([[1,2,3],[4,5,6]]) 结果: C = torch.FloatTensor([[[1,2,3],[3,6,9]],[[12,15,18],[16,20,24]]]) 我已经使用for循环做到了这一点。然而,它的效率非常低。