介绍
PyTorch 中的 torch.log() 函数,用于计算 张量自然对数 。
语法
用于计算输入张量中 每个元素的自然对数(以 e 为底,e≈2.71828),输出是与输入形状相同的张量。
torch.log(input, out=None)
参数
- input:指定需要计算自然对数的张量(Tensor),必须传入。仅支持 浮点型张量(
float32/float64),如果输入是整型张量,会先自动转换为浮点型,建议提前显式转换以避免隐式类型问题。- 输入值范围:
- 输入为 0:输出
-inf(负无穷); - 输入为 负数:输出
nan(非数值); - 实际使用中需先过滤非正数,避免计算异常。
- 输入为 0:输出
- 输入值范围:
- out:传入张量,将计算结果直接写入该张量。注意:张量必须与
input张量形状相同、数据类型兼容。如果不指定,函数会新建一个张量存储结果。
例子
import torch
# 1. 标量张量
x = torch.tensor(2.71828) # 接近 e 的值
log_x = torch.log(x)
print("标量对数结果:", log_x) # 输出: tensor(1.0000)
# 2. 一维张量
y = torch.tensor([1.0, math.e, math.e**2, 0.5])
log_y = torch.log(y)
print("一维张量对数结果:\n", log_y)
# 输出: tensor([0.0000, 1.0000, 2.0000, -0.6931])
# 3. 二维张量
z = torch.tensor([[1, e], [e**3, 10]])
log_z = torch.log(z)
print("二维张量对数结果:\n", log_z)
# 输出: tensor([[0.0000, 1.0000], [3.0000, 2.3026]])
避坑示例(处理非正数)
import torch
import math
# 含负数和0的张量
a = torch.tensor([-1.0, 0.0, 2.0, 5.0])
# 方法1:替换非正数为极小值(如1e-8)
a_clamped = torch.clamp(a, min=1e-8) # 把a中小于1e-8的元素替换为1e-8
log_a = torch.log(a_clamped)
print("处理后的对数结果:", log_a)
# 输出: tensor([-18.4207, -18.4207, 0.6931, 1.6094])
# 方法2:只计算正数部分(掩码)
mask = a > 0
log_a_valid = torch.where(mask, torch.log(a), torch.tensor(0.0))
print("掩码后的对数结果:", log_a_valid)
# 输出: tensor([0.0000, 0.0000, 0.6931, 1.6094])
拓展:其他对数函数
如果需要计算其他底数的对数,PyTorch 也提供了对应函数:
torch.log10(x):以 10 为底的对数, log_{10}(x)torch.log2(x):以 2 为底的对数,\log_{2}(x)torch.log1p(x):计算 \log(1+x),适合 x 接近 0 时,精度更高自定义底数(如 3):用换底公式:\log_3(x) = \log(x)/\log(3)
自定义底数示例
x = torch.tensor([9.0, 27.0])
log3_x = torch.log(x) / torch.log(torch.tensor(3.0))
print("以3为底的对数:", log3_x) # 输出: tensor([2., 3.])
总结
torch.log()核心功能是计算张量元素的自然对数(以 e 为底),输出与输入形状一致;- 输入必须是浮点型,且非正数会导致
-inf/nan,需通过torch.clamp()或掩码提前处理; - 其他底数对数可使用
torch.log10()/torch.log2(),或通过换底公式自定义。