A hardware neural network engine configured to receive at least one MxN window of floating point number values corresponding to a pixel of an input map and a corresponding at least one set of MxN floating point number kernel values for a neural network layer of a neural network, the neural network engine comprising: a plurality of at least MxN floating point multipliers, each floating point multiplier having a first operand input configured to be connected to an input map value (in00...in22) and a second operand input configured to be connected to a corresponding kernel value (w00...w22); pairs of multipliers within said MxN floating point multipliers providing respective floating point number outputs to respective input nodes of a tree of nodes, one output node of said tree providing a first input of an output module, and an output of one of said MxN floating point multipliers providing a second input of said output module; wherein when said engine is configured to process a convolution layer of the neural network, each of said kernel values comprises a trained value (w00...w22) for said layer, said nodes of the tree are configured to sum their inputs and said output module is configured to sum its first and second inputs, to apply an activation function to said sum and to provide an output of said activation function as an output of said output module; characterized in that each node of said tree is configured to provide a floating point number output corresponding to either: a larger of the inputs of said node; or a sum of said inputs, and wherein when said engine is configured to process an average pooling layer of the neural network, each of said kernel values comprises a value corresponding to 1/(MxN), said nodes of the tree are configured to sum their inputs and said output module is configured to sum its first and second inputs and to provide said sum as said output of said output module; and wherein when said engine is configured to process a max pooling layer of the neural network, each of said kernel values comprises a value equal to 1, said nodes of the tree are configured to output a larger of their inputs and said output module is configured to output a larger of its first and second inputs as said output of said output module. a plurality of at least MxN floating point multipliers, each floating point multiplier having a first operand input configured to be connected to an input map value (in00...in22) and a second operand input configured to be connected to a corresponding kernel value (w00...w22); pairs of multipliers within said MxN floating point multipliers providing respective floating point number outputs to respective input nodes of a tree of nodes, one output node of said tree providing a first input of an output module, and an output of one of said MxN floating point multipliers providing a second input of said output module; wherein when said engine is configured to process a convolution layer of the neural network, each of said kernel values comprises a trained value (w00...w22) for said layer, said nodes of the tree are configured to sum their inputs and said output module is configured to sum its first and second inputs, to apply an activation function to said sum and to provide an output of said activation function as an output of said output module; characterized in that each node of said tree is configured to provide a floating point number output corresponding to either: a larger of the inputs of said node; or a sum of said inputs, and wherein when said engine is configured to process an average pooling layer of the neural network, each of said kernel values comprises a value corresponding to 1/(MxN), said nodes of the tree are configured to sum their inputs and said output module is configured to sum its first and second inputs and to provide said sum as said output of said output module; and wherein when said engine is configured to process a max pooling layer of the neural network, each of said kernel values comprises a value equal to 1, said nodes of the tree are configured to output a larger of their inputs and said output module is configured to output a larger of its first and second inputs as said output of said output module.