目前,我正在尝试使用numpy作为向量来创建一个tensordot。例如,假设我有以下变量:
a = [np.array([1, 2]), np.array([3,4])]
b = [np.array([5,6]), np.array([7,8])]
我想计算“向量的张量乘积”,即[a*b,a*b1,a1*b,a1*b1],在我们的例子中给出:
a x b = [[5,12], [7,16], [15, 24], [21, 32]]
我试过在不同的轴上使用张力点的许多组合,但是它从来没有给出我想要的结果:
例如,我尝试了以下几种方法:
np.tensordot(a,b)
这给了我array(
对于numpy,我可以这样做一个简单的矩阵乘法:
a = numpy.ones((3, 2))
b = numpy.ones((2, 1))
result = a.dot(b)
但是,这不适用于PyTorch:
a = torch.ones((3, 2))
b = torch.ones((2, 1))
result = torch.dot(a, b)
此代码引发以下错误:
RuntimeError:一维张量,但得到二维张量和二维张量
如何在PyTorch中执行矩阵乘法?
我试图了解numpy.tensordot命令是如何工作的。我浏览了在这个论坛上发布的与这个命令有关的不同问题。此外,axes (1,0)表示将对axes 1 in a和axes 0 in b进行求和。因此,我把沿轴1、a和b中的零轴之和,然后手工计算答案,但结果是不同的。也许我的理解是沿着某一特定轴相加是错误的。请有人解释一下我们是如何在下面的代码中得到最终结果的吗?
a = numpy.array([[1,2],[3,4]])
b = numpy.array([[0,5],[-1,20]])
c = numpy.tensordot(a,b,axes=(1,0))
print(c)
pri
我正在尝试在NumPy/Tensorflow中执行张量乘法。
我有3个张量- A (M X h), B (h X N X s), C (s X T)。
我相信A X B X C应该产生一个张量D (M X N X T)。
下面是代码(同时使用numpy和tensorflow)。
M = 5
N = 2
T = 3
h = 2
s = 3
A_np = np.random.randn(M, h)
C_np = np.random.randn(s, T)
B_np = np.random.randn(h, N, s)
A_tf = tf.Variable(A_np)
C_tf = tf.Vari
我对张量代数不太熟悉,我很难理解如何让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轴之和。对应轴的大小必须匹配。
但我不明白这里需要哪一个“轴”(此外,当轴
我想实现一个张量Tucker积,
(cube).Output:输入:B in (m, n),C in shape (n, n, n) (n, n, n) Y in shape (m, m, m),s.t.Y_ijk = ∑_{0≤a,b,c<n} B_ia * B_jb * B_kc * C_abc.
循环代码的原始代码:
def raw_tensor_product(B, C, i, j, k):
'''
@param B: (m, n)
@param C: (n, n, n)
@param i: index in range(0
我有一个形状为(?,a,a,b)的张量元素。我想将其转换为形状为(?,a,b)的张量,其中:
output[ i , j , k ] = input[ i , j , j , k ].
这在numpy中很简单,因为我可以通过循环i,j,k来分配元素。然而,所有的操作都必须留在Tensorflow中作为张量,因为它需要评估成本函数和训练模型。
我已经看过了,但根据我的理解,这不能在特定的轴上指定,必须对整个张量进行。
我和有同样的问题。但是,我希望在每个组(或标签)中创建我的张量的产品。不幸的是,我找不到一个本机PyTorch函数来解决我的问题,就像产品的假设scatter_prod_ (和等效于scatter_add_ )一样,这是中使用的函数。
从的问题中回收示例代码,考虑2D张量:
samples = torch.Tensor([
[0.1, 0.1], #-> group / class 1
[0.2, 0.2], #-> group / class 2
[0.4, 0.4], #-> group / class 2
[0.0, 0
我是Pytorch的初学者,我被一个问题困扰了好几天。我想保存一个图像,这是在Pytorch张量形式为.mat文件。我看过了,但似乎没有直接的方法将Pytoch张量转换为.mat文件。我找到的一个可能的解决方案是将其转换为numpy数组,但由于我使用的是Nvidia GPU,所以当我尝试将Pytorch张量转换为numpy数组时,它给出了这个错误: fake_images[0] = fake_images[0].numpy() TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() t
我尝试将一个函数应用于3d火炬张量,同时将该函数应用于2d张量,该张量通过3d火炬张量的轴1读取。 例如,我有一个形状为(51, 128, 20100) (名为autoencode_logprob的变量)的火炬张量,函数(Rawid2sentence)在形状(51, 20100)的输入上运行。 现在,我编写了使用naive for循环运行的代码,使用range(128)逐个循环。 然而,它太慢了。以下是重要的代码部分。 autoencode_logprobs是3d张量,我需要沿着它的第二个轴应用rawids2sentence函数。有没有帮助将其矢量化? for i in range(128)
例如,我有一个N B x H张量列表(即N x B x H张量)和一个N向量列表(即N x B张量)。我要把列表中的每个B x H张量乘以相应的B维张量,从而得到N x H张量。
我知道如何使用单个for-loop和PyTorch来实现计算,但是有矢量注入吗?(即不使用for-loop,只使用PyTorch/numpy操作)
假设我有以下张量:
X = np.zeros((3,201, 340))
Y = np.zeros((340, 28))
用numpy成功地制作X,Y的点积,并产生形状(3,201,28)的张量。然而,使用tensorflow时,我得到了以下错误:Shape must be rank 2 but is rank 3 error ...
最小代码示例:
X = np.zeros((3,201, 340))
Y = np.zeros((340, 28))
print(np.dot(X,Y).shape) # successful (3, 201, 28)
tf.matmul(X, Y) # err
我有两个数组。一个是n,p,另一个是d,p,r。我希望我的输出是d,n by r,在构造下面的张量B时,可以很容易地实现这个输出。但是,我想在没有这个循环的情况下这样做。
import numpy
X = numpy.array([[1,2,3],[3,4,5],[5,6,7],[7,8,9]]) # n x p
betas = numpy.array([[[1,2],[1,2],[1,2]], [[5,6],[5,6],[5,6]]]) # d x p x r
print X.shape
print betas.shape
B = numpy.zeros((betas.shape[0]
我正在计算(50500,)大小向量之间的巨大外积,发现NumPy是(多?)这样做比PyTorch更快。
以下是测试结果:
# NumPy
In [64]: a = np.arange(50500)
In [65]: b = a.copy()
In [67]: %timeit np.outer(a, b)
5.81 s ± 56.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
-------------
# PyTorch
In [73]: t1 = torch.arange(50500)
In [76]: t2