向量化代码并从 pytorch 代码中删除嵌套循环

Posted

技术标签:

【中文标题】向量化代码并从 pytorch 代码中删除嵌套循环【英文标题】:Vectorize code and remove nested loops from pytorch code 【发布时间】:2021-08-13 15:21:02 【问题描述】:

是否可以删除嵌套循环以迭代所有图像,然后逐行迭代这些图像的所有像素?我发现这很困难,因为我需要使用另一个变量标签中像素(h,w)的位置来准确选择哪个通道的 h,w 值需要归零。

Colab Link

总的来说,我需要做的是给出分割输出([2,2,2,2])(n,通道,高度,宽度)和相应的标签([2,2,2])(n,高度宽度)。我需要添加另一个与输出相同大小的张量 M,除了所有像素的地面实况通道(来自标签)外,它在所有通道上都有一个恒定值 m。

【问题讨论】:

【参考方案1】:

您可以将其矢量化。认识到nhw 对应于mlabels 的所有像素值。因此,您可以执行以下操作:

m[:, labels, ...] = 0

【讨论】:

我试过用这个,但也许我的解释是错误的,它到底应该是什么 'm[:, labels, :, :,] = 0' ,这使得一切都归零。【参考方案2】:

知道我找到的答案是使用 torch.Tensor.scatter_()

new_labels = torch.unsqueeze(labels, 1)
m.scatter_(dim=1, index=new_labels, src=torch.zeros( 2, 2, 2, 2))

基本上,首先将标签的形状设置为 M 形状,然后通过选择轴在标签指定的位置为 m 添加零。

【讨论】:

以上是关于向量化代码并从 pytorch 代码中删除嵌套循环的主要内容,如果未能解决你的问题,请参考以下文章

在pytorch中,有什么向量化的方法可以代替两个FOR循环来完成这个操作?

向量化嵌套循环,其中一个循环变量依赖于另一个

如何向量化嵌套循环

在python中为依赖于索引的函数向量化嵌套的for循环

向量化 Pandas 数据帧

如何在 MATLAB 中编写向量化函数