@@ -119,17 +119,16 @@ randomConvolution = do
119 mm = konst 0
119 mm = konst 0
120 return $ Convolution wN mm
120 return $ Convolution wN mm
122−instance ( Monad m ) => UpdateLayer m (Convolution channels filters kernelRows kernelCols strideRows strideCols) where
122+instance UpdateLayer (Convolution channels filters kernelRows kernelCols strideRows strideCols) where
123 type Gradient (Convolution channels filters kernelRows kernelCols strideRows strideCols) = (Convolution' channels filters kernelRows kernelCols strideRows strideCols)
123 type Gradient (Convolution channels filters kernelRows kernelCols strideRows strideCols) = (Convolution' channels filters kernelRows kernelCols strideRows strideCols)
124− runUpdate LearningParameters {..} (Convolution oldKernel oldMomentum) (Convolution' kernelGradient) = do
124+ runUpdate LearningParameters {..} (Convolution oldKernel oldMomentum) (Convolution' kernelGradient) =
125 let newMomentum = konst learningMomentum * oldMomentum - konst learningRate * kernelGradient
125 let newMomentum = konst learningMomentum * oldMomentum - konst learningRate * kernelGradient
126 regulariser = konst (learningRegulariser * learningRate) * oldKernel
126 regulariser = konst (learningRegulariser * learningRate) * oldKernel
127 newKernel = oldKernel + newMomentum - regulariser
127 newKernel = oldKernel + newMomentum - regulariser
128− return $ Convolution newKernel newMomentum
128+ in Convolution newKernel newMomentum
130-- | A two dimentional image may have a convolution filter applied to it
130-- | A two dimentional image may have a convolution filter applied to it
132− , KnownNat kernelRows
131+instance ( KnownNat kernelRows
133 , KnownNat kernelCols
132 , KnownNat kernelCols
134 , KnownNat filters
133 , KnownNat filters
135 , KnownNat strideRows
134 , KnownNat strideRows
@@ -140,7 +139,7 @@ instance ( Monad m
140 , KnownNat outputCols
139 , KnownNat outputCols
141 , ((outputRows - 1) * strideRows) ~ (inputRows - kernelRows)
140 , ((outputRows - 1) * strideRows) ~ (inputRows - kernelRows)
142 , ((outputCols - 1) * strideCols) ~ (inputCols - kernelCols)
141 , ((outputCols - 1) * strideCols) ~ (inputCols - kernelCols)
143− ) => Layer m (Convolution 1 filters kernelRows kernelCols strideRows strideCols) ('D2 inputRows inputCols) ('D3 outputRows outputCols filters) where
142+ ) => Layer (Convolution 1 filters kernelRows kernelCols strideRows strideCols) ('D2 inputRows inputCols) ('D3 outputRows outputCols filters) where
144 runForwards (Convolution kernel _) (S2D' input) =
143 runForwards (Convolution kernel _) (S2D' input) =
145 let ex = extract input
144 let ex = extract input
146 ek = extract kernel
145 ek = extract kernel
@@ -154,7 +153,7 @@ instance ( Monad m
154 mt = c LA.<> ek
153 mt = c LA.<> ek
155 r = col2vid 1 1 1 1 ox oy mt
154 r = col2vid 1 1 1 1 ox oy mt
156 rs = fmap (fromJust . create) r
155 rs = fmap (fromJust . create) r
157− in return . S3D' $ mkVector rs
156+ in S3D' $ mkVector rs
158 runBackards (Convolution kernel _) (S2D' input) (S3D' dEdy) =
157 runBackards (Convolution kernel _) (S2D' input) (S3D' dEdy) =
159 let ex = extract input
158 let ex = extract input
160 ix = fromIntegral $ natVal (Proxy :: Proxy inputRows)
159 ix = fromIntegral $ natVal (Proxy :: Proxy inputRows)
@@ -176,13 +175,12 @@ instance ( Monad m
176 dW = vs LA.<> tr ek
175 dW = vs LA.<> tr ek
178 xW = col2im kx ky sx sy ix iy dW
177 xW = col2im kx ky sx sy ix iy dW
179− in return (Convolution' kN, S2D' . fromJust . create $ xW)
178+ in (Convolution' kN, S2D' . fromJust . create $ xW)
182-- | A three dimensional image (or 2d with many channels) can have
181-- | A three dimensional image (or 2d with many channels) can have
183-- an appropriately sized convolution filter run across it.
182-- an appropriately sized convolution filter run across it.
185− , KnownNat kernelRows
183+instance ( KnownNat kernelRows
186 , KnownNat kernelCols
184 , KnownNat kernelCols
187 , KnownNat filters
185 , KnownNat filters
188 , KnownNat strideRows
186 , KnownNat strideRows
@@ -194,7 +192,7 @@ instance ( Monad m
194 , KnownNat channels
192 , KnownNat channels
195 , ((outputRows - 1) * strideRows) ~ (inputRows - kernelRows)
193 , ((outputRows - 1) * strideRows) ~ (inputRows - kernelRows)
196 , ((outputCols - 1) * strideCols) ~ (inputCols - kernelCols)
194 , ((outputCols - 1) * strideCols) ~ (inputCols - kernelCols)
197− ) => Layer m (Convolution channels filters kernelRows kernelCols strideRows strideCols) ('D3 inputRows inputCols channels) ('D3 outputRows outputCols filters) where
195+ ) => Layer (Convolution channels filters kernelRows kernelCols strideRows strideCols) ('D3 inputRows inputCols channels) ('D3 outputRows outputCols filters) where
198 runForwards (Convolution kernel _) (S3D' input) =
196 runForwards (Convolution kernel _) (S3D' input) =
199 let ex = vecToList $ fmap extract input
197 let ex = vecToList $ fmap extract input
200 ek = extract kernel
198 ek = extract kernel
@@ -210,7 +208,7 @@ instance ( Monad m
210 mt = c LA.<> ek
208 mt = c LA.<> ek
211 r = col2vid 1 1 1 1 ox oy mt
209 r = col2vid 1 1 1 1 ox oy mt
212 rs = fmap (fromJust . create) r
210 rs = fmap (fromJust . create) r
213− in return . S3D' $ mkVector rs
211+ in S3D' $ mkVector rs
214 runBackards (Convolution kernel _) (S3D' input) (S3D' dEdy) =
212 runBackards (Convolution kernel _) (S3D' input) (S3D' dEdy) =
215 let ex = vecToList $ fmap extract input
213 let ex = vecToList $ fmap extract input
216 ix = fromIntegral $ natVal (Proxy :: Proxy inputRows)
214 ix = fromIntegral $ natVal (Proxy :: Proxy inputRows)
@@ -233,7 +231,7 @@ instance ( Monad m
233 dW = vs LA.<> tr ek
231 dW = vs LA.<> tr ek
235 xW = col2vid kx ky sx sy ix iy dW
233 xW = col2vid kx ky sx sy ix iy dW
236− in return (Convolution' kN, S3D' . mkVector . fmap (fromJust . create) $ xW)
234+ in (Convolution' kN, S3D' . mkVector . fmap (fromJust . create) $ xW)
238im2col :: Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
236im2col :: Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
239im2col nrows ncols srows scols m =
237im2col nrows ncols srows scols m =