mltool-0.1.0.0: test/MachineLearning/NeuralNetworkTest.hs
module MachineLearning.NeuralNetworkTest
(
tests
)
where
import Test.Framework (testGroup)
import Test.Framework.Providers.HUnit
import Test.HUnit
import Test.HUnit.Approx
import Test.HUnit.Plus
import MachineLearning.DataSets (dataset2)
import qualified Control.Monad.Random as RndM
import qualified Numeric.LinearAlgebra as LA
import qualified MachineLearning as ML
import qualified MachineLearning.Optimization as Opt
import MachineLearning.Model
import MachineLearning.NeuralNetwork
import qualified MachineLearning.NeuralNetwork.TopologyMaker as TM
(x, y) = ML.splitToXY dataset2
gradientCheckingEps = 0.1
checkGradientTest eps activation loss lambda = do
let nnt = TM.makeTopology activation loss (LA.cols x) 2 [10]
model = NeuralNetwork nnt
thetas = initializeTheta 1511197 nnt
diffs = take 5 $ map (\e -> Opt.checkGradient model lambda x y thetas e) [0.005, 0.0051 ..]
diff = minimum $ filter (not . isNaN) diffs
assertApproxEqual (show thetas) eps 0 diff
xPredict = LA.matrix 2 [ -0.5, 0.5
, 0.2, -0.2
, 1, 1
, 1, 0
, 0, 0]
yExpected = LA.vector [1, 1, 0, 0, 1]
learnTest activation loss minMethod nIters =
let lambda = L2 $ 0.5 / (fromIntegral $ LA.rows x)
x1 = ML.mapFeatures 2 x
nnt = TM.makeTopology activation loss (LA.cols x1) 2 [10]
model = NeuralNetwork nnt
xPredict1 = ML.mapFeatures 2 xPredict
initTheta = initializeTheta 5191711 nnt
(theta, optPath) = Opt.minimize minMethod model 1e-7 nIters lambda x1 y initTheta
yPredicted = hypothesis model xPredict1 theta
js = (LA.toColumns optPath) !! 1
in do
assertVector (show js) 0.01 yExpected yPredicted
tests = [ testGroup "gradient checking" [
testCase "Sigmoid - Logistic: non-zero lambda" $ checkGradientTest 0.1 TM.ASigmoid TM.LLogistic (L2 0.01)
, testCase "Sigmoid - Logistic: zero lambda" $ checkGradientTest 0.1 TM.ASigmoid TM.LLogistic (L2 0)
, testCase "ReLU - Softmax: non-zero lambda" $ checkGradientTest 0.1 TM.ARelu TM.LSoftmax (L2 0.01)
, testCase "ReLU - Softmax: zero lambda" $ checkGradientTest 0.1 TM.ARelu TM.LSoftmax (L2 0)
, testCase "Tanh - MultiSvm: non-zero lambda" $ checkGradientTest 0.1 TM.ATanh TM.LMultiSvm (L2 0.01)
, testCase "Tanh - MultiSvm: zero lambda" $ checkGradientTest 0.1 TM.ATanh TM.LMultiSvm (L2 0)
, testCase "Tanh - MultiSvm: no reg" $ checkGradientTest 0.1 TM.ATanh TM.LMultiSvm RegNone
]
, testGroup "learn" [
testCase "Sigmoid - Logistic: BFGS" $ learnTest TM.ASigmoid TM.LLogistic (Opt.BFGS2 0.01 0.7) 50
, testCase "ReLU - Softmax: BFGS" $ learnTest TM.ARelu TM.LSoftmax (Opt.BFGS2 0.1 0.1) 50
, testCase "Tanh - MultiSvm: BFGS" $ learnTest TM.ATanh TM.LMultiSvm (Opt.BFGS2 0.1 0.1) 50
]
]