Characterising Across-Stack Optimisations for Deep Convolutional Neural Networks