code: def conv(input, kernel, biases, k_h, k_w, c_o, s_h, s_w,  padding="VALID", group=1):
      
      c_i = input.get_shape()[-1]
      assert c_i%group==0
      assert c_o%group==0
      convolve = lambda i, k: tf.nn.conv2d(i, k, [1, s_h, s_w, 1], padding=padding)
      
      if group==1:
          conv = convolve(input, kernel)
      else:
          input_groups = tf.split(input, group, axis=3)
          kernel_groups = tf.split(kernel, group, axis=3)
          output_groups = [convolve(i, k) for i,k in zip(input_groups, kernel_groups)]
          conv = tf.concat(output_groups, axis=3)
      return  tf.reshape(tf.nn.bias_add(conv, biases), [-1]+conv.get_shape().as_list()[1:])
docs: Convolution layer helper function
      From https://github.com/ethereon/caffe-tensorflow