本文通过 log_softmax源码分析看值与概率的关系,log_softmax在pytorch中常见的有两个实现,一个是torch.nn.LogSoftmax(),一个是F.log_softmax()。
太长不看可以直接点 3.小结
1. F.log_softmax()源码
```python
def log_softmax(input, dim=None, _stacklevel=3, dtype=None):
# type: (Tensor, Optional[int], int, Optional[int]) -> Tensor
if dim is None:
dim = _get_softmax_dim('log_softmax', input.dim(), _stacklevel)
if dtype is None:
ret = input.log_softmax(dim)
else:
ret = input.log_softmax(dim, dtype=dtype)
return ret
```
对softmax的结果计算Log。
虽然在数学上等同于log(softmax(x)),但是
单独操作速度较慢,且数值不稳定。此函数
能够正确计算输出和梯度。
有关详细信息,请参见:class:`~torch.nn.LogSoftmax`。
论据:
输入(张量):输入
dim(int):将沿其计算log_softmax的维度。
dtype(:class:`torch.dtype`,可选):返回的张量的所需数据类型。
这对于防止数据类型溢出非常有用。
2. torch.nn.LogSoftmax()
```python
class LogSoftmax(Module):
__constants__ = ['dim']
def __init__(self, dim=None):
super(LogSoftmax, self).__init__()
self.dim = dim
def __setstate__(self, state):
self.__dict__.update(state)
if not hasattr(self, 'dim'):
self.dim = None
def forward(self, input):
return F.log_softmax(input, self.dim, _stacklevel=5)
```
参考官方文档:
(转载请保留本文链接:https://blog.youkuaiyun.com/ftimes/article/details/119648876)
3. 小结
根据源代码与官方文档,我们可以得出这样的结论:log_softmax是一一种更为强健的方式计算log(softmax)这一对数概率。
同时,在官方文档 torch.nn.Softmax(dim=None) 一节中,也提示到:
This module doesn’t work directly with NLLLoss, which expects the Log to be computed between the Softmax and itself. Use LogSoftmax instead (it’s faster and has better numerical properties).
值得强调的是,在pytorch中使用的是log这一符号,约定俗称的为以e为底,所以,通常情况下,我们可以通过torch.exp()还原回softmax()。
Out[11]:
tensor([ -8.7414, -8.5590, -10.5708, -3.1370, -4.8619, -

本文解析了PyTorch中log_softmax的源码,比较了F.log_softmax和torch.nn.LogSoftmax的实现,重点讲解了log_softmax如何将softmax的概率值转换为对数形式,以及它在数值稳定性和效率上的优势。通过实例展示了如何利用这些函数理解和应用在实际任务中。
最低0.47元/天 解锁文章
943

被折叠的 条评论
为什么被折叠?



