The most common thing that trips people up on conv_forward and pool_forward is correctly handling the stride. Remember that the loops here are over the output space and we must touch every position in the output space and not skip any. The stride happens in the input space.