PyTorch:使用一维张量和多通道 (3-D) 图像张量执行 add/sub/mul 操作

PyTorch: Perform add/sub/mul operations using 1-D tensor and multi-channel (3-D) image tensor

注意:我正在寻找 fastest/optimal 做或改进的方法,因为我的限制是时间

使用 PyTorch,我有一个图像作为 3D 张量,假设尺寸为 64 x 400 x 400,其中 64 指的是通道,400 是图像尺寸。有了这个,我有一个 64 长度的一维张量,所有张量都有不同的值,目的是每个通道使用一个值。我想使用每个 1D 张量的值来应用于通道的整个 400x400 块。因此,例如,当我想添加 3d_tensor + 1d_tensor 时,我希望将 1d_tensor[i] 添加到 3d_tensor[i] 中的所有 400x400 = 160000 个值,其中 [i] 的范围从 0 到 63。

我之前做过的:
我试着直接做,只使用运算符:

output_add = 1d_tensor + 3d_tensor

这返回了 3d_tensor (400) 和 1d_tensor (64) 的维度不兼容的错误。

所以我当前的表单使用的是 for 循环

for a, b in zip(3d_tensor, 1d_tensor):
   a += b

然而,在一个阶段,我有四个不同的一维张量同时用于加法、减法或乘法,那么这种 for 循环方法是否最有效?我还计划每张图片重复 20 次以上,所以速度是关键。我也试过将 1d 张量扩展到 64 x 400 x 400 的维度,所以它可以直接使用,但我无法使用 tensor.repeat()

您应该向一维数组添加一些维度:从 64 转换为 (64 x 1 x 1):

output_add = 1d_tensor[:, None, None] + 3d_tensor

使用此 None 类型索引,您可以在任何位置添加维度。 [:, None, None] 将在现有维度之后向一维数组添加两个附加维度。

或者您可以使用 view 获得相同的结果,请参阅:

output_add = 1d_tensor.view(-1, 1, 1) + 3d_tensor

结果与 3D 数组具有相同的维度:(64, 1, 1)。所以pytorch可以使用广播

这里有一个很好的广播解释: