假设我有一个火炬CUDA张量,我想应用一些函数,sin()但我明确定义了该函数F.如何F在Pytorch中使用并行计算.
让我们调用我正在寻找的函数“ magic_combine”,它可以组合我给它的张量的连续维度。更具体地说,我希望它做以下事情:
a = torch.zeros(1, 2, 3, 4, 5, 6)
b = a.magic_combine(2, 5) # combine dimension 2, 3, 4
print(b.size()) # should be (1, 2, 60, 6)
Run Code Online (Sandbox Code Playgroud)
我知道torch.view()可以做类似的事情。但我只是想知道是否有更优雅的方式来实现目标?
tensor.permute()和之间有什么区别tensor.view()?
他们似乎做同样的事情。
我有以下代码:
a = torch.randint(0,10,[3,3,3,3])
b = torch.LongTensor([1,1,1,1])
Run Code Online (Sandbox Code Playgroud)
我有一个多维索引,b并希望用它来选择一个单元格a.如果b不是张量,我可以这样做:
a[1,1,1,1]
Run Code Online (Sandbox Code Playgroud)
哪个返回正确的单元格,但是:
a[b]
Run Code Online (Sandbox Code Playgroud)
不起作用,因为它只选择了a[1]四次.
我怎样才能做到这一点?谢谢
我以第三种方式失败了.t3还在CPU上.不知道为什么.
a = np.random.randn(1, 1, 2, 3)
t1 = torch.tensor(a)
t1 = t3.to(torch.device('cuda'))
t2 = torch.tensor(a)
t2 = t2.cuda()
t3 = torch.tensor(a, device=torch.device('cuda'))
Run Code Online (Sandbox Code Playgroud) 我有形状的张量 X 和形状的BxNxDY BxNxD。
我想计算批次中每个元素的成对距离,即我是一个BxMxN张量。
我该怎么做呢?
这里有一些关于这个话题的讨论:https : //github.com/pytorch/pytorch/issues/9406,但我不明白,因为有很多实现细节,而没有突出显示实际的解决方案。
一种天真的方法是使用此处讨论的非批量成对距离的答案:https : //discuss.pytorch.org/t/efficient-distance-matrix-computation/9065,即
import torch
import numpy as np
B = 32
N = 128
M = 256
D = 3
X = torch.from_numpy(np.random.normal(size=(B, N, D)))
Y = torch.from_numpy(np.random.normal(size=(B, M, D)))
def pairwise_distances(x, y=None):
x_norm = (x**2).sum(1).view(-1, 1)
if y is not None:
y_t = torch.transpose(y, 0, 1)
y_norm = (y**2).sum(1).view(1, -1)
else:
y_t = torch.transpose(x, 0, 1)
y_norm = x_norm.view(1, -1) …Run Code Online (Sandbox Code Playgroud) 在给定二维张量的 Python 中,我们可以使用tensor[:,:2]对矩阵左上角前两个元素的 2x2 矩阵进行切片,例如:
x = torch.tensor([[-1.4673, 0.9980, -2.1427, -1.1798, -0.0646, -0.2635, -2.8930, -0.2563,
0.4559, -0.7947, -0.4540, 3.3224, 0.2295, 5.5568, -8.0451, -2.4529,
4.8724, 2.1640, 3.3255, 0.6693, -1.2362, 4.4713, -3.5547, -0.0528,
0.1031, -1.2472, -1.6014, 1.8134],
[ 2.1636, -1.1497, -5.0298, 2.8261, -0.5684, 0.6389, 2.9009, -5.1609,
1.7358, -3.1819, -0.9877, 5.5598, 6.7142, 4.5704, -1.2683, -5.3046,
3.0454, 3.2757, -3.2541, 3.6619, -3.6391, -0.2002, 5.7175, 5.7130,
0.6632, -0.0744, -0.3502, 4.8116]])
y, z = x[:,:2].chunk(2,1)
print(y)
print(z)
Run Code Online (Sandbox Code Playgroud)
[出去]:
tensor([[-1.4673],
[ 2.1636]])
tensor([[ 0.9980],
[-1.1497]])
Run Code Online (Sandbox Code Playgroud)
特别是在 …
有一个随机初始化的火炬张量,其形状如下。
输入
tensor1 = torch.rand((4,2,3,100))
tensor2 = torch.rand((4,2,3,100))
Run Code Online (Sandbox Code Playgroud)
tensor1和tensor2分别是具有 24 100 维向量的火炬张量。
torch.size([4,2,3])我想通过获得具有相同索引的两个张量的向量之间的欧几里德距离来获得形状为 的张量。
我曾经dist = torch.nn.functional.pairwise_distance(tensor1, tensor2)得到过我想要的结果。
但是,该pairwise_distance函数计算张量第二维的欧几里德距离。所以dist形状是torch.size([4,3,100])。
我已经执行了几次转置来解决这些问题。我的代码如下。
tensor1 = tensor1.transpose(1,3)
tensor2 = tensor2.transpose(1,3)
dist = torch.nn.functional.pairwise_distance(tensor1, tensor2)
dist = dist.transpose(1,2)
Run Code Online (Sandbox Code Playgroud)
有没有更简单或更容易的方法来获得我想要的结果?
所以我很难理解一些关于 Pytorch 集合的术语。我不断遇到关于我的张量范围不正确的相同类型的错误,当我尝试谷歌寻找解决方案时,解释往往更加混乱。
下面是一个例子:
m = torch.nn.LogSoftmax(dim=1)
input = torch.tensor([0.3300, 0.3937, -0.3113, -0.2880])
output = m(input)
Run Code Online (Sandbox Code Playgroud)
我没有发现上面的代码有什么问题,我已经定义LogSoftmax了接受一维输入。所以根据我使用其他编程语言的经验,集合[0.3300, 0.3937, -0.3113, -0.2880]是一个单一的维度。
以上触发了以下错误m(input):
IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1)
Run Code Online (Sandbox Code Playgroud)
这意味着什么?
我传入了一个一维张量,但它告诉我它期望的范围是[-1, 0], but got 1.
1to的维度会出现错误[-1, 0]?[-1, 0]是什么意思?我搜索了这个错误的解释,我发现像这个链接这样的东西对我作为一个程序员来说毫无意义:
https://github.com/pytorch/pytorch/issues/5554#issuecomment-370456868
因此,我能够通过向张量数据添加另一个维度来修复上述代码。
IndexError: Dimension out of range (expected to be in range of …Run Code Online (Sandbox Code Playgroud) 是否pytorch支持在不分配更多内存的情况下重复张量?
假设我们有一个张量
t = torch.ones((1,1000,1000))
t10 = t.repeat(10,1,1)
Run Code Online (Sandbox Code Playgroud)
重复t10 次需要占用 10 倍的内存。有没有办法在t10不分配更多内存的情况下创建张量?
这是一个相关的问题,但没有答案。