首页 > 解决方案 > 如何在pytorch中单独批量旋转图像

问题描述

我在 pytorch 中使用 torch.rot90 随机旋转 3D 图像,但这会以相同的方式旋转批次中的所有图像。我想找到一种可区分的方法来随机旋转不同轴上的每个图像。这是将每个图像旋转到相同方向的代码:

#x = next batch

k = torch.randint(0, 4, (1,)).item()
dims = [0,0]
dims[0] = dims[1] = torch.randint(2, 5, (1,))
while dims[0] == dims[1]:#this makes sure the two axes aren't the same
    dims[1] = torch.randint(2, 5, (1,))

x = torch.rot90(x, k, dims)

# x is now a batch of 3D images that have all been rotated in the same random orientation

标签: neural-networkpytorchconv-neural-networkbackpropagation

解决方案


让我扩展 iacob 的答案。首先,让我回顾一下 rot90 函数的参数。除了输入张量之外,它还需要kdims,其中 k 是要完成的旋转次数,而 dims 是一个列表或元组,其中包含有关如何旋转张量的两个维度。例如,如果张量是 4D,则 dims 可以是 [0, 3] 或 (1,2) 或 [2,3] 等。它们必须是有效的轴,并且应该包含两个数字。您实际上不需要为此参数或 k 创建张量。重要的是要注意,根据给定的暗淡,输出形状可能会发生巨大变化:

x = torch.rand(15, 3, 4,6)
y1 = torch.rot90(x[0:5], 1, [1,3])     
y2 = torch.rot90(x[5:10], 1, [1,2])    
y3 = torch.rot90(x[10:15], 1, [2,3])   
print(y1.shape)   # torch.Size([5, 6, 4, 3])
print(y2.shape)   # torch.Size([5, 4, 3, 6])
print(y3.shape)   # torch.Size([5, 3, 6, 4])

与 iacob 的回答类似,这里我们对输入切片应用 3 种不同的旋转。请注意,由于不同维度上的旋转性质,输出维度是如何不同的。你不能真正将这些结果合并到一个张量中,除非你有一个非常具体的输入大小,例如 Batch x 10 x 10 x 10 ,其中旋转 1,2,3 轴的组合将始终返回相同的尺寸。但是,您可以将这些不同大小的输出中的每一个分别用作不同模块、层等的输入。

我个人想不出可以使用随机轴旋转的用例。如果您可以详细说明为什么要这样做,我可以尝试提供一些更好的解决方案。


推荐阅读