Copyright | (c) Huw Campbell 2016-2017 |
---|---|
License | BSD2 |
Stability | experimental |
Safe Haskell | None |
Language | Haskell98 |
This module provides the Convolution layer, which is critical in many computer vision tasks.
- data Convolution :: Nat -> Nat -> Nat -> Nat -> Nat -> Nat -> * where
- Convolution :: (KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat kernelFlattened, kernelFlattened ~ ((kernelRows * kernelColumns) * channels)) => !(L kernelFlattened filters) -> !(L kernelFlattened filters) -> Convolution channels filters kernelRows kernelColumns strideRows strideColumns
- data Convolution' :: Nat -> Nat -> Nat -> Nat -> Nat -> Nat -> * where
- Convolution' :: (KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat kernelFlattened, kernelFlattened ~ ((kernelRows * kernelColumns) * channels)) => !(L kernelFlattened filters) -> Convolution' channels filters kernelRows kernelColumns strideRows strideColumns
- randomConvolution :: (MonadRandom m, KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat kernelFlattened, kernelFlattened ~ ((kernelRows * kernelColumns) * channels)) => m (Convolution channels filters kernelRows kernelColumns strideRows strideColumns)
Documentation
data Convolution :: Nat -> Nat -> Nat -> Nat -> Nat -> Nat -> * where Source #
A convolution layer for a neural network. This uses the im2col convolution trick popularised by Caffe, which essentially turns the many, many, many, many loop convolution into a single matrix multiplication.
The convolution layer takes all of the kernels for the convolution, which are flattened and then put into columns in the matrix.
The kernel size dictates which input and output sizes will "fit". Fitting the equation: `out = (in - kernel) / stride + 1` for both dimensions.
One probably shouldn't build their own layer, but rather use the randomConvolution function.
Convolution :: (KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat kernelFlattened, kernelFlattened ~ ((kernelRows * kernelColumns) * channels)) => !(L kernelFlattened filters) -> !(L kernelFlattened filters) -> Convolution channels filters kernelRows kernelColumns strideRows strideColumns |
Show (Convolution c f k k' s s') Source # | |
(KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat (* (* kernelRows kernelColumns) channels)) => Serialize (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) Source # | |
(KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat (* (* kernelRows kernelColumns) channels)) => UpdateLayer (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) Source # | |
(KnownNat kernelRows, KnownNat kernelCols, KnownNat strideRows, KnownNat strideCols, KnownNat inputRows, KnownNat inputCols, KnownNat outputRows, KnownNat outputCols, (~) Nat (* ((-) outputRows 1) strideRows) ((-) inputRows kernelRows), (~) Nat (* ((-) outputCols 1) strideCols) ((-) inputCols kernelCols), KnownNat (* (* kernelRows kernelCols) 1), KnownNat (* outputRows 1)) => Layer (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D2 outputRows outputCols) Source # | A two dimensional image may have a convolution filter applied to it producing a two dimensional image if both channels and filters is 1. |
(KnownNat kernelRows, KnownNat kernelCols, KnownNat filters, KnownNat strideRows, KnownNat strideCols, KnownNat inputRows, KnownNat inputCols, KnownNat outputRows, KnownNat outputCols, (~) Nat (* ((-) outputRows 1) strideRows) ((-) inputRows kernelRows), (~) Nat (* ((-) outputCols 1) strideCols) ((-) inputCols kernelCols), KnownNat (* (* kernelRows kernelCols) 1), KnownNat (* outputRows filters)) => Layer (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D3 outputRows outputCols filters) Source # | A two dimentional image may have a convolution filter applied to it |
(KnownNat kernelRows, KnownNat kernelCols, KnownNat strideRows, KnownNat strideCols, KnownNat inputRows, KnownNat inputCols, KnownNat outputRows, KnownNat outputCols, KnownNat channels, (~) Nat (* ((-) outputRows 1) strideRows) ((-) inputRows kernelRows), (~) Nat (* ((-) outputCols 1) strideCols) ((-) inputCols kernelCols), KnownNat (* (* kernelRows kernelCols) channels), KnownNat (* outputRows 1)) => Layer (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D2 outputRows outputCols) Source # | A three dimensional image can produce a 2D image from a convolution with 1 filter |
(KnownNat kernelRows, KnownNat kernelCols, KnownNat filters, KnownNat strideRows, KnownNat strideCols, KnownNat inputRows, KnownNat inputCols, KnownNat outputRows, KnownNat outputCols, KnownNat channels, (~) Nat (* ((-) outputRows 1) strideRows) ((-) inputRows kernelRows), (~) Nat (* ((-) outputCols 1) strideCols) ((-) inputCols kernelCols), KnownNat (* (* kernelRows kernelCols) channels), KnownNat (* outputRows filters)) => Layer (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D3 outputRows outputCols filters) Source # | A three dimensional image (or 2d with many channels) can have an appropriately sized convolution filter run across it. |
type Gradient (Convolution channels filters kernelRows kernelCols strideRows strideCols) Source # | |
type Tape (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D2 outputRows outputCols) Source # | |
type Tape (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D3 outputRows outputCols filters) Source # | |
type Tape (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D2 outputRows outputCols) Source # | |
type Tape (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D3 outputRows outputCols filters) Source # | |
data Convolution' :: Nat -> Nat -> Nat -> Nat -> Nat -> Nat -> * where Source #
Convolution' :: (KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat kernelFlattened, kernelFlattened ~ ((kernelRows * kernelColumns) * channels)) => !(L kernelFlattened filters) -> Convolution' channels filters kernelRows kernelColumns strideRows strideColumns |
randomConvolution :: (MonadRandom m, KnownNat channels, KnownNat filters, KnownNat kernelRows, KnownNat kernelColumns, KnownNat strideRows, KnownNat strideColumns, KnownNat kernelFlattened, kernelFlattened ~ ((kernelRows * kernelColumns) * channels)) => m (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) Source #