Класс LogSoftmax
Класс LogSoftmax применяет логарифмическую функцию
Softmax к входным данным. Это эквивалентно применению
функции Softmax с последующим взятием логарифма,
но реализовано более численно стабильно. Класс принимает
параметр dim, который указывает ось, по которой
будет выполняться вычисление.
Синтаксис
torch.nn.LogSoftmax(dim)
Параметры
Метод принимает один обязательный параметр:
-
dim(int) - измерение тензора, по которому применяется логарифмическая функция Softmax
Пример
Давайте создадим объект LogSoftmax, применяющий
преобразование к последнему измерению тензора:
import torch
log_softmax = torch.nn.LogSoftmax(dim=1)
t = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
res = log_softmax(t)
print(res)
Результат выполнения кода:
tensor([
[-2.4076, -1.4076, -0.4076],
[-2.4076, -1.4076, -0.4076],
])
Пример
Давайте применим LogSoftmax к одномерному тензору
по нулевой оси:
import torch
log_softmax = torch.nn.LogSoftmax(dim=0)
t = torch.tensor([1.0, 2.0, 3.0])
res = log_softmax(t)
print(res)
Результат выполнения кода:
tensor([-2.4076, -1.4076, -0.4076])
Пример
Давайте используем LogSoftmax в составе
нейросети для классификации:
import torch
class SimpleNet(torch.nn.Module):
def __init__(self):
super().__init__()
self.fc = torch.nn.Linear(10, 5)
self.log_softmax = torch.nn.LogSoftmax(dim=1)
def forward(self, x):
x = self.fc(x)
return self.log_softmax(x)
model = SimpleNet()
t = torch.randn(3, 10)
res = model(t)
print(res.shape)
Результат выполнения кода:
torch.Size([3, 5])
Пример
Давайте сравним LogSoftmax с комбинацией
Softmax и log:
import torch
t = torch.tensor([[2.0, 3.0, 1.0], [1.0, 4.0, 2.0]])
log_softmax = torch.nn.LogSoftmax(dim=1)
res1 = log_softmax(t)
softmax = torch.nn.Softmax(dim=1)
res2 = torch.log(softmax(t))
print(torch.allclose(res1, res2))
Результат выполнения кода:
True