У меня есть два массива numpy (изображение и карта среды),
MatA
MatB
Оба с формами (256, 512, 3)
Когда я сделал умножение (по элементам) с помощью numpy:
prod = np.multiply(MatA,MatB)
Я получил желаемый результат (визуализируйте через Pillow при возвращении к изображению)
Но когда я сделал это с помощью pytorch, я получил действительно странный результат (даже не близкий к вышеупомянутому).
Я сделал это с помощью следующего кода:
MatATensor = transforms.ToTensor()(MatA)
MatBTensor = transforms.ToTensor()(MatB)
prodTensor = MatATensor * MatBTensor
По некоторым причинам форма как для MatATensor, так и для MatBtensor
torch.Size([3, 256, 512])
То же самое и для prodTensor.
Когда я попытался изменить форму на (256,512,3)
, я получил ошибку.
Есть ли способ получить такой же результат?
Я новичок в pytorch, поэтому буду признателен за любую помощь.
Если вы прочтете документацию transforms.ToTensor()
, вы увидите, что это преобразование не только преобразует массив numpy в torch.FloatTensor
, но и перемещает его размеры из H
xW
x3
в 3
xH
xW
.
Чтобы «отменить» это, вам нужно
prodasNp = (prodTensor.permute(2, 0, 1) * 255).to(torch.uint8).numpy()
См. permute
для получения дополнительной информации.
@alphjheon обратите внимание, что между permute
и view
есть разница в фундаментальный: хотя view
изменяет форму тензора, нет влияет на фактическое расположение элементов. Напротив, permute
переупорядочивает элементы тензора. Дополнительные сведения см. в статье этот ответ.
Я предлагаю вам использовать torch.from_numpy
, который легко преобразует ваши ndarray
s в тензоры факелов. Как в:
In[1]: MatA = np.random.rand(256, 512, 3)
In[2]: MatB = np.random.rand(256, 512, 3)
In[3]: MatA_torch = torch.from_numpy(MatA)
In[4]: MatB_torch = torch.from_numpy(MatB)
In[5]: mul_np = np.multiply(MatA, MatB)
In[6]: mul_torch = MatA_torch * MatB_torch
In[7]: torch.equal(torch.from_numpy(mul_np), mul_torch)
Out[7]: True
In[8]: mul_torch.shape
Out[8]: torch.Size([256, 512, 3])
Если вы хотите вернуть его в numpy, просто выполните:
mul_torch.numpy()
Спасибо @Shai за ответ. В конце концов мне удалось решить эту проблему, изменив форму матриц в 2d (w * h, 3). Я подтвержу ваше решение в ближайшее время