code: def distort_fn(x, is_train=False):
      
      # print('begin',x.shape, np.min(x), np.max(x))
      x = tl.prepro.crop(x, 24, 24, is_random=is_train)
      # print('after crop',x.shape, np.min(x), np.max(x))
      if is_train:
          # x = tl.prepro.zoom(x, zoom_range=(0.9, 1.0), is_random=True)
          # print('after zoom', x.shape, np.min(x), np.max(x))
          x = tl.prepro.flip_axis(x, axis=1, is_random=True)
          # print('after flip',x.shape, np.min(x), np.max(x))
          x = tl.prepro.brightness(x, gamma=0.1, gain=1, is_random=True)
          # print('after brightness',x.shape, np.min(x), np.max(x))
          # tmp = np.max(x)
          # x += np.random.uniform(-20, 20)
          # x /= tmp
      # normalize the image
      x = (x - np.mean(x)) / max(np.std(x), 1e-5)  # avoid values divided by 0
      # print('after norm', x.shape, np.min(x), np.max(x), np.mean(x))
      return x
docs: The images are processed as follows:
      .. They are cropped to 24 x 24 pixels, centrally for evaluation or randomly for training.
      .. They are approximately whitened to make the model insensitive to dynamic range.
      For training, we additionally apply a series of random distortions to
      artificially increase the data set size:
      .. Randomly flip the image from left to right.
      .. Randomly distort the image brightness.