require 'nn' -- a typical convolutional network, with locally-normalized hidden -- units, and L2-pooling -- Note: the architecture of this convnet is loosely based on Pierre Sermanet's -- work on this dataset (http://arxiv.org/abs/1204.3968). In particular -- the use of LP-pooling (with P=2) has a very positive impact on -- generalization. Normalization is not done exactly as proposed in -- the paper, and low-level (first layer) features are not fed to -- the classifier. model = nn.Sequential() -- stage 1 : filter bank -> squashing -> L2 pooling -> normalization model:add(nn.SpatialConvolutionMM(nfeats, nstates[1], filtsize, filtsize)) model:add(nn.Tanh()) model:add(nn.SpatialLPPooling(nstates[1],2,poolsize,poolsize,poolsize,poolsize)) model:add(nn.SpatialSubtractiveNormalization(nstates[1], normkernel)) -- stage 2 : filter bank -> squashing -> L2 pooling -> normalization model:add(nn.SpatialConvolutionMM(nstates[1], nstates[2], filtsize, filtsize)) model:add(nn.Tanh()) model:add(nn.SpatialLPPooling(nstates[2],2,poolsize,poolsize,poolsize,poolsize)) model:add(nn.SpatialSubtractiveNormalization(nstates[2], normkernel)) -- stage 3 : standard 2-layer neural network model:add(nn.Reshape(nstates[2]*filtsize*filtsize)) model:add(nn.Linear(nstates[2]*filtsize*filtsize, nstates[3])) model:add(nn.Tanh()) model:add(nn.Linear(nstates[3], noutputs))