'Forward propagate the inputs of a convolutional network layer to
produce output.
Arguments:
layer: the conv layer as a parameter object
I (CPUTensor): inputs
F (CPUTensor): the weights (filters)
O (CPUTensor): outputs
Compounding Options:
X: tensor to use in bprop_relu or beta
can be same as O for beta accumulate (this is default when None)
should be same shape as O
bias: (K,1) tensor to use for adding bias to output
O += bias
bsum: (K,1) tensor to accumulate batch sum over (used in batchnorm or bprop_bias)
bsum = sum(O.reshape(K,-1), axis=1)
the sum operation is fully deterministic
alpha, beta:
O = alpha*O + beta*X
O = alpha*O + beta*O   (if X==O)
relu, slope: boolean flag to apply:
O = max(O, 0) + beta*min(O, 0)
can be combined with bias (where bias is added first)
brelu, slope: boolean flag to apply:
O *= (X > 0) + beta*(X < 0)
can be combined with bsum tensor to output bprop_bias'

def fprop_conv(self, layer, I, F, O, X=None, bias=None, bsum=None, alpha=1.0, beta=0.0, relu=False, brelu=False, slope=0.0, layer_op=None):

    layer.xprop_conv(I, F, O, X, bias, bsum, alpha, beta, relu, brelu, slope, layer_op=layer)
