class_docstr: Implements an abstract preprocessor object which performs casting, resizing, batching and normalization.
  
  Args:
  ----
      output_size: expected size of each page in format (H, W)
      batch_size: the size of page batches
      mean: mean value of the training distribution by channel
      std: standard deviation of the training distribution by channel
class_docstr_tok: ["Implements","an","abstract","preprocessor","object","which","performs","casting",",","resizing",",","batching","and","normalization",".","Args",":","--","--","output_size",":","expected","size","of","each","page","in","format","(","H",",","W",")","batch_size",":","the","size","of","page","batches","mean",":","mean","value","of","the","training","distribution","by","channel","std",":","standard","deviation","of","the","training","distribution","by","channel"]
code: def sample_transforms(
      self, x: Union[np.ndarray, tf.Tensor]
  ) -> tf.Tensor:
      if x.ndim != 3:
          raise AssertionError("expected list of 3D Tensors")
      if isinstance(x, np.ndarray):
          if x.dtype not in (np.uint8, np.float32):
              raise TypeError("unsupported data type for numpy.ndarray")
          x = tf.convert_to_tensor(x)
      elif x.dtype not in (tf.uint8, tf.float16, tf.float32):
          raise TypeError("unsupported data type for torch.Tensor")
      # Data type & 255 division
      if x.dtype == tf.uint8:
          x = tf.image.convert_image_dtype(x, dtype=tf.float32)
      # Resizing
      x = self.resize(x)
  
      return x
  
file_path: doctr/doctr/models/preprocessor/tensorflow.py
imports: import math
  from typing import Any, List, Tuple, Union
  import numpy
  import tensorflow
  from doctr.transforms import Normalize, Resize
  from doctr.utils.multithreading import multithread_exec
  from doctr.utils.repr import NestedObject
label_desc: Use image node_id 3 for calling the PreProcessor obj's underlying member method code with example usage: obj.sample_transforms(x) and returns: x