@@ -5,17 +5,21 @@
5{-# LANGUAGE TypeOperators #-}
5{-# LANGUAGE TypeOperators #-}
6{-# LANGUAGE TypeFamilies #-}
6{-# LANGUAGE TypeFamilies #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
7{-# LANGUAGE MultiParamTypeClasses #-}
8+{-# LANGUAGE FlexibleContexts #-}
8{-# LANGUAGE FlexibleInstances #-}
9{-# LANGUAGE FlexibleInstances #-}
10+{-# LANGUAGE LambdaCase #-}
10module Grenade.Layers.Dropout (
12module Grenade.Layers.Dropout (
11 Dropout (..)
13 Dropout (..)
14import Control.Monad.Random hiding (fromList)
16import Control.Monad.Random hiding (fromList)
17+import Control.Monad.State
16import GHC.TypeLits
19import GHC.TypeLits
17import Grenade.Core.Shape
20import Grenade.Core.Shape
18import Grenade.Core.Network
21import Grenade.Core.Network
22+import Grenade.Core.Phase
20import Numeric.LinearAlgebra.Static
24import Numeric.LinearAlgebra.Static
@@ -36,8 +40,12 @@ randomDropout rate = do
36 xs = dvmap (\a -> if a <= rate then 0 else 1) wN
40 xs = dvmap (\a -> if a <= rate then 0 else 1) wN
37 return $ Dropout rate xs
41 return $ Dropout rate xs
39−instance (MonadRandom m, KnownNat i) => Layer m (Dropout i) ('D1 i) ('D1 i) where
43+instance (MonadRandom m, MonadState Phase m, KnownNat i) => Layer m (Dropout i) ('D1 i) ('D1 i) where
40− runForwards (Dropout _ drops) (S1D' x) = return . S1D' $ x * drops
44+ runForwards (Dropout rate drops) (S1D' x) = isTrainingPhase >>= \case
45+ True -> return . S1D' $ x * drops
46+ False -> return . S1D' $ dvmap (* (1 - rate)) x
41− runBackards _ (Dropout rate drops) _ (S1D' x) = do
47+ runBackards _ oldDropout@(Dropout rate drops) _ (S1D' x) = isTrainingPhase >>= \case
42− newDropout <- randomDropout rate
49+ newDropout <- randomDropout rate
43− return (newDropout, S1D' $ x * drops)
50+ return (newDropout, S1D' $ x * drops)
51+ False -> return (oldDropout, S1D' $ dvmap (* (1 - rate)) x)