pytorch api文档:torch.log() 函数-自然对数 作者:马育民 • 2026-01-28 14:59 • 阅读:10002 # 介绍 PyTorch 中的 `torch.log()` 函数,用于计算 **张量自然对数** 。 # 语法 用于计算输入张量中 **每个元素的自然对数(以 `e` 为底,`e≈2.71828`)**,输出是与输入形状相同的张量。 ``` torch.log(input, out=None) ``` #### 参数 - input:指定需要计算自然对数的张量(Tensor),必须传入。仅支持 **浮点型张量**(`float32`/`float64`),如果输入是整型张量,会先自动转换为浮点型,建议提前显式转换以避免隐式类型问题。 - **输入值范围**: - 输入为 **0**:输出 `-inf`(负无穷); - 输入为 **负数**:输出 `nan`(非数值); - 实际使用中需先过滤非正数,避免计算异常。 - out:传入张量,将计算结果直接写入该张量。**注意:**张量必须与 `input` 张量形状相同、数据类型兼容。如果不指定,函数会新建一个张量存储结果。 # 例子 ```python 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]]) ``` ### 避坑示例(处理非正数) ```python 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)$$ ### 自定义底数示例 ```python 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()`,或通过换底公式自定义。 原文出处:http://malaoshi.top/show_1GW2ftW2ppdv.html