code: def BinaryConvolution(
      operand,
      filter_shape,
      num_filters=1,
      channels=1,
      init=C.glorot_uniform(),
      pad=False,
      strides=1,
      bias=True,
      init_bias=0,
      op_name="BinaryConvolution",
      name="",
  ):
      """arguments:
      operand: tensor to convolve
      filter_shape: tuple indicating filter size
      num_filters: number of filters to use
      channels: number of incoming channels
      init: type of initialization to use for weights
      """
      kernel_shape = (num_filters, channels) + filter_shape
      W = C.parameter(shape=kernel_shape, init=init, name="filter")
  
      binary_convolve_operand_p = C.placeholder(
          operand.shape, operand.dynamic_axes, name="operand"
      )
      binary_convolve = C.convolution(
          CustomMultibit(W, 1),
          CustomMultibit(binary_convolve_operand_p, 1),
          auto_padding=[False, pad, pad],
          strides=[strides],
      )
      r = C.as_block(
          binary_convolve,
          [(binary_convolve_operand_p, operand)],
          "binary_convolve",
      )
  
      bias_shape = (num_filters, 1, 1)
      b = C.parameter(shape=bias_shape, init=init_bias, name="bias")
      r = r + b
  
      # apply learnable param relu
      P = C.parameter(shape=r.shape, init=init, name="prelu")
      r = C.param_relu(P, r)
      return r
  
file_path: CNTK/Examples/Extensibility/BinaryConvolution/binary_convnet.py
imports: import os
  import sys
  import cntk
  from custom_convolution_ops import *
  from ConvNet_CIFAR10_DataAug import *
label_desc: Use image node_id 1 for calling a global function with example usage: BinaryConvolution(operand, filter_shape, num_filters, channels, init, pad, strides, bias, init_bias, op_name, name) and returns: r