Pytorch 的随机选择?
Posted
技术标签:
【中文标题】Pytorch 的随机选择?【英文标题】:Random Choice with Pytorch? 【发布时间】:2020-04-15 03:00:44 【问题描述】:我有一张张量的图片,想从中随机选择一张。我正在寻找 np.random.choice()
的等价物。
import torch
pictures = torch.randint(0, 256, (1000, 28, 28, 3))
假设我想要 10 张这样的照片。
【问题讨论】:
【参考方案1】:torch
没有 np.random.choice()
的等效实现,请参阅讨论 here。另一种方法是使用随机索引或随机整数进行索引。
用替换:
-
生成 n 个随机索引
用这些索引索引你的原始张量
pictures[torch.randint(len(pictures), (10,))]
要做到这一点没有替换:
-
随机索引
取第 n 个元素
indices = torch.randperm(len(pictures))[:10]
pictures[indices]
阅读有关torch.randint
和torch.randperm
的更多信息。第二个代码 sn-p 的灵感来自 PyTorch 论坛中的 post。
【讨论】:
【参考方案2】:对于这种大小的张量:
N, D = 386363948, 2
k = 190973
values = torch.randn(N, D)
以下代码运行得相当快。大约需要 0.2 秒:
indices = torch.tensor(random.sample(range(N), k))
indices = torch.tensor(indices)
sampled_values = values[indices]
但是,使用torch.randperm
会花费 20 多秒:
sampled_values = values[torch.randperm(N)[:k]]
【讨论】:
【参考方案3】:torch.multinomial
提供与 numpy 的 random.choice
等效的行为(包括带/不带替换的采样):
# Uniform weights for random draw
unif = torch.ones(pictures.shape[0])
idx = unif.multinomial(10, replacement=True)
samples = pictures[idx]
samples.shape
>>> torch.Size([10, 28, 28, 3])
【讨论】:
【参考方案4】:试试这个:
input_tensor = torch.randn(5, 8)
print(input_tensor)
indices = torch.LongTensor(np.random.choice(5,2, replace=False))
output_tensor = torch.index_select(input_tensor, 0, indices)
print(output_tensor)
【讨论】:
【参考方案5】:正如提到的另一个答案,火炬没有choice
。您可以改用randint
或排列:
import torch
n = 4
replace = True # Can change
choices = torch.rand(4, 3)
choices_flat = choices.view(-1)
if replace:
index = torch.randint(choices_flat.numel(), (n,))
else:
index = torch.randperm(choices_flat.numel())[:n]
select = choices_flat[index]
【讨论】:
以上是关于Pytorch 的随机选择?的主要内容,如果未能解决你的问题,请参考以下文章
在 Google Colab pro -Pytorch 中随机接收错误消息