Skip to content

SoftMax

Описание

Info

Родительский класс: Module

Производные классы: -

Этот модуль применяет софтмакс-функцию ко входному тензору. Softmax — это обобщение логистической функции для многомерного случая, определяется по формуле:

\begin{equation}\label{eq:softmax} \sigma(z)_i = \frac{e^{z_i}}{\sum \limits_{k=1}^{K} e^{z_k}} \end{equation}

Софтмакс-функция применяется вдоль измерения глубины тензора (вдоль карт) и масштабирует их значения так, чтобы элементы лежали в диапазоне [0, 1] и и в сумме давали 1, т.е. если есть тензор размерности (N, C, H, W), где N - размер батча, C - количество карт (каналов), H - высота карты, W - ширина карты, причём каждый элемент карт x_{nchw}\in{R}, то при прохождении черех софтмакс-функцию x_{nchw}\in[0, 1], причём \displaystyle\sum_{c=1}^C x_{nchw} = 1.

Часто софтмакс используется для последнего слоя глубоких нейронных сетей для задач классификации. Для обучения нейронной сети при этом в качестве функции потерь используется перекрёстная энтропия.

Инициализация

def __init__(self, name=None):

Параметры

Параметр Возможные типы Описание По умолчанию
name str Имя слоя None

Пояснения

-

Примеры

Необходимые импорты.

import numpy as np
from PuzzleLib.Backend import gpuarray
from PuzzleLib.Modules import SoftMax

Info

gpuarray необходим для правильного размещения тензора на GPU

Для простоты возьмём карты единичной высоты:

np.random.seed(123)
batchsize, maps, h, w = 1, 3, 1, 3
data = gpuarray.to_gpu(np.random.randn(batchsize, maps, 1, 3).astype(np.float32))
print(data)

[[[[-1.0856307   0.99734545  0.2829785 ]]

  [[-1.5062947  -0.5786002   1.6514366 ]]

  [[-2.4266791  -0.42891264  1.2659363 ]]]]
softmax = SoftMax()
outdata = softmax(data)
print(outdata)
[[[[0.521327   0.69107646 0.13155064]]

  [[0.34230885 0.14292283 0.51690024]]

  [[0.13636416 0.16600075 0.35154915]]]]
print(np.sum(outdata.get(), axis=1))
[[[1. 1. 1.]]]