'update_conv:
Required Inputs:
layer: ConvLayer object created with conv_layer()
I: input tensor (actiavtions)
E: error tensor (output gradient from previous layer)
grad_F: output tensor (gradient with respect to weights)
Compounding Options:
alpha, beta:
O = alpha*O + beta*O
repeat: used in benchmarking'

def update_conv(self, layer, I, E, grad_F, alpha=1.0, beta=0.0, repeat=1, layer_op=None):

    assert (layer.sizeI == I.size)
    assert (layer.sizeO == E.size)
    assert (layer.sizeF == grad_F.size)
    if ((layer.NCK[0] < 4) and (layer.TRS == (1, 1, 1))):
        Ir = I.reshape((layer.NCK[1], (-1)))
        Er = E.reshape((layer.NCK[2], (-1)))
        Gr = grad_F.reshape((layer.NCK[1], (-1)))
        return self.compound_dot(A=Ir, B=Er.T, C=Gr, alpha=alpha, beta=beta, repeat=repeat)
    else:
        layer.updat_kernels.bind_params(I, E, grad_F, alpha, beta)
        return self._execute_conv('updat', layer, layer.updat_kernels, repeat)
