@@ -1,4 +1,4 @@
1−module Grenade.Layers.Convolution.Internal (
1+module Grenade.Layers.Internal.Convolution (
22 im2col
33-- , im2colUnsafe
44 , vid2col
@@ -72,7 +72,7 @@ fittingStart width kernel steps =
7272 | left + kernel == width
7373 = [left]
7474 | otherwise
75− = error "Kernel and step do not fit in matrix."
75+ = [] -- error "Kernel and step do not fit in matrix."
7676 in go 0
7777
7878col2imFit :: [(Int,Int)] -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
@@ -119,14 +119,9 @@ col2imFit starts krows kcols drows dcols m =
119119-- }
120120-- }
121121
122−
123−-- let starts = fittingStart (cols m) (krows * kcols) (krows * kcols)
124−-- r = rows m
125−-- mats = fmap (\s -> subMatrix (0,s) (r, krows * kcols) m) starts
126−-- in parMap rseq (col2imUnsafe krows kcols srows scols drows dcols) mats
127−
128122col2imUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
129123col2imUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows destinationCols columnMatrix = U.runSTMatrix $ do
124+
130125 let columnMatrixRows = rows columnMatrix
131126
132127 dataIm <- U.newMatrix 0 destinationRows destinationCols
@@ -134,15 +129,15 @@ col2imUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows d
134129 offsetR <- newSTRef 0
135130 offsetC <- newSTRef 0
136131
137− forM_ [0 .. columnMatrixRows - 1] $ \ir -> do
138− inputColumn <- newSTRef 0
132+ forM_ [0 .. columnMatrixRows - 1] $ \inputRow -> do
133+ inputColumnRef <- newSTRef 0
139134 forM_ [0 .. kernelRows -1] $ \kr ->
140135 forM_ [0 .. kernelColumns -1] $ \kc -> do
141− ic <- readSTRef inputColumn
142− offsetR' <- readSTRef offsetR
143− offsetC' <- readSTRef offsetC
144− U.modifyMatrix dataIm (kr + offsetR') (kc + offsetC') (+ atIndex columnMatrix (ir,ic))
145− modifySTRef inputColumn (+1)
136+ inputColumn <- readSTRef inputColumnRef
137+ offsetR' <- readSTRef offsetR
138+ offsetC' <- readSTRef offsetC
139+ U.modifyMatrix dataIm (kr + offsetR') (kc + offsetC') (+ U.atM' columnMatrix inputRow inputColumn)
140+ modifySTRef inputColumnRef (+1)
146141
147142 offsetC' <- readSTRef offsetC
148143 if offsetC' + kernelColumns < destinationCols
@@ -158,12 +153,12 @@ col2vidUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows
158153
159154 dataIms <- traverse (\_ -> U.newMatrix 0 destinationRows destinationCols) [0 .. filters-1]
160155
161− offsetR <- newSTRef 0
162− offsetC <- newSTRef 0
163156 offsetM <- newSTRef 0
164157
165158 forM_ dataIms $ \dataIm -> do
166− offsetM' <- readSTRef offsetM
159+ offsetR <- newSTRef 0
160+ offsetC <- newSTRef 0
161+ offsetM' <- readSTRef offsetM
167162 forM_ [0 .. columnMatrixRows - 1] $ \ir -> do
168163 inputColumn <- newSTRef 0
169164 forM_ [0 .. kernelRows -1] $ \kr ->
@@ -171,7 +166,7 @@ col2vidUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows
171166 ic <- readSTRef inputColumn
172167 offsetR' <- readSTRef offsetR
173168 offsetC' <- readSTRef offsetC
174− U.modifyMatrix dataIm (kr + offsetR') (kc + offsetC') (+ atIndex columnMatrix (ir, ic + offsetM'))
169+ U.modifyMatrix dataIm (kr + offsetR') (kc + offsetC') (+ U.atM' columnMatrix ir (ic + offsetM'))
175170 modifySTRef inputColumn (+1)
176171
177172 offsetC' <- readSTRef offsetC
@@ -179,60 +174,55 @@ col2vidUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows
179174 then modifySTRef offsetC (+ strideColumns)
180175 else writeSTRef offsetC 0 >> modifySTRef offsetR (+ strideRows)
181176
182− writeSTRef offsetR 0
183− writeSTRef offsetC 0
184177 modifySTRef offsetM (+ (kernelRows * kernelColumns))
185178
186− traverse U.freezeMatrix dataIms
179+ traverse U.unsafeFreezeMatrix dataIms
187180
188−vid2colUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> [Matrix Double] -> Matrix Double
189−vid2colUnsafe channels kernelRows kernelColumns striderows stridecols vidrows vidcols dataVid = U.runSTMatrix $ do
181+vid2colUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> [Matrix Double] -> Matrix Double
182+vid2colUnsafe kernelRows kernelColumns striderows stridecols vidrows vidcols dataVid = U.runSTMatrix $ do
190183 let starts = fittingStarts vidrows kernelRows striderows vidcols kernelColumns stridecols
191− matWidth = kernelRows * kernelColumns
192− destinationRows = 1 + (vidrows - kernelRows) `div` striderows
193− destinationCols = 1 + (vidcols - kernelColumns) `div` stridecols
194− destinationSize = destinationRows * destinationCols
184+ kernelSize = kernelRows * kernelColumns
185+ numberOfPatches = length starts
186+ channels = length dataVid
195187
196− dataCol <- U.newMatrix 0 destinationSize (channels * matWidth)
188+ dataCol <- U.newMatrix 0 numberOfPatches (channels * kernelSize)
197189
198190 offsetC <- newSTRef 0
199191
200192 forM_ dataVid $ \dataIm -> do
201− inputRow <- newSTRef 0
193+ inputRowRef <- newSTRef 0
202194 offsetC' <- readSTRef offsetC
203195 forM_ starts $ \(startRow, startCol) -> do
204− inputColumn <- newSTRef 0
205− inputRow' <- readSTRef inputRow
196+ inputColumnRef <- newSTRef 0
197+ inputRow <- readSTRef inputRowRef
206198 forM_ [0 .. kernelRows -1] $ \kr ->
207199 forM_ [0 .. kernelColumns -1] $ \kc -> do
208− inputColumn' <- readSTRef inputColumn
209− U.modifyMatrix dataCol inputRow' (inputColumn' + offsetC') (+ atIndex dataIm (kr + startRow, kc + startCol))
210− modifySTRef inputColumn (+1)
211− modifySTRef inputRow (+1)
200+ inputColumn <- readSTRef inputColumnRef
201+ U.modifyMatrix dataCol inputRow (inputColumn + offsetC') (+ U.atM' dataIm (kr + startRow) (kc + startCol))
202+ modifySTRef inputColumnRef (+1)
203+ modifySTRef inputRowRef (+1)
212204
213− modifySTRef offsetC (+ matWidth)
205+ modifySTRef offsetC (+ kernelSize)
214206
215207 return dataCol
216208
217−im2colUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
218−im2colUnsafe kernelRows kernelColumns striderows stridecols vidrows vidcols dataIm = U.runSTMatrix $ do
219− let starts = fittingStarts vidrows kernelRows striderows vidcols kernelColumns stridecols
220− matWidth = kernelRows * kernelColumns
221− destinationRows = 1 + (vidrows - kernelRows) `div` striderows
222− destinationCols = 1 + (vidcols - kernelColumns) `div` stridecols
223− destinationSize = destinationRows * destinationCols
209+im2colUnsafe :: Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
210+im2colUnsafe kernelRows kernelColumns striderows stridecols dataIm = U.runSTMatrix $ do
211+ let starts = fittingStarts (rows dataIm) kernelRows striderows (cols dataIm) kernelColumns stridecols
212+ kernelSize = kernelRows * kernelColumns
213+ numberOfPatches = length starts
224214
225− dataCol <- U.newMatrix 0 destinationSize matWidth
215+ dataCol <- U.newMatrix 0 numberOfPatches kernelSize
226216
227− inputRow <- newSTRef 0
217+ inputRowRef <- newSTRef 0
228218 forM_ starts $ \(startRow, startCol) -> do
229− inputColumn <- newSTRef 0
230− inputRow' <- readSTRef inputRow
219+ inputColumnRef <- newSTRef 0
220+ inputRow <- readSTRef inputRowRef
231221 forM_ [0 .. kernelRows -1] $ \kr ->
232222 forM_ [0 .. kernelColumns -1] $ \kc -> do
233− inputColumn' <- readSTRef inputColumn
234− U.modifyMatrix dataCol inputRow' inputColumn' (+ atIndex dataIm (kr + startRow, kc + startCol))
235− modifySTRef inputColumn (+1)
236− modifySTRef inputRow (+1)
223+ inputColumn <- readSTRef inputColumnRef
224+ U.modifyMatrix dataCol inputRow inputColumn (+ U.atM' dataIm (kr + startRow) (kc + startCol))
225+ modifySTRef inputColumnRef (+1)
226+ modifySTRef inputRowRef (+1)
237227
238228 return dataCol