【问题标题】:how to rotate images in a batch separately in pytorch如何在pytorch中单独批量旋转图像
【发布时间】:2021-07-14 00:16:24
【问题描述】:

我在 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-network pytorch conv-neural-network backpropagation


    【解决方案1】:

    您可以将批次中的数据随机分成 3 个子集,并分别应用每个维度的旋转。

    【讨论】:

    • 然后将其加入 1 张量?那可以区分吗?
    【解决方案2】:

    让我扩展 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 轴的组合将始终返回相同的尺寸。但是,您可以将这些不同大小的输出分别用作不同模块、层等的输入。

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

    【讨论】:

    • 嗨,我正在使用它来增强神经网络中的数据。也就是说,通过应用转换来改变我拥有的少量数据来模拟更大的训练集。我知道你可以旋转批次的不同部分,但我想确保转换是可微的,因此可以反向传播。
    猜你喜欢
    • 2020-02-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    • 1970-01-01
    相关资源
    最近更新 更多