如何解决如何在pytorch中分别批量旋转图像
我使用 torch.rot90 在 pytorch 中随机旋转 3D 图像,但这会以相同的方式旋转批次中的所有图像。我想找到一种可微分的方法来在不同的轴上随机旋转每个图像。 这是将每个图像旋转到相同方向的代码:
#x = next batch
k = torch.randint(0,4,(1,)).item()
dims = [0,0]
dims[0] = dims[1] = torch.randint(2,5,))
while dims[0] == dims[1]:#this makes sure the two axes aren't the same
dims[1] = torch.randint(2,))
x = torch.rot90(x,k,dims)
# x is now a batch of 3D images that have all been rotated in the same random orientation
解决方法
您可以将批次中的数据随机分成 3 个子集,并分别应用每个维度的旋转。
,让我扩展 iacob 的回答。首先,让我回顾一下rot90函数的参数。除了输入张量,它还需要 k 和 dims,其中 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],2])
y3 = torch.rot90(x[10:15],[2,3])
print(y1.shape) # torch.Size([5,6,3])
print(y2.shape) # torch.Size([5,6])
print(y3.shape) # torch.Size([5,4])
类似于 iacob 的回答,这里我们对输入的切片应用 3 种不同的旋转。请注意,由于在不同维度上旋转的性质,输出维度是如何不同的。您无法真正将这些结果连接到一个张量中,除非您有一个非常具体的输入尺寸,例如 Batch x 10 x 10 x 10,其中在 1,2,3 轴的组合上旋转将始终返回相同的尺寸。但是,您可以单独使用这些不同大小的输出中的每一个作为不同模块、层等的输入。
我个人想不出可以使用随机轴旋转的用例。如果你能详细说明你为什么要这样做,我可以尝试提供一些更好的解决方案。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。