@@ -25,14 +25,12 @@ import Grenade.Layers.Internal.Update
26-- | A basic fully connected (or inner product) neural network layer.
26-- | A basic fully connected (or inner product) neural network layer.
27data FullyConnected i o = FullyConnected
27data FullyConnected i o = FullyConnected
28− !(R o) -- Bias neuron weights
28+ !(FullyConnected' i o) -- Weuron weights
29− !(R o) -- Bias neuron momentum
29+ !(FullyConnected' i o) -- Neuron momentum
30− !(L o i) -- Activation weights
33data FullyConnected' i o = FullyConnected'
31data FullyConnected' i o = FullyConnected'
34− !(R o) -- Bias neuron gradient
32+ !(R o) -- Bias
35− !(L o i) -- Activation gradient
33+ !(L o i) -- Activations
37instance Show (FullyConnected i o) where
35instance Show (FullyConnected i o) where
38 show FullyConnected {} = "FullyConnected"
36 show FullyConnected {} = "FullyConnected"
@@ -40,19 +38,20 @@ instance Show (FullyConnected i o) where
40instance (KnownNat i, KnownNat o) => UpdateLayer (FullyConnected i o) where
38instance (KnownNat i, KnownNat o) => UpdateLayer (FullyConnected i o) where
41 type Gradient (FullyConnected i o) = (FullyConnected' i o)
39 type Gradient (FullyConnected i o) = (FullyConnected' i o)
43− runUpdate LearningParameters {..} (FullyConnected oldBias oldBiasMomentum oldActivations oldMomentum) (FullyConnected' biasGradient activationGradient) =
41+ runUpdate LearningParameters {..} (FullyConnected (FullyConnected' oldBias oldActivations) (FullyConnected' oldBiasMomentum oldMomentum)) (FullyConnected' biasGradient activationGradient) =
44 let (newBias, newBiasMomentum) = decendVector learningRate learningMomentum learningRegulariser oldBias biasGradient oldBiasMomentum
42 let (newBias, newBiasMomentum) = decendVector learningRate learningMomentum learningRegulariser oldBias biasGradient oldBiasMomentum
45 (newActivations, newMomentum) = decendMatrix learningRate learningMomentum learningRegulariser oldActivations activationGradient oldMomentum
43 (newActivations, newMomentum) = decendMatrix learningRate learningMomentum learningRegulariser oldActivations activationGradient oldMomentum
46− in FullyConnected newBias newBiasMomentum newActivations newMomentum
44+ in FullyConnected (FullyConnected' newBias newActivations) (FullyConnected' newBiasMomentum newMomentum)
48 createRandom = randomFullyConnected
46 createRandom = randomFullyConnected
50instance (KnownNat i, KnownNat o) => Layer (FullyConnected i o) ('D1 i) ('D1 o) where
48instance (KnownNat i, KnownNat o) => Layer (FullyConnected i o) ('D1 i) ('D1 o) where
49+ type Tape (FullyConnected i o) ('D1 i) ('D1 o) = S ('D1 i)
51 -- Do a matrix vector multiplication and return the result.
50 -- Do a matrix vector multiplication and return the result.
52− runForwards (FullyConnected wB _ wN _) (S1D v) = S1D (wB + wN #> v)
51+ runForwards (FullyConnected (FullyConnected' wB wN) _) (S1D v) = (S1D v, S1D (wB + wN #> v))
54 -- Run a backpropogation step for a full connected layer.
53 -- Run a backpropogation step for a full connected layer.
55− runBackwards (FullyConnected _ _ wN _) (S1D x) (S1D dEdy) =
54+ runBackwards (FullyConnected (FullyConnected' _ wN) _) (S1D x) (S1D dEdy) =
56 let wB' = dEdy
55 let wB' = dEdy
57 mm' = dEdy `outer` x
56 mm' = dEdy `outer` x
58 -- calcluate derivatives for next step
57 -- calcluate derivatives for next step
@@ -60,7 +59,7 @@ instance (KnownNat i, KnownNat o) => Layer (FullyConnected i o) ('D1 i) ('D1 o)
60 in (FullyConnected' wB' mm', S1D dWs)
59 in (FullyConnected' wB' mm', S1D dWs)
62instance (KnownNat i, KnownNat o) => Serialize (FullyConnected i o) where
61instance (KnownNat i, KnownNat o) => Serialize (FullyConnected i o) where
63− put (FullyConnected b _ w _) = do
62+ put (FullyConnected (FullyConnected' b w) _) = do
64 putListOf put . LA.toList . extract $ b
63 putListOf put . LA.toList . extract $ b
65 putListOf put . LA.toList . LA.flatten . extract $ w
64 putListOf put . LA.toList . LA.flatten . extract $ w
@@ -70,7 +69,7 @@ instance (KnownNat i, KnownNat o) => Serialize (FullyConnected i o) where
70 k <- maybe (fail "Vector of incorrect size") return . create . LA.reshape f . LA.fromList =<< getListOf get
69 k <- maybe (fail "Vector of incorrect size") return . create . LA.reshape f . LA.fromList =<< getListOf get
71 let bm = konst 0
70 let bm = konst 0
72 let mm = konst 0
71 let mm = konst 0
73− return $ FullyConnected b bm k mm
72+ return $ FullyConnected (FullyConnected' b k) (FullyConnected' bm mm)
75randomFullyConnected :: (MonadRandom m, KnownNat i, KnownNat o)
74randomFullyConnected :: (MonadRandom m, KnownNat i, KnownNat o)
76 => m (FullyConnected i o)
75 => m (FullyConnected i o)
@@ -81,4 +80,4 @@ randomFullyConnected = do
81 wN = uniformSample s2 (-1) 1
80 wN = uniformSample s2 (-1) 1
82 bm = konst 0
81 bm = konst 0
83 mm = konst 0
82 mm = konst 0
84− return $ FullyConnected wB bm wN mm
83+ return $ FullyConnected (FullyConnected' wB wN) (FullyConnected' bm mm)