neural-network - 如何在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
解决方案
让我扩展 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], 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 轴的组合将始终返回相同的尺寸。但是,您可以将这些不同大小的输出中的每一个分别用作不同模块、层等的输入。
我个人想不出可以使用随机轴旋转的用例。如果您可以详细说明为什么要这样做,我可以尝试提供一些更好的解决方案。
推荐阅读
- reactjs - 如何找到所有使用从特定 HTTP 请求返回的响应的 React 组件?
- java - jsp迁移tomcat和java版本时出现奇怪错误
- javascript - 大型数据集的 Canvas 和 React Konva 可扩展性?
- google-app-engine - 从 App Engine 中托管的 React App 调用私有云函数
- google-cloud-platform - 仅在不设置“console.cloud.google.com”引用者的情况下为 gcs 使用经过身份验证的 url
- c# - Serilog 日志记录到elasticsearch,延迟时间长,是一种可用于更快记录日志的配置
- python - FileNotFoundError: [WinError 2] 系统找不到指定的文件:'frame_00_delay-0.04s.png' -> '0.png'
- ruby-on-rails - 当其中一个类中有额外的操作时,如何在不同的类中重复使用相同的方法?
- c# - ASP.NET Core 3.1 改变视图而不是重定向
- javascript - Chart.js:一个值为空,但不能断行