功能
torch.sign()
用于计算张量中每个元素的符号函数(sign function),即:
- 如果元素 > 0,返回
1
。 - 如果元素 < 0,返回
-1
。 - 如果元素等于
0
,返回0
。
语法
torch.sign(input, *, out=None) -> Tensor
参数
input
: 输入张量,可以是任意形状。out
(可选): 用于保存输出结果的张量。它的形状和类型需与input
相同。
返回值
- 一个与
input
张量形状相同的新张量,元素值是输入张量中各元素符号的结果。
示例代码
基本用法
import torchx = torch.tensor([-3.0, 0.0, 4.0])
result = torch.sign(x)print(result) # 输出: tensor([-1., 0., 1.])
结合 out
参数
x = torch.tensor([3.0, -1.0, 0.0])
out = torch.empty_like(x) # 创建一个与 x 形状相同的张量
torch.sign(x, out=out)print(out) # 输出: tensor([ 1., -1., 0.])
注意事项
-
适用于浮点数和整数类型:
- 支持
float
、double
、int
、long
等张量数据类型。 - 返回的张量数据类型与输入张量一致。
- 支持
-
符号函数处理 0:
- 对于值为
0
的元素,结果严格返回0
(而不是浮点误差)。
- 对于值为
-
不改变输入张量:
torch.sign()
不会对输入张量进行修改,而是返回一个新的张量(除非显式使用out
参数)。
-
支持自动微分:
- 在需要梯度计算的场景中,
torch.sign()
支持与 PyTorch 的自动微分一起使用。
- 在需要梯度计算的场景中,
应用场景
-
梯度符号计算: 在优化问题中,
torch.sign()
常用于计算梯度符号,决定参数的更新方向。 -
稀疏矩阵的符号处理: 对稀疏矩阵应用符号函数,提取正值或负值元素的分布。
-
符号对比: 在数据分析或机器学习任务中,用于对张量符号进行比较分析。
-
数据预处理: 用于对数据进行符号化处理,例如将数据分为正、负和零三类。
代码示例:结合实际应用
符号映射
将张量中的正值替换为 1
,负值替换为 -1
,零值保持为 0
。
x = torch.tensor([-3.0, -0.5, 0.0, 2.0, 4.5])
sign_map = torch.sign(x)print(sign_map) # 输出: tensor([-1., -1., 0., 1., 1.])
梯度方向调整
在优化过程中,使用符号函数调整更新方向:
grad = torch.tensor([-0.8, 0.0, 2.3, -1.5])
update_direction = torch.sign(grad)print(update_direction) # 输出: tensor([-1., 0., 1., -1.])
总结
torch.sign()
的作用: 计算张量中元素的符号(-1、0、1)。- 使用场景: 梯度处理、数据分类、优化方向计算。
- 注意点: 确保输入张量的元素类型为数值类型;对稀疏张量使用时需注意额外操作。