pytorch api文档:torch.log() 函数-自然对数

介绍

PyTorch 中的 torch.log() 函数,用于计算 张量自然对数 。

语法

用于计算输入张量中 每个元素的自然对数(以 e 为底,e≈2.71828),输出是与输入形状相同的张量。

torch.log(input, out=None)

参数

  • input:指定需要计算自然对数的张量(Tensor),必须传入。仅支持 浮点型张量(float32/float64),如果输入是整型张量,会先自动转换为浮点型,建议提前显式转换以避免隐式类型问题。
    • 输入值范围:
      • 输入为 0:输出 -inf(负无穷);
      • 输入为 负数:输出 nan(非数值);
      • 实际使用中需先过滤非正数,避免计算异常。
  • 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.])

总结

  1. torch.log() 核心功能是计算张量元素的自然对数(以 e 为底),输出与输入形状一致;
  2. 输入必须是浮点型,且非正数会导致 -inf/nan,需通过 torch.clamp() 或掩码提前处理;
  3. 其他底数对数可使用 torch.log10()/torch.log2(),或通过换底公式自定义。

原文出处:/show_1GW2ftW2ppdv.html