Как повернуть тензор факела на случайное число градусов

#python #rotation #pytorch

#python #вращение #pytorch

Вопрос:

в рамках обучения CNN я работаю с массивом, inputs который содержит <class 'torch.Tensor'> объекты. Я хочу повернуть отдельный <class 'torch.Tensor'> объект на некоторое случайное число градусов x , как показано здесь:

 def rotate(inputs, x):
    # Rotate inputs[0] by x degrees, x can take on any value from 0 - 180 degrees
  

Как я могу это сделать? Для существующих реализаций я могу найти только то, что torch имеет rot90 функцию, но это ограничивает меня кратными 90 степенями, что не помогает моему сценарию.

Спасибо, Винни

Комментарии:

1. Есть torchvision.transforms.RandomRotation , но он работает с изображениями PIL. Я не знаю о какой-либо широко распространенной реализации для torch.Tensor объектов.

2. После поворота останутся черные области. Как вы планируете заполнить эти области?

Ответ №1:

Для преобразования torch.tensor вы можете использовать scipy.ndimage.rotate функцию (читайте здесь), которая поворачивает torch.tensor , но также преобразует его в numpy.ndarray , поэтому вам нужно преобразовать его обратно в torch.tensor . Посмотрите на этот игрушечный пример.

Функция:

 def rotate(inputs, x):
    return torch.from_numpy(ndimage.rotate(inputs, x, reshape=False))
  

Подробное объяснение:

 import torch
from scipy import ndimage
alpha = torch.rand(3,3)
print(alpha.dtype)#torch.float32

angle_in_degrees = 45
output = ndimage.rotate(alpha, angle_in_degrees, reshape=False)

print(output.dtype) #numpy_array

output = torch.from_numpy(output) #convert it back to torch tensor

print(output.dtype)  #torch.float32
  

Кроме того, вы можете напрямую преобразовать PIL-изображение перед преобразованием его в тензор, если это возможно. Для преобразования изображения PIL вы можете использовать встроенный PyTorch torchvision.transforms.functional.rotate (читайте здесь).

Комментарии:

1. Этот ответ работает только тогда, когда данные находятся в процессоре. Конечно, вы могли бы перенести данные в cpu() , но это очень медленно. Есть какие-нибудь подсказки о том, как повернуть тензор, который находится на графическом процессоре?