#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()
, но это очень медленно. Есть какие-нибудь подсказки о том, как повернуть тензор, который находится на графическом процессоре?