@@ -25,14 +25,12 @@ import Grenade.Layers.Internal.Update
2525
2626-- | A basic fully connected (or inner product) neural network layer.
2727data FullyConnected i o = FullyConnected
28− !(R o) -- Bias neuron weights
29− !(R o) -- Bias neuron momentum
30− !(L o i) -- Activation weights
31− !(L o i) -- Momentum
28+ !(FullyConnected' i o) -- Weuron weights
29+ !(FullyConnected' i o) -- Neuron momentum
3230
3331data FullyConnected' i o = FullyConnected'
34− !(R o) -- Bias neuron gradient
35− !(L o i) -- Activation gradient
32+ !(R o) -- Bias
33+ !(L o i) -- Activations
3634
3735instance Show (FullyConnected i o) where
3836 show FullyConnected {} = "FullyConnected"
@@ -40,19 +38,20 @@ instance Show (FullyConnected i o) where
4038instance (KnownNat i, KnownNat o) => UpdateLayer (FullyConnected i o) where
4139 type Gradient (FullyConnected i o) = (FullyConnected' i o)
4240
43− runUpdate LearningParameters {..} (FullyConnected oldBias oldBiasMomentum oldActivations oldMomentum) (FullyConnected' biasGradient activationGradient) =
41+ runUpdate LearningParameters {..} (FullyConnected (FullyConnected' oldBias oldActivations) (FullyConnected' oldBiasMomentum oldMomentum)) (FullyConnected' biasGradient activationGradient) =
4442 let (newBias, newBiasMomentum) = decendVector learningRate learningMomentum learningRegulariser oldBias biasGradient oldBiasMomentum
4543 (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)
4745
4846 createRandom = randomFullyConnected
4947
5048instance (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)
5150 -- 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))
5352
5453 -- 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) =
5655 let wB' = dEdy
5756 mm' = dEdy `outer` x
5857 -- calcluate derivatives for next step
@@ -60,7 +59,7 @@ instance (KnownNat i, KnownNat o) => Layer (FullyConnected i o) ('D1 i) ('D1 o)
6059 in (FullyConnected' wB' mm', S1D dWs)
6160
6261instance (KnownNat i, KnownNat o) => Serialize (FullyConnected i o) where
63− put (FullyConnected b _ w _) = do
62+ put (FullyConnected (FullyConnected' b w) _) = do
6463 putListOf put . LA.toList . extract $ b
6564 putListOf put . LA.toList . LA.flatten . extract $ w
6665
@@ -70,7 +69,7 @@ instance (KnownNat i, KnownNat o) => Serialize (FullyConnected i o) where
7069 k <- maybe (fail "Vector of incorrect size") return . create . LA.reshape f . LA.fromList =<< getListOf get
7170 let bm = konst 0
7271 let mm = konst 0
73− return $ FullyConnected b bm k mm
72+ return $ FullyConnected (FullyConnected' b k) (FullyConnected' bm mm)
7473
7574randomFullyConnected :: (MonadRandom m, KnownNat i, KnownNat o)
7675 => m (FullyConnected i o)
@@ -81,4 +80,4 @@ randomFullyConnected = do
8180 wN = uniformSample s2 (-1) 1
8281 bm = konst 0
8382 mm = konst 0
84− return $ FullyConnected wB bm wN mm
83+ return $ FullyConnected (FullyConnected' wB wN) (FullyConnected' bm mm)