0 | module Data.Tensor.Softargmax
2 | import Data.Tensor.Tensor
3 | import Data.Tensor.Utils
13 | logSumExp : {i : Axis} -> Exp a => Ord a => Neg a =>
14 | Foldable (Tensor [i]) =>
15 | Tensor [i] a -> Maybe a
18 | pure $
c + log (reduce @{algebraFoldable} (t <&> (\x => exp $
x - c)))
24 | logSoftargmax : {i : Axis} -> Exp a => Ord a => Neg a =>
25 | Foldable (Tensor [i]) =>
26 | Tensor [i] a -> Tensor [i] a
27 | logSoftargmax t = case logSumExp t of
28 | Just lse => t <&> (\x => x - lse)
35 | softargmaxImpl : {i : Axis} -> Fractional a => Exp a => Ord a => Neg a =>
36 | IsFoldable i .cont =>
37 | {default 1 temperature : a} ->
38 | Tensor [i] a -> Tensor [i] a
39 | softargmaxImpl {temperature} t
40 | = exp <$> logSoftargmax (t <&> (/ temperature))