Сделать значения в тензорной области в заданном диапазоне
У меня есть 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
и это работает, есть только одна проблема: производительность ужасна, я знаю, что должен быть какой-то лучший способ сделать это, затем выполнить цикл по всему массиву, учитывая, что большинство тензорных операций, которые не включают в себя ручной цикл по массиву, выполняются намного быстрее, Кто-нибудь знает, как сделать это быстрее?
An example in this is say that I have a `2-3-3` array with the values
[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 ]
then I expect an outcome of
[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.
Кто-нибудь знает, как сделать это быстро?
1 ответ
Я никогда не использовал Факел, но его документация гласит: http://torch7.readthedocs.io/en/rtd/maths/
[res] torch.clamp([res,] тензор1, min_value, max_value)
Зафиксируйте все элементы тензора в диапазоне [min_value, max_value]. то есть:
y_i = x_i, if x_i >= min_value or x_i <= max_value = min_value, if x_i < min_value = max_value, if x_i > max_value
z=torch.clamp(x,0,1)
вернет новый тензор с результатом x, ограниченным между 0 и 1.
torch.clamp(z,x,0,1)
поместит результат в z.
x:clamp(0,1)
выполнит операцию зажима на месте (положив результат в х).
z:clamp(x,0,1)
поместит результат в z.
Я думаю, это то, что вы ищете?