我有一个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。
有人知道如何快速做到这一点吗?
回答:
我从未使用过Torch,但它的文档中提到:http://torch7.readthedocs.io/en/rtd/maths/#torch.clamp
[res] torch.clamp([res,] tensor1, min_value, max_value)
将张量中的所有元素限制在[min_value, max_value]范围内。即:
y_i = x_i, 如果 x_i >= min_value 或 x_i <= max_value = min_value, 如果 x_i < min_value = max_value, 如果 x_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中。
我想这就是你要找的吧?