mltool-0.1.0.0: test/MachineLearning/NeuralNetwork/WeightInitializationTest.hs
module MachineLearning.NeuralNetwork.WeightInitializationTest
(
tests
)
where
import Test.Framework (testGroup)
import Test.Framework.Providers.HUnit
import Test.HUnit
import Test.HUnit.Approx
import Test.HUnit.Plus
import Control.Monad (replicateM)
import qualified Data.Vector.Storable as V
import qualified Numeric.LinearAlgebra as LA
import qualified Numeric.GSL.Statistics as Stat
import qualified Control.Monad.Random as RndM
import MachineLearning.NeuralNetwork.WeightInitialization
assertDistribution eps x mu e = do
let mean = Stat.mean x
assertApproxEqual "mean" eps mu mean
assertBool "maximum" $ (V.maximum x) <= e
assertBool "minimum" $ (V.minimum x) >= (-e)
generateData algo n sz = do
rndList <- replicateM n $ RndM.evalRandIO (algo sz)
let (bs, ws) = unzip rndList
b = LA.flatten $ LA.fromBlocks [bs]
w = LA.flatten $ LA.fromBlocks [ws]
return (b, w)
testWeightInitAlgo eps algo n sz mu e = do
(b, w) <- generateData algo n sz
assertDistribution eps b 0 0
assertDistribution eps w mu e
heEps (r, c) = sqrt (2/(fromIntegral $ r + c))
nguyenEps (r, c) = (sqrt 6) / (sqrt . fromIntegral $ r + c)
sz = (7, 5)
tests = [ testGroup "flatten" [
testCase "hu" $ testWeightInitAlgo 1e-1 he 100 sz 0 (heEps sz)
, testCase "nguyen" $ testWeightInitAlgo 1e-1 nguyen 100 sz 0 (nguyenEps sz)
]
]