grenade-0.1.0: Practical Deep Learning in Haskell

Copyright(c) Huw Campbell 2016-2017
LicenseBSD2
Stabilityexperimental
Safe HaskellNone
LanguageHaskell98

Grenade.Layers.Convolution

Description

This module provides the Convolution layer, which is critical in many computer vision tasks.

Synopsis

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.

Constructors

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 

Instances

Show (Convolution c f k k' s s') Source # 

Methods

showsPrec :: Int -> Convolution c f k k' s s' -> ShowS #

show :: Convolution c f k k' s s' -> String #

showList :: [Convolution c f k k' s s'] -> ShowS #

(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 # 

Methods

put :: Putter (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) #

get :: Get (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) #

(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 # 

Associated Types

type Gradient (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) :: * Source #

Methods

runUpdate :: LearningParameters -> Convolution channels filters kernelRows kernelColumns strideRows strideColumns -> Gradient (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) -> Convolution channels filters kernelRows kernelColumns strideRows strideColumns Source #

createRandom :: MonadRandom m => m (Convolution channels filters kernelRows kernelColumns strideRows strideColumns) Source #

runUpdates :: LearningParameters -> Convolution channels filters kernelRows kernelColumns strideRows strideColumns -> [Gradient (Convolution channels filters kernelRows kernelColumns strideRows strideColumns)] -> 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.

Associated Types

type Tape (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols :: Shape) (D2 outputRows outputCols :: Shape) :: * Source #

Methods

runForwards :: Convolution 1 1 kernelRows kernelCols strideRows strideCols -> S (D2 inputRows inputCols) -> (Tape (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D2 outputRows outputCols), S (D2 outputRows outputCols)) Source #

runBackwards :: Convolution 1 1 kernelRows kernelCols strideRows strideCols -> Tape (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D2 outputRows outputCols) -> S (D2 outputRows outputCols) -> (Gradient (Convolution 1 1 kernelRows kernelCols strideRows strideCols), S (D2 inputRows inputCols)) Source #

(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

Associated Types

type Tape (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols :: Shape) (D3 outputRows outputCols filters :: Shape) :: * Source #

Methods

runForwards :: Convolution 1 filters kernelRows kernelCols strideRows strideCols -> S (D2 inputRows inputCols) -> (Tape (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D3 outputRows outputCols filters), S (D3 outputRows outputCols filters)) Source #

runBackwards :: Convolution 1 filters kernelRows kernelCols strideRows strideCols -> Tape (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D3 outputRows outputCols filters) -> S (D3 outputRows outputCols filters) -> (Gradient (Convolution 1 filters kernelRows kernelCols strideRows strideCols), S (D2 inputRows inputCols)) Source #

(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

Associated Types

type Tape (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels :: Shape) (D2 outputRows outputCols :: Shape) :: * Source #

Methods

runForwards :: Convolution channels 1 kernelRows kernelCols strideRows strideCols -> S (D3 inputRows inputCols channels) -> (Tape (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D2 outputRows outputCols), S (D2 outputRows outputCols)) Source #

runBackwards :: Convolution channels 1 kernelRows kernelCols strideRows strideCols -> Tape (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D2 outputRows outputCols) -> S (D2 outputRows outputCols) -> (Gradient (Convolution channels 1 kernelRows kernelCols strideRows strideCols), S (D3 inputRows inputCols channels)) Source #

(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.

Associated Types

type Tape (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels :: Shape) (D3 outputRows outputCols filters :: Shape) :: * Source #

Methods

runForwards :: Convolution channels filters kernelRows kernelCols strideRows strideCols -> S (D3 inputRows inputCols channels) -> (Tape (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D3 outputRows outputCols filters), S (D3 outputRows outputCols filters)) Source #

runBackwards :: Convolution channels filters kernelRows kernelCols strideRows strideCols -> Tape (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D3 outputRows outputCols filters) -> S (D3 outputRows outputCols filters) -> (Gradient (Convolution channels filters kernelRows kernelCols strideRows strideCols), S (D3 inputRows inputCols channels)) Source #

type Gradient (Convolution channels filters kernelRows kernelCols strideRows strideCols) Source # 
type Gradient (Convolution channels filters kernelRows kernelCols strideRows strideCols) = Convolution' channels filters kernelRows kernelCols strideRows strideCols
type Tape (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D2 outputRows outputCols) Source # 
type Tape (Convolution 1 1 kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D2 outputRows outputCols) = S (D3 inputRows inputCols 1)
type Tape (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D3 outputRows outputCols filters) Source # 
type Tape (Convolution 1 filters kernelRows kernelCols strideRows strideCols) (D2 inputRows inputCols) (D3 outputRows outputCols filters) = S (D3 inputRows inputCols 1)
type Tape (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D2 outputRows outputCols) Source # 
type Tape (Convolution channels 1 kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D2 outputRows outputCols) = S (D3 inputRows inputCols channels)
type Tape (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D3 outputRows outputCols filters) Source # 
type Tape (Convolution channels filters kernelRows kernelCols strideRows strideCols) (D3 inputRows inputCols channels) (D3 outputRows outputCols filters) = S (D3 inputRows inputCols channels)

data Convolution' :: Nat -> Nat -> Nat -> Nat -> Nat -> Nat -> * where Source #

Constructors

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 #