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.randinttorch.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 的随机选择?的主要内容,如果未能解决你的问题,请参考以下文章

PyTorch:随机数据加载器

在 Google Colab pro -Pytorch 中随机接收错误消息

PyTorch DataLoader 在每个时期使用相同的随机变换

pytorch 中的常用矩阵操作

PyTorch生成一张随机噪声图片

PyTorch DataLoader 对并行运行的批次使用相同的随机种子