如何将 Torch Tensor 按随机角度旋转

3
作为训练卷积神经网络的一部分,我正在使用一个包含<class 'torch.Tensor'>对象的数组inputs。我想将单个<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度的倍数,这并没有帮助我的场景。

谢谢,Vinny


torchvision.transforms.RandomRotation,但它只适用于PIL图像。我不知道是否有广泛的实现适用于torch.Tensor对象。 - Szymon Maszke
旋转后会出现黑色区域。您计划如何填充这些区域? - Mughees
1个回答

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上的情况。当然,你可以将数据传输到cpu(),但那样会非常慢。有没有什么线索可以旋转一个在GPU上的张量? - user989762

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接