将张量中的数值调整到给定的范围内

我有一个 3D 张量,希望确保所有的值都在给定的范围内(在此情况下为 0-1)。为了做到这一点,我已经编写了以下代码:

    function capTo1or0 (Tensor3d)

       tensor_width=Tensor3d:size()[2]
       tensor_height=Tensor3d:size()[3]
       tensor_depth=Tensor3d:size()[1]
       for i=1,tensor_width,1 do
           for j=1,tensor_height,1 do
               for k=1,tensor_depth,1 do
                   if(Tensor3d[k][i][j])>1 then

                       Tensor3d[k][i][j]=1

                   end
                   if(Tensor3d[k][i][j]<0.0) then
                        Tensor3d[k][i][j]=0.0
                   end
               end
           end
        end
       return Tensor3d
    end

它可以工作,但是有一个问题:性能很差,我知道在手动循环数组之外大多数张量操作都要快得多,因此必须有某种更好的方法来做到这一点。 有人知道如何更快地做到这一点吗?

例如,我有一个 `2-3-3` 的数组,其值为

    [1,  2,  0.5][0.5,0.2,-0.2]
     [0.1,0.2,0.3][1,  1,   1  ]
    [-2, -1, 2  ][0.2,-5,-1   ]

那么我期望的结果是
    [1,  1,  0.5][0.5,0.2,0]
    [0.1,0.2,0.3][1,  1,   1  ]
    [0, 0, 1  ]  [0.2,0,-1   ]

将低于下限 0 的每个值替换为 0,将高于上限 1 的每个值替换为 1。

有人知道如何快速做到这一点吗?

点赞
用户2858170
用户2858170

我从未使用过 Torch,但它的文档如下所示: http://torch7.readthedocs.io/en/rtd/maths/#torch.clamp

[res] torch.clamp([res,] tensor1, min_value, max_value)

将张量中的所有元素夹紧在范围[min_value,max_value]内,即:

如果x_i >= min_value或x_i <= max_value,则y_i = x_i,
如果x_i < min_value,则y_i = min_value,
如果x_i > max_value,则y_i = max_value,

z=torch.clamp(x,0,1)将返回一个新的张量,其结果为x在0和1之间的边界。

torch.clamp(z,x,0,1)将在z中放置结果。

x:clamp(0,1)将执行夹紧操作(将结果放置在x中)。

z:clamp(x,0,1)将在z中放置结果。

我猜这就是你想要的?

2017-06-07 19:55:26