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可以使用广播
这里有一个很好的广播解释:
注意:我正在寻找 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可以使用广播
这里有一个很好的广播解释: