code: def visual(title, X, activation):
      '''create a grid of images and save it as a final image
      title : grid image name
      X : array of images
      '''
      assert len(X.shape) == 4
  
      X = X.transpose((0, 2, 3, 1))
      if activation == 'sigmoid':
          X = np.clip((X)*(255.0), 0, 255).astype(np.uint8)
      elif activation == 'tanh':
          X = np.clip((X+1.0)*(255.0/2.0), 0, 255).astype(np.uint8)
      n = np.ceil(np.sqrt(X.shape[0]))
      buff = np.zeros((int(n*X.shape[1]), int(n*X.shape[2]), int(X.shape[3])), dtype=np.uint8)
      for i, img in enumerate(X):
          fill_buf(buff, i, img, X.shape[1:3])
      cv2.imwrite('%s.jpg' % (title), bufff visual(title, X, activation):
      '''create a grid of images and save it as a final image
      title : grid image name
      X : array of images
      '''
      assert len(X.shape) == 4
  
      X = X.transpose((0, 2, 3, 1))
      if activation == 'sigmoid':
          X = np.clip((X)*(255.0), 0, 255).astype(np.uint8)
      elif activation == 'tanh':
          X = np.clip((X+1.0)*(255.0/2.0), 0, 255).astype(np.uint8)
      n = np.ceil(np.sqrt(X.shape[0]))
      buff = np.zeros((int(n*X.shape[1]), int(n*X.shape[2]), int(X.shape[3])), dtype=np.uint8)
      for i, img in enumerate(X):
          fill_buf(buff, i, img, X.shape[1:3])
      cv2.imwrite('%s.jpg' % (title), buff)
docs: create a grid of images and save it as a final image
      title : grid image name
      X : array of images