@@ -1,4 +1,4 @@
1−module Grenade.Layers.Convolution.Internal (
1+module Grenade.Layers.Internal.Convolution (
3-- , im2colUnsafe
3-- , im2colUnsafe
@@ -72,7 +72,7 @@ fittingStart width kernel steps =
72 | left + kernel == width
72 | left + kernel == width
74 | otherwise
74 | otherwise
75− = error "Kernel and step do not fit in matrix."
75+ = [] -- error "Kernel and step do not fit in matrix."
78col2imFit :: [(Int,Int)] -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
78col2imFit :: [(Int,Int)] -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
@@ -119,14 +119,9 @@ col2imFit starts krows kcols drows dcols m =
123−-- let starts = fittingStart (cols m) (krows * kcols) (krows * kcols)
125−-- mats = fmap (\s -> subMatrix (0,s) (r, krows * kcols) m) starts
126−-- in parMap rseq (col2imUnsafe krows kcols srows scols drows dcols) mats
128col2imUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
122col2imUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
129col2imUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows destinationCols columnMatrix = U.runSTMatrix $ do
123col2imUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows destinationCols columnMatrix = U.runSTMatrix $ do
130 let columnMatrixRows = rows columnMatrix
125 let columnMatrixRows = rows columnMatrix
132 dataIm <- U.newMatrix 0 destinationRows destinationCols
127 dataIm <- U.newMatrix 0 destinationRows destinationCols
@@ -134,15 +129,15 @@ col2imUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows d
134 offsetR <- newSTRef 0
129 offsetR <- newSTRef 0
135 offsetC <- newSTRef 0
130 offsetC <- newSTRef 0
137− forM_ [0 .. columnMatrixRows - 1] $ \ir -> do
132+ forM_ [0 .. columnMatrixRows - 1] $ \inputRow -> do
138− inputColumn <- newSTRef 0
133+ inputColumnRef <- newSTRef 0
139 forM_ [0 .. kernelRows -1] $ \kr ->
134 forM_ [0 .. kernelRows -1] $ \kr ->
140 forM_ [0 .. kernelColumns -1] $ \kc -> do
135 forM_ [0 .. kernelColumns -1] $ \kc -> do
141− ic <- readSTRef inputColumn
136+ inputColumn <- readSTRef inputColumnRef
142− offsetR' <- readSTRef offsetR
137+ offsetR' <- readSTRef offsetR
143− offsetC' <- readSTRef offsetC
138+ offsetC' <- readSTRef offsetC
144− U.modifyMatrix dataIm (kr + offsetR') (kc + offsetC') (+ atIndex columnMatrix (ir,ic))
139+ U.modifyMatrix dataIm (kr + offsetR') (kc + offsetC') (+ U.atM' columnMatrix inputRow inputColumn)
145− modifySTRef inputColumn (+1)
140+ modifySTRef inputColumnRef (+1)
147 offsetC' <- readSTRef offsetC
142 offsetC' <- readSTRef offsetC
148 if offsetC' + kernelColumns < destinationCols
143 if offsetC' + kernelColumns < destinationCols
@@ -158,12 +153,12 @@ col2vidUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows
159 dataIms <- traverse (\_ -> U.newMatrix 0 destinationRows destinationCols) [0 .. filters-1]
154 dataIms <- traverse (\_ -> U.newMatrix 0 destinationRows destinationCols) [0 .. filters-1]
161− offsetR <- newSTRef 0
162− offsetC <- newSTRef 0
163 offsetM <- newSTRef 0
156 offsetM <- newSTRef 0
165 forM_ dataIms $ \dataIm -> do
158 forM_ dataIms $ \dataIm -> do
159+ offsetR <- newSTRef 0
160+ offsetC <- newSTRef 0
166− offsetM' <- readSTRef offsetM
161+ offsetM' <- readSTRef offsetM
167 forM_ [0 .. columnMatrixRows - 1] $ \ir -> do
162 forM_ [0 .. columnMatrixRows - 1] $ \ir -> do
168 inputColumn <- newSTRef 0
163 inputColumn <- newSTRef 0
169 forM_ [0 .. kernelRows -1] $ \kr ->
164 forM_ [0 .. kernelRows -1] $ \kr ->
@@ -171,7 +166,7 @@ col2vidUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows
171 ic <- readSTRef inputColumn
166 ic <- readSTRef inputColumn
172 offsetR' <- readSTRef offsetR
167 offsetR' <- readSTRef offsetR
173 offsetC' <- readSTRef offsetC
168 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'))
175 modifySTRef inputColumn (+1)
170 modifySTRef inputColumn (+1)
177 offsetC' <- readSTRef offsetC
172 offsetC' <- readSTRef offsetC
@@ -179,60 +174,55 @@ col2vidUnsafe kernelRows kernelColumns strideRows strideColumns destinationRows
179 then modifySTRef offsetC (+ strideColumns)
174 then modifySTRef offsetC (+ strideColumns)
180 else writeSTRef offsetC 0 >> modifySTRef offsetR (+ strideRows)
175 else writeSTRef offsetC 0 >> modifySTRef offsetR (+ strideRows)
182− writeSTRef offsetR 0
183− writeSTRef offsetC 0
184 modifySTRef offsetM (+ (kernelRows * kernelColumns))
177 modifySTRef offsetM (+ (kernelRows * kernelColumns))
186− traverse U.freezeMatrix dataIms
179+ traverse U.unsafeFreezeMatrix dataIms
188−vid2colUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Int -> [Matrix Double] -> Matrix Double
181+vid2colUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> [Matrix Double] -> Matrix Double
189−vid2colUnsafe channels kernelRows kernelColumns striderows stridecols vidrows vidcols dataVid = U.runSTMatrix $ do
182+vid2colUnsafe kernelRows kernelColumns striderows stridecols vidrows vidcols dataVid = U.runSTMatrix $ do
190 let starts = fittingStarts vidrows kernelRows striderows vidcols kernelColumns stridecols
183 let starts = fittingStarts vidrows kernelRows striderows vidcols kernelColumns stridecols
191− matWidth = kernelRows * kernelColumns
184+ kernelSize = kernelRows * kernelColumns
192− destinationRows = 1 + (vidrows - kernelRows) `div` striderows
185+ numberOfPatches = length starts
193− destinationCols = 1 + (vidcols - kernelColumns) `div` stridecols
186+ channels = length dataVid
194− destinationSize = destinationRows * destinationCols
196− dataCol <- U.newMatrix 0 destinationSize (channels * matWidth)
188+ dataCol <- U.newMatrix 0 numberOfPatches (channels * kernelSize)
198 offsetC <- newSTRef 0
190 offsetC <- newSTRef 0
200 forM_ dataVid $ \dataIm -> do
192 forM_ dataVid $ \dataIm -> do
201− inputRow <- newSTRef 0
193+ inputRowRef <- newSTRef 0
202 offsetC' <- readSTRef offsetC
194 offsetC' <- readSTRef offsetC
203 forM_ starts $ \(startRow, startCol) -> do
195 forM_ starts $ \(startRow, startCol) -> do
204− inputColumn <- newSTRef 0
196+ inputColumnRef <- newSTRef 0
205− inputRow' <- readSTRef inputRow
197+ inputRow <- readSTRef inputRowRef
206 forM_ [0 .. kernelRows -1] $ \kr ->
198 forM_ [0 .. kernelRows -1] $ \kr ->
207 forM_ [0 .. kernelColumns -1] $ \kc -> do
199 forM_ [0 .. kernelColumns -1] $ \kc -> do
208− inputColumn' <- readSTRef inputColumn
200+ inputColumn <- readSTRef inputColumnRef
209− U.modifyMatrix dataCol inputRow' (inputColumn' + offsetC') (+ atIndex dataIm (kr + startRow, kc + startCol))
201+ U.modifyMatrix dataCol inputRow (inputColumn + offsetC') (+ U.atM' dataIm (kr + startRow) (kc + startCol))
210− modifySTRef inputColumn (+1)
202+ modifySTRef inputColumnRef (+1)
211− modifySTRef inputRow (+1)
203+ modifySTRef inputRowRef (+1)
213− modifySTRef offsetC (+ matWidth)
205+ modifySTRef offsetC (+ kernelSize)
215 return dataCol
207 return dataCol
217−im2colUnsafe :: Int -> Int -> Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
209+im2colUnsafe :: Int -> Int -> Int -> Int -> Matrix Double -> Matrix Double
218−im2colUnsafe kernelRows kernelColumns striderows stridecols vidrows vidcols dataIm = U.runSTMatrix $ do
210+im2colUnsafe kernelRows kernelColumns striderows stridecols dataIm = U.runSTMatrix $ do
219− let starts = fittingStarts vidrows kernelRows striderows vidcols kernelColumns stridecols
211+ let starts = fittingStarts (rows dataIm) kernelRows striderows (cols dataIm) kernelColumns stridecols
220− matWidth = kernelRows * kernelColumns
212+ kernelSize = kernelRows * kernelColumns
221− destinationRows = 1 + (vidrows - kernelRows) `div` striderows
213+ numberOfPatches = length starts
222− destinationCols = 1 + (vidcols - kernelColumns) `div` stridecols
223− destinationSize = destinationRows * destinationCols
225− dataCol <- U.newMatrix 0 destinationSize matWidth
215+ dataCol <- U.newMatrix 0 numberOfPatches kernelSize
227− inputRow <- newSTRef 0
217+ inputRowRef <- newSTRef 0
228 forM_ starts $ \(startRow, startCol) -> do
218 forM_ starts $ \(startRow, startCol) -> do
229− inputColumn <- newSTRef 0
219+ inputColumnRef <- newSTRef 0
230− inputRow' <- readSTRef inputRow
220+ inputRow <- readSTRef inputRowRef
231 forM_ [0 .. kernelRows -1] $ \kr ->
221 forM_ [0 .. kernelRows -1] $ \kr ->
232 forM_ [0 .. kernelColumns -1] $ \kc -> do
222 forM_ [0 .. kernelColumns -1] $ \kc -> do
233− inputColumn' <- readSTRef inputColumn
223+ inputColumn <- readSTRef inputColumnRef
234− U.modifyMatrix dataCol inputRow' inputColumn' (+ atIndex dataIm (kr + startRow, kc + startCol))
224+ U.modifyMatrix dataCol inputRow inputColumn (+ U.atM' dataIm (kr + startRow) (kc + startCol))
235− modifySTRef inputColumn (+1)
225+ modifySTRef inputColumnRef (+1)
236− modifySTRef inputRow (+1)
226+ modifySTRef inputRowRef (+1)
238 return dataCol
228 return dataCol