@@ -5,17 +5,21 @@
55{-# LANGUAGE TypeOperators #-}
66{-# LANGUAGE TypeFamilies #-}
77{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE FlexibleContexts #-}
89{-# LANGUAGE FlexibleInstances #-}
10+{-# LANGUAGE LambdaCase #-}
911
1012module Grenade.Layers.Dropout (
1113 Dropout (..)
1214 ) where
1315
1416import Control.Monad.Random hiding (fromList)
17+import Control.Monad.State
1518
1619import GHC.TypeLits
1720import Grenade.Core.Shape
1821import Grenade.Core.Network
22+import Grenade.Core.Phase
1923
2024import Numeric.LinearAlgebra.Static
2125
@@ -36,8 +40,12 @@ randomDropout rate = do
3640 xs = dvmap (\a -> if a <= rate then 0 else 1) wN
3741 return $ Dropout rate xs
3842
39−instance (MonadRandom m, KnownNat i) => Layer m (Dropout i) ('D1 i) ('D1 i) where
40− runForwards (Dropout _ drops) (S1D' x) = return . S1D' $ x * drops
41− runBackards _ (Dropout rate drops) _ (S1D' x) = do
42− newDropout <- randomDropout rate
43− return (newDropout, S1D' $ x * drops)
43+instance (MonadRandom m, MonadState Phase m, KnownNat i) => Layer m (Dropout i) ('D1 i) ('D1 i) where
44+ runForwards (Dropout rate drops) (S1D' x) = isTrainingPhase >>= \case
45+ True -> return . S1D' $ x * drops
46+ False -> return . S1D' $ dvmap (* (1 - rate)) x
47+ runBackards _ oldDropout@(Dropout rate drops) _ (S1D' x) = isTrainingPhase >>= \case
48+ True -> do
49+ newDropout <- randomDropout rate
50+ return (newDropout, S1D' $ x * drops)
51+ False -> return (oldDropout, S1D' $ dvmap (* (1 - rate)) x)