Чтобы инициализировать ваши тензоры a
и b
в PyTorch, вы делаете следующее:
a = torch.tensor([1,2,3,4,5], dtype=torch.float32)
b = torch.tensor([6,7,8,9,10], dtype=torch.float32)
Но , поскольку вам нужно, чтобы они были полностью на GPU, вы должны использовать волшебную функцию .cuda()
. Итак, это будет:
a = torch.tensor([1,2,3,4,5], dtype=torch.float32).cuda()
b = torch.tensor([6,7,8,9,10], dtype=torch.float32).cuda()
Что перемещает тензор в графический процессор
Другой способ инициализации:
a = torch.FloatTensor([1,2,3,4,5]).cuda()
b = torch.FloatTensor([6,7,8,9,10]).cuda()
Если нам нужно сгенерировать случайное нормальное распределение, мы используем torch.randn
(есть также torch.rand
, который делает равномерное случайное распределение).
li = torch.randn(5, 5)
(поймать ошибку, она должна быть инициализирована на cuda
, вы не можете выполнять операции над тензорами, расположенными на отдельных процессорах, т. Е. CPU и GPU)
li = torch.randn(5, 5).cuda()
Нет никакой разницы для инициализации li_switch
.
Один из возможных способов обработки func_0
и func_1
- объявить их как
def func_0(li_value):
return torch.add(a, li_value)
def func_1(li_value):
return torch.sub(b, li_value)
Тогда для вызова функции предиката это может быть так же просто, как сделать это:
for i, pred in enumerate(li_switch):
if pred:
func_0(li[i])
else:
func_1(li[i])
Однако я предлагаю векторизовать ваши операции и сделать что-то вроде:
li_switch = torch.tensor([True, False, False, True, True])
torch.add(a, li[li_switch]).sum(dim=0)
torch.sub(b, li[~li_switch]).sum(dim=0)
Это гораздо более оптимизировано.