grenade-0.1.0: test/Test/Grenade/Layers/Nonlinear.hs
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE LambdaCase #-}
{-# OPTIONS_GHC -fno-warn-missing-signatures #-}
module Test.Grenade.Layers.Nonlinear where
import Data.Singletons
import Grenade
import Hedgehog
import Test.Hedgehog.Compat
import Test.Hedgehog.Hmatrix
import Test.Hedgehog.TypeLits
import Numeric.LinearAlgebra.Static ( norm_Inf )
prop_sigmoid_grad :: Property
prop_sigmoid_grad = property $
blindForAll genShape >>= \case
(SomeSing (r :: Sing s)) ->
withSingI r $
blindForAll genOfShape >>= \(ds :: S s) ->
let (tape, f :: S s) = runForwards Logit ds
((), ret :: S s) = runBackwards Logit tape (1 :: S s)
(_, numer :: S s) = runForwards Logit (ds + 0.0001)
numericalGradient = (numer - f) * 10000
in assert ((case numericalGradient - ret of
(S1D x) -> norm_Inf x < 0.0001
(S2D x) -> norm_Inf x < 0.0001
(S3D x) -> norm_Inf x < 0.0001) :: Bool)
prop_tanh_grad :: Property
prop_tanh_grad = property $
blindForAll genShape >>= \case
(SomeSing (r :: Sing s)) ->
withSingI r $
blindForAll genOfShape >>= \(ds :: S s) ->
let (tape, f :: S s) = runForwards Tanh ds
((), ret :: S s) = runBackwards Tanh tape (1 :: S s)
(_, numer :: S s) = runForwards Tanh (ds + 0.0001)
numericalGradient = (numer - f) * 10000
in assert ((case numericalGradient - ret of
(S1D x) -> norm_Inf x < 0.001
(S2D x) -> norm_Inf x < 0.001
(S3D x) -> norm_Inf x < 0.001) :: Bool)
tests :: IO Bool
tests = $$(checkConcurrent)