Тензор маскирования одинаковой формы в PyTorch - PullRequest
0 голосов
/ 23 октября 2019

Учитывая массив и маску одинаковых фигур, я хочу получить маскированный вывод той же формы, содержащий 0, где маска - Ложь.

Например,

# input array
img = torch.randn(2, 2)
print(img)
# tensor([[0.4684, 0.8316],
#        [0.8635, 0.4228]])
print(img.shape)
# torch.Size([2, 2])

# mask
mask = torch.BoolTensor(2, 2)
print(mask)
# tensor([[False,  True],
#        [ True,  True]])
print(mask.shape)
# torch.Size([2, 2])

# expected masked output of shape 2x2
# tensor([[0, 0.8316],
#        [0.8635, 0.4228]])

Проблема:маскировка изменяет форму вывода следующим образом:

#1: shape changed
img[mask]
# tensor([0.8316, 0.8635, 0.4228])

Ответы [ 3 ]

1 голос
/ 24 октября 2019

Просто приведите вашу логическую маску к целочисленной маске, а затем поплавок, чтобы привести маску к тому же типу, что и в img. Затем выполните поэлементное умножение.

masked_output = img * mask.int().float()

1 голос
/ 23 октября 2019

Самый простой способ - создать еще один тензор для обработки.

import torch

def generate_masked_tensor(input, mask, fill=0):
    masked_tensor = torch.zeros(input.size()) + fill
    masked_tensor[mask] = input[mask]
    return masked_tensor

if __name__ == "__main__":
    img = torch.randn(2, 2)
    mask = torch.tensor([False, True, True, False]).bool().view(2, 2)
    masked_img = generate_masked_tensor(img, mask)
    print (masked_img)

Вывод:

tensor([[0.0000, 0.8028],
        [1.5411, 0.0000]])
0 голосов
/ 24 октября 2019

Я нашел один из способов ее решения:

img[mask==False] = 0

или использование

img[~mask] = 0

Это изменит само img.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...