要在Pytorch中执行backward,我们可以使用一个可选参数y.backward(v)来计算乘以v的雅可比矩阵 x = torch.randn(3, requires_grad=True)
y = x * 2
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print(x.grad) 我认为计算雅可比矩阵的成本是相同的,因为计算雅可比矩阵所必需的AD图中的每个节点仍然是计算的。那么为什么Pytorch不想给我们雅可比矩阵呢?
在MATLAB中,我让c是一个之前计算过的大型稀疏矩阵,并希望通过使用c列的外积来为单元数组D赋值。但是,我必须实现特殊的规则,并且不能获得相同c列的外积。
使用第一个for循环从第1列开始,我必须实现另一个for循环和if-else语句(当我在第二个for循环中增加索引时用于“标记”),以避免相同c列的外积。
最后,在嵌套的for循环之后,我想将所有的D相加得到一个矩阵K。这是我的第一个版本和背后的想法:
c = rand(100,100);
D = cell(1,100);
D{1} = eye(100);
for i = 1:100
flag = false;
对于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中执行矩阵乘法?
我想把矩阵T的元素与两个向量vec_1和vec_2的元素相乘,然后求和。使用嵌套的for循环,我可以这样做: T = eye(3);
vec_1 = [4,5,6];
vec_2 = [7,8,9];
tot = 0;
for m=1:3
for n=1:3
tot = tot + T(m,n) .* vec_1(m) .* vec_2(n);
end
end 我想使用矢量化使它更快,所以我尝试了以下方法。 T = eye(3);
vec_1 = [4,5,6];
vec_2 = [7,8,9];
f = @(m,n) T(m,n) .* vec_1(m)
假设我有两个矩阵A和B,它们由列向量组成,如下所示。
A = [a_1,a_2,...,a_N];
B = [b_1,b_2,...,b_N];
有什么方法可以将A中每一列的外积之和的计算与B中的对应列矢量化,这是我的非矢量化解。
S = zeros(size(A,1), size(B,1));
for n=1:N
S = S + A(:,n)*B(:,n)'; % S = S + a_n * b_n'
end
任何帮助都将不胜感激。
寻找两个矩阵A和B的外积
以下是我所做的尝试:
function product(A, B)
n_a, m_a = size(A)
n_b, m_b = size(B)
AB = Array{Float64}(undef, n_a, m_b)
for i in 1:n_a
for j in 1:m_b
AB[i, j] = A[:, j] * B[j, :]'
end
end
return AB
end
product(A, B)
我在尝试运行时出错:Cannot `convert
我有两个向量,比如A:1xN和B:1xM。我想计算它们的外积,并将结果添加到NxM矩阵中。现在,我将其分成两部分,首先计算(A')B,然后将其相加。在分析时,第一步比加法(8倍)花费更多的时间。由于第一步中的乘法次数与第二步中的加法次数相同,是不是因为我的架构支持更快的加法?或者是为存储第一步的结果分配内存所花费的时间?
>> x = randn(1,10000);
>> y = randn(1,10000);
>> tic; z=x'*y; toc;
Elapsed time is 0.560743 seconds.
>> ti
我正在计算(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
我正在用Pytorch编写序列神经网络的序列。在official Pytorch seq2seq tutorial中,有一个注意力解码器的代码,我不能理解/认为可能包含错误。 它通过连接输出和此时的隐藏状态来计算每个时间步的注意力权重,然后乘以一个矩阵,得到一个大小等于输出序列长度的向量。注意,这些注意力权重不依赖于编码器序列(在代码中命名为encoder_outputs ),我认为它应该依赖于编码器序列。 此外,the paper cited in the tutorial还列出了三种不同的得分函数,可用于计算注意力权重(本文的3.1节)。这些函数都不是简单地连接和乘以一个矩阵。 因此,在
我正在尝试做一些非常简单的事情,但是对Python中关于稀疏矩阵和向量的大量信息感到困惑。
我想创建两个向量,x和y,一个长度为5,另一个长度为6,是稀疏的。然后我想在每一个中设置一个坐标。然后我想创建一个矩阵A,sparse,它是5 x 6,然后加上x和y之间的外积,然后我想对这个矩阵A进行奇异值分解。
下面是我尝试过的方法,它在很多方面都出错了。
from scipy import sparse;
import numpy as np;
import scipy.sparse.linalg as ssl;
x = sparse.bsr_matrix(np.zeros(5));
x[1]
我需要分别得到张量每一行的外积。代码是这样的: input1=K.placeholder(shape=(None,12)) prod=K.map_fn(someMethod,input1) someMethod需要执行以下操作: *def someMethod(x):*
## get the outerproduct row-wise of input1 #
outer=x*x.T
## subtract the identity matrix from the outer product #
diff=outer-np.eye(12)
## and
我正在学习本教程https://pytorch.org/tutorials/beginner/nlp/deep_learning_tutorial.html#example-logistic-regression-bag-of-words-classifier nn.Linear(vocab_size, num_labels)表示矩阵形状为num_labels x vocab_size bow_vector维度为1 x vocab_size,nn.linear的输入应为batch_size x features 现在,我们将num_labels x vocab_size矩阵乘以1 x voc
我的Pytorch神经网络中有以下代码:
cos = nn.CosineSimilarity(dim=1)
d = torch.zeros(batch_sz, n, n).to(device="cuda")
for i in range(n):
for j in range(n):
d[:, i, j] = cos(q[:, i, :], k[:, j, :])
q和k的大小都是(batch_sz, n, m)。这段代码显然减慢了我的程序,我想知道Pytorch是否提供了任何函数来提高效率。
非常感谢!