Я нашел это обсуждение этого, в котором код

if std.is_cuda:
    eps = torch.FloatTensor(std.size()).cuda().normal_()
else:
    eps = torch.FloatTensor(std.size()).normal_()

Становится хорошим

eps = std.new().normal_()

Но там сказано, что

Метод new () устарел.


  1. Как создать новый тензор прямо на конкретном устройстве?
  2. Как создать новый тензор на том же устройстве, как другой тензор, без уродливого if?
4
Gulzar 19 Янв 2021 в 18:37

2 ответа

Лучший ответ

Думаю, теперь документация об этом достаточно ясна. Здесь описаны 4 основных способа создания нового тензора и вам просто нужно указать устройство, чтобы сделать это на gpu:

t1 = torch.zeros((3,3), device=torch.device('cuda'))
t2 = torch.ones_like(t1, device=torch.device('cuda'))
t3 = torch.randn((3,5), device=torch.device('cuda'))

И эта ссылка добавляет дополнительную информацию о torch.tensor() конструктор. Опять же, устройство - это аргумент, который необходимо указать.

Если вы хотите использовать устройство другого тензора, вы можете получить к нему доступ с помощью tensor.device:

t4 = torch.empty((2,2), device=t3.device)
4
trialNerror 19 Янв 2021 в 18:56
torch.ones_like(std).normal_()

Один из параметров ones_like - device, который (из документации) говорит:

device (torch.device, необязательно) - желаемое устройство возвращаемого тензора. По умолчанию: если Нет, по умолчанию используется устройство ввода.

Вы также можете использовать torch.zeros_like

3
nick 19 Янв 2021 в 18:48