code: def get_receptive_field(layers, img_size):
      
      receptive_field = np.zeros((len(layers), 2))
      conv_mode = True
      first_conv_layer = True
      expon = np.ones((1, 2))
  
      for i, layer in enumerate(layers[1:]):
          j = i + 1
          if not conv_mode:
              receptive_field[j] = img_size
              continue
  
          if is_conv2d(layer):
              if not first_conv_layer:
                  last_field = receptive_field[i]
                  new_field = (last_field + expon *
                               (np.array(layer.filter_size) - 1))
                  receptive_field[j] = new_field
              else:
                  receptive_field[j] = layer.filter_size
                  first_conv_layer = False
          elif is_maxpool2d(layer):
              receptive_field[j] = receptive_field[i]
              expon *= np.array(layer.pool_size)
          else:
              conv_mode = False
              receptive_field[j] = img_size
  
      receptive_field[0] = img_size
      return receptive_field
docs: Get the real filter sizes of each layer involved in
      convoluation. See Xudong Cao:
      https://www.kaggle.com/c/datasciencebowl/forums/t/13166/happy-lantern-festival-report-and-code
      This does not yet take into consideration feature pooling,
      padding, striding and similar gimmicks.