prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  Port `transforms.LinearTransformation` to `prototype.transforms`
  cc @vfdev-5 @datumbox @bjuncek
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `torchvision/prototype/transforms/_misc.py`
  Content:
  ```
  1 import functools
  2 from typing import Any, Callable, Dict, List, Sequence, Type, Union
  3 
  4 import torch
  5 from torchvision.prototype.transforms import functional as F, Transform
  6 from torchvision.transforms.transforms import _setup_size
  7 
  8 
  9 class Identity(Transform):
  10     def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
  11         return inpt
  12 
  13 
  14 class Lambda(Transform):
  15     def __init__(self, fn: Callable[[Any], Any], *types: Type):
  16         super().__init__()
  17         self.fn = fn
  18         self.types = types
  19 
  20     def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
  21         if type(inpt) in self.types:
  22             return self.fn(inpt)
  23         else:
  24             return inpt
  25 
  26     def extra_repr(self) -> str:
  27         extras = []
  28         name = getattr(self.fn, "__name__", None)
  29         if name:
  30             extras.append(name)
  31         extras.append(f"types={[type.__name__ for type in self.types]}")
  32         return ", ".join(extras)
  33 
  34 
  35 class Normalize(Transform):
  36     def __init__(self, mean: List[float], std: List[float]):
  37         super().__init__()
  38         self.mean = mean
  39         self.std = std
  40 
  41     def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
  42         return F.normalize(inpt, mean=self.mean, std=self.std)
  43 
  44 
  45 class GaussianBlur(Transform):
  46     def __init__(
  47         self, kernel_size: Union[int, Sequence[int]], sigma: Union[float, Sequence[float]] = (0.1, 2.0)
  48     ) -> None:
  49         super().__init__()
  50         self.kernel_size = _setup_size(kernel_size, "Kernel size should be a tuple/list of two integers")
  51         for ks in self.kernel_size:
  52             if ks <= 0 or ks % 2 == 0:
  53                 raise ValueError("Kernel size value should be an odd and positive number.")
  54 
  55         if isinstance(sigma, float):
  56             if sigma <= 0:
  57                 raise ValueError("If sigma is a single number, it must be positive.")
  58             sigma = (sigma, sigma)
  59         elif isinstance(sigma, Sequence) and len(sigma) == 2:
  60             if not 0.0 < sigma[0] <= sigma[1]:
  61                 raise ValueError("sigma values should be positive and of the form (min, max).")
  62         else:
  63             raise TypeError("sigma should be a single float or a list/tuple with length 2 floats.")
  64 
  65         self.sigma = sigma
  66 
  67     def _get_params(self, sample: Any) -> Dict[str, Any]:
  68         sigma = torch.empty(1).uniform_(self.sigma[0], self.sigma[1]).item()
  69         return dict(sigma=[sigma, sigma])
  70 
  71     def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
  72         return F.gaussian_blur(inpt, **params)
  73 
  74 
  75 class ToDtype(Lambda):
  76     def __init__(self, dtype: torch.dtype, *types: Type) -> None:
  77         self.dtype = dtype
  78         super().__init__(functools.partial(torch.Tensor.to, dtype=dtype), *types)
  79 
  80     def extra_repr(self) -> str:
  81         return ", ".join([f"dtype={self.dtype}", f"types={[type.__name__ for type in self.types]}"])
  82
  ```
  
  Path: `torchvision/prototype/transforms/__init__.py`
  Content:
  ```
  1 from . import functional  # usort: skip
  2 
  3 from ._transform import Transform  # usort: skip
  4 
  5 from ._augment import RandomCutmix, RandomErasing, RandomMixup
  6 from ._auto_augment import AugMix, AutoAugment, AutoAugmentPolicy, RandAugment, TrivialAugmentWide
  7 from ._color import (
  8     ColorJitter,
  9     RandomAdjustSharpness,
  10     RandomAutocontrast,
  11     RandomEqualize,
  12     RandomInvert,
  13     RandomPhotometricDistort,
  14     RandomPosterize,
  15     RandomSolarize,
  16 )
  17 from ._container import Compose, RandomApply, RandomChoice, RandomOrder
  18 from ._geometry import (
  19     BatchMultiCrop,
  20     CenterCrop,
  21     ElasticTransform,
  22     FiveCrop,
  23     FixedSizeCrop,
  24     Pad,
  25     RandomAffine,
  26     RandomCrop,
  27     RandomHorizontalFlip,
  28     RandomIoUCrop,
  29     RandomPerspective,
  30     RandomResizedCrop,
  31     RandomRotation,
  32     RandomShortestSize,
  33     RandomVerticalFlip,
  34     RandomZoomOut,
  35     Resize,
  36     ScaleJitter,
  37     TenCrop,
  38 )
  39 from ._meta import ConvertBoundingBoxFormat, ConvertColorSpace, ConvertImageDtype
  40 from ._misc import GaussianBlur, Identity, Lambda, Normalize, ToDtype
  41 from ._type_conversion import DecodeImage, LabelToOneHot, ToImagePIL, ToImageTensor
  42 
  43 from ._deprecated import Grayscale, RandomGrayscale, ToTensor, ToPILImage, PILToTensor  # usort: skip
  44
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/torchvision/prototype/transforms/__init__.py b/torchvision/prototype/transforms/__init__.py
  --- a/torchvision/prototype/transforms/__init__.py
  +++ b/torchvision/prototype/transforms/__init__.py
  @@ -37,7 +37,7 @@
       TenCrop,
   )
   from ._meta import ConvertBoundingBoxFormat, ConvertColorSpace, ConvertImageDtype
  -from ._misc import GaussianBlur, Identity, Lambda, Normalize, ToDtype
  +from ._misc import GaussianBlur, Identity, Lambda, LinearTransformation, Normalize, ToDtype
   from ._type_conversion import DecodeImage, LabelToOneHot, ToImagePIL, ToImageTensor
   
   from ._deprecated import Grayscale, RandomGrayscale, ToTensor, ToPILImage, PILToTensor  # usort: skip
  diff --git a/torchvision/prototype/transforms/_misc.py b/torchvision/prototype/transforms/_misc.py
  --- a/torchvision/prototype/transforms/_misc.py
  +++ b/torchvision/prototype/transforms/_misc.py
  @@ -1,7 +1,10 @@
   import functools
   from typing import Any, Callable, Dict, List, Sequence, Type, Union
   
  +import PIL.Image
  +
   import torch
  +from torchvision.prototype import features
   from torchvision.prototype.transforms import functional as F, Transform
   from torchvision.transforms.transforms import _setup_size
   
  @@ -32,6 +35,59 @@
           return ", ".join(extras)
   
   
  +class LinearTransformation(Transform):
  +    def __init__(self, transformation_matrix: torch.Tensor, mean_vector: torch.Tensor):
  +        super().__init__()
  +        if transformation_matrix.size(0) != transformation_matrix.size(1):
  +            raise ValueError(
  +                "transformation_matrix should be square. Got "
  +                f"{tuple(transformation_matrix.size())} rectangular matrix."
  +            )
  +
  +        if mean_vector.size(0) != transformation_matrix.size(0):
  +            raise ValueError(
  +                f"mean_vector should have the same length {mean_vector.size(0)}"
  +                f" as any one of the dimensions of the transformation_matrix [{tuple(transformation_matrix.size())}]"
  +            )
  +
  +        if transformation_matrix.device != mean_vector.device:
  +            raise ValueError(
  +                f"Input tensors should be on the same device. Got {transformation_matrix.device} and {mean_vector.device}"
  +            )
  +
  +        self.transformation_matrix = transformation_matrix
  +        self.mean_vector = mean_vector
  +
  +    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:
  +
  +        if isinstance(inpt, features._Feature) and not isinstance(inpt, features.Image):
  +            return inpt
  +        elif isinstance(inpt, PIL.Image.Image):
  +            raise TypeError("Unsupported input type")
  +
  +        # Image instance after linear transformation is not Image anymore due to unknown data range
  +        # Thus we will return Tensor for input Image
  +
  +        shape = inpt.shape
  +        n = shape[-3] * shape[-2] * shape[-1]
  +        if n != self.transformation_matrix.shape[0]:
  +            raise ValueError(
  +                "Input tensor and transformation matrix have incompatible shape."
  +                + f"[{shape[-3]} x {shape[-2]} x {shape[-1]}] != "
  +                + f"{self.transformation_matrix.shape[0]}"
  +            )
  +
  +        if inpt.device.type != self.mean_vector.device.type:
  +            raise ValueError(
  +                "Input tensor should be on the same device as transformation matrix and mean vector. "
  +                f"Got {inpt.device} vs {self.mean_vector.device}"
  +            )
  +
  +        flat_tensor = inpt.view(-1, n) - self.mean_vector
  +        transformed_tensor = torch.mm(flat_tensor, self.transformation_matrix)
  +        return transformed_tensor.view(shape)
  +
  +
   class Normalize(Transform):
       def __init__(self, mean: List[float], std: List[float]):
           super().__init__()
  
verification_info: {"golden_diff": "diff --git a/torchvision/prototype/transforms/__init__.py b/torchvision/prototype/transforms/__init__.py\n--- a/torchvision/prototype/transforms/__init__.py\n+++ b/torchvision/prototype/transforms/__init__.py\n@@ -37,7 +37,7 @@\n     TenCrop,\n )\n from ._meta import ConvertBoundingBoxFormat, ConvertColorSpace, ConvertImageDtype\n-from ._misc import GaussianBlur, Identity, Lambda, Normalize, ToDtype\n+from ._misc import GaussianBlur, Identity, Lambda, LinearTransformation, Normalize, ToDtype\n from ._type_conversion import DecodeImage, LabelToOneHot, ToImagePIL, ToImageTensor\n \n from ._deprecated import Grayscale, RandomGrayscale, ToTensor, ToPILImage, PILToTensor  # usort: skip\ndiff --git a/torchvision/prototype/transforms/_misc.py b/torchvision/prototype/transforms/_misc.py\n--- a/torchvision/prototype/transforms/_misc.py\n+++ b/torchvision/prototype/transforms/_misc.py\n@@ -1,7 +1,10 @@\n import functools\n from typing import Any, Callable, Dict, List, Sequence, Type, Union\n \n+import PIL.Image\n+\n import torch\n+from torchvision.prototype import features\n from torchvision.prototype.transforms import functional as F, Transform\n from torchvision.transforms.transforms import _setup_size\n \n@@ -32,6 +35,59 @@\n         return \", \".join(extras)\n \n \n+class LinearTransformation(Transform):\n+    def __init__(self, transformation_matrix: torch.Tensor, mean_vector: torch.Tensor):\n+        super().__init__()\n+        if transformation_matrix.size(0) != transformation_matrix.size(1):\n+            raise ValueError(\n+                \"transformation_matrix should be square. Got \"\n+                f\"{tuple(transformation_matrix.size())} rectangular matrix.\"\n+            )\n+\n+        if mean_vector.size(0) != transformation_matrix.size(0):\n+            raise ValueError(\n+                f\"mean_vector should have the same length {mean_vector.size(0)}\"\n+                f\" as any one of the dimensions of the transformation_matrix [{tuple(transformation_matrix.size())}]\"\n+            )\n+\n+        if transformation_matrix.device != mean_vector.device:\n+            raise ValueError(\n+                f\"Input tensors should be on the same device. Got {transformation_matrix.device} and {mean_vector.device}\"\n+            )\n+\n+        self.transformation_matrix = transformation_matrix\n+        self.mean_vector = mean_vector\n+\n+    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n+\n+        if isinstance(inpt, features._Feature) and not isinstance(inpt, features.Image):\n+            return inpt\n+        elif isinstance(inpt, PIL.Image.Image):\n+            raise TypeError(\"Unsupported input type\")\n+\n+        # Image instance after linear transformation is not Image anymore due to unknown data range\n+        # Thus we will return Tensor for input Image\n+\n+        shape = inpt.shape\n+        n = shape[-3] * shape[-2] * shape[-1]\n+        if n != self.transformation_matrix.shape[0]:\n+            raise ValueError(\n+                \"Input tensor and transformation matrix have incompatible shape.\"\n+                + f\"[{shape[-3]} x {shape[-2]} x {shape[-1]}] != \"\n+                + f\"{self.transformation_matrix.shape[0]}\"\n+            )\n+\n+        if inpt.device.type != self.mean_vector.device.type:\n+            raise ValueError(\n+                \"Input tensor should be on the same device as transformation matrix and mean vector. \"\n+                f\"Got {inpt.device} vs {self.mean_vector.device}\"\n+            )\n+\n+        flat_tensor = inpt.view(-1, n) - self.mean_vector\n+        transformed_tensor = torch.mm(flat_tensor, self.transformation_matrix)\n+        return transformed_tensor.view(shape)\n+\n+\n class Normalize(Transform):\n     def __init__(self, mean: List[float], std: List[float]):\n         super().__init__()\n", "issue": "Port `transforms.LinearTransformation` to `prototype.transforms`\ncc @vfdev-5 @datumbox @bjuncek\n", "before_files": [{"content": "import functools\nfrom typing import Any, Callable, Dict, List, Sequence, Type, Union\n\nimport torch\nfrom torchvision.prototype.transforms import functional as F, Transform\nfrom torchvision.transforms.transforms import _setup_size\n\n\nclass Identity(Transform):\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        return inpt\n\n\nclass Lambda(Transform):\n    def __init__(self, fn: Callable[[Any], Any], *types: Type):\n        super().__init__()\n        self.fn = fn\n        self.types = types\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        if type(inpt) in self.types:\n            return self.fn(inpt)\n        else:\n            return inpt\n\n    def extra_repr(self) -> str:\n        extras = []\n        name = getattr(self.fn, \"__name__\", None)\n        if name:\n            extras.append(name)\n        extras.append(f\"types={[type.__name__ for type in self.types]}\")\n        return \", \".join(extras)\n\n\nclass Normalize(Transform):\n    def __init__(self, mean: List[float], std: List[float]):\n        super().__init__()\n        self.mean = mean\n        self.std = std\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        return F.normalize(inpt, mean=self.mean, std=self.std)\n\n\nclass GaussianBlur(Transform):\n    def __init__(\n        self, kernel_size: Union[int, Sequence[int]], sigma: Union[float, Sequence[float]] = (0.1, 2.0)\n    ) -> None:\n        super().__init__()\n        self.kernel_size = _setup_size(kernel_size, \"Kernel size should be a tuple/list of two integers\")\n        for ks in self.kernel_size:\n            if ks <= 0 or ks % 2 == 0:\n                raise ValueError(\"Kernel size value should be an odd and positive number.\")\n\n        if isinstance(sigma, float):\n            if sigma <= 0:\n                raise ValueError(\"If sigma is a single number, it must be positive.\")\n            sigma = (sigma, sigma)\n        elif isinstance(sigma, Sequence) and len(sigma) == 2:\n            if not 0.0 < sigma[0] <= sigma[1]:\n                raise ValueError(\"sigma values should be positive and of the form (min, max).\")\n        else:\n            raise TypeError(\"sigma should be a single float or a list/tuple with length 2 floats.\")\n\n        self.sigma = sigma\n\n    def _get_params(self, sample: Any) -> Dict[str, Any]:\n        sigma = torch.empty(1).uniform_(self.sigma[0], self.sigma[1]).item()\n        return dict(sigma=[sigma, sigma])\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        return F.gaussian_blur(inpt, **params)\n\n\nclass ToDtype(Lambda):\n    def __init__(self, dtype: torch.dtype, *types: Type) -> None:\n        self.dtype = dtype\n        super().__init__(functools.partial(torch.Tensor.to, dtype=dtype), *types)\n\n    def extra_repr(self) -> str:\n        return \", \".join([f\"dtype={self.dtype}\", f\"types={[type.__name__ for type in self.types]}\"])\n", "path": "torchvision/prototype/transforms/_misc.py"}, {"content": "from . import functional  # usort: skip\n\nfrom ._transform import Transform  # usort: skip\n\nfrom ._augment import RandomCutmix, RandomErasing, RandomMixup\nfrom ._auto_augment import AugMix, AutoAugment, AutoAugmentPolicy, RandAugment, TrivialAugmentWide\nfrom ._color import (\n    ColorJitter,\n    RandomAdjustSharpness,\n    RandomAutocontrast,\n    RandomEqualize,\n    RandomInvert,\n    RandomPhotometricDistort,\n    RandomPosterize,\n    RandomSolarize,\n)\nfrom ._container import Compose, RandomApply, RandomChoice, RandomOrder\nfrom ._geometry import (\n    BatchMultiCrop,\n    CenterCrop,\n    ElasticTransform,\n    FiveCrop,\n    FixedSizeCrop,\n    Pad,\n    RandomAffine,\n    RandomCrop,\n    RandomHorizontalFlip,\n    RandomIoUCrop,\n    RandomPerspective,\n    RandomResizedCrop,\n    RandomRotation,\n    RandomShortestSize,\n    RandomVerticalFlip,\n    RandomZoomOut,\n    Resize,\n    ScaleJitter,\n    TenCrop,\n)\nfrom ._meta import ConvertBoundingBoxFormat, ConvertColorSpace, ConvertImageDtype\nfrom ._misc import GaussianBlur, Identity, Lambda, Normalize, ToDtype\nfrom ._type_conversion import DecodeImage, LabelToOneHot, ToImagePIL, ToImageTensor\n\nfrom ._deprecated import Grayscale, RandomGrayscale, ToTensor, ToPILImage, PILToTensor  # usort: skip\n", "path": "torchvision/prototype/transforms/__init__.py"}], "after_files": [{"content": "import functools\nfrom typing import Any, Callable, Dict, List, Sequence, Type, Union\n\nimport PIL.Image\n\nimport torch\nfrom torchvision.prototype import features\nfrom torchvision.prototype.transforms import functional as F, Transform\nfrom torchvision.transforms.transforms import _setup_size\n\n\nclass Identity(Transform):\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        return inpt\n\n\nclass Lambda(Transform):\n    def __init__(self, fn: Callable[[Any], Any], *types: Type):\n        super().__init__()\n        self.fn = fn\n        self.types = types\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        if type(inpt) in self.types:\n            return self.fn(inpt)\n        else:\n            return inpt\n\n    def extra_repr(self) -> str:\n        extras = []\n        name = getattr(self.fn, \"__name__\", None)\n        if name:\n            extras.append(name)\n        extras.append(f\"types={[type.__name__ for type in self.types]}\")\n        return \", \".join(extras)\n\n\nclass LinearTransformation(Transform):\n    def __init__(self, transformation_matrix: torch.Tensor, mean_vector: torch.Tensor):\n        super().__init__()\n        if transformation_matrix.size(0) != transformation_matrix.size(1):\n            raise ValueError(\n                \"transformation_matrix should be square. Got \"\n                f\"{tuple(transformation_matrix.size())} rectangular matrix.\"\n            )\n\n        if mean_vector.size(0) != transformation_matrix.size(0):\n            raise ValueError(\n                f\"mean_vector should have the same length {mean_vector.size(0)}\"\n                f\" as any one of the dimensions of the transformation_matrix [{tuple(transformation_matrix.size())}]\"\n            )\n\n        if transformation_matrix.device != mean_vector.device:\n            raise ValueError(\n                f\"Input tensors should be on the same device. Got {transformation_matrix.device} and {mean_vector.device}\"\n            )\n\n        self.transformation_matrix = transformation_matrix\n        self.mean_vector = mean_vector\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n\n        if isinstance(inpt, features._Feature) and not isinstance(inpt, features.Image):\n            return inpt\n        elif isinstance(inpt, PIL.Image.Image):\n            raise TypeError(\"Unsupported input type\")\n\n        # Image instance after linear transformation is not Image anymore due to unknown data range\n        # Thus we will return Tensor for input Image\n\n        shape = inpt.shape\n        n = shape[-3] * shape[-2] * shape[-1]\n        if n != self.transformation_matrix.shape[0]:\n            raise ValueError(\n                \"Input tensor and transformation matrix have incompatible shape.\"\n                + f\"[{shape[-3]} x {shape[-2]} x {shape[-1]}] != \"\n                + f\"{self.transformation_matrix.shape[0]}\"\n            )\n\n        if inpt.device.type != self.mean_vector.device.type:\n            raise ValueError(\n                \"Input tensor should be on the same device as transformation matrix and mean vector. \"\n                f\"Got {inpt.device} vs {self.mean_vector.device}\"\n            )\n\n        flat_tensor = inpt.view(-1, n) - self.mean_vector\n        transformed_tensor = torch.mm(flat_tensor, self.transformation_matrix)\n        return transformed_tensor.view(shape)\n\n\nclass Normalize(Transform):\n    def __init__(self, mean: List[float], std: List[float]):\n        super().__init__()\n        self.mean = mean\n        self.std = std\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        return F.normalize(inpt, mean=self.mean, std=self.std)\n\n\nclass GaussianBlur(Transform):\n    def __init__(\n        self, kernel_size: Union[int, Sequence[int]], sigma: Union[float, Sequence[float]] = (0.1, 2.0)\n    ) -> None:\n        super().__init__()\n        self.kernel_size = _setup_size(kernel_size, \"Kernel size should be a tuple/list of two integers\")\n        for ks in self.kernel_size:\n            if ks <= 0 or ks % 2 == 0:\n                raise ValueError(\"Kernel size value should be an odd and positive number.\")\n\n        if isinstance(sigma, float):\n            if sigma <= 0:\n                raise ValueError(\"If sigma is a single number, it must be positive.\")\n            sigma = (sigma, sigma)\n        elif isinstance(sigma, Sequence) and len(sigma) == 2:\n            if not 0.0 < sigma[0] <= sigma[1]:\n                raise ValueError(\"sigma values should be positive and of the form (min, max).\")\n        else:\n            raise TypeError(\"sigma should be a single float or a list/tuple with length 2 floats.\")\n\n        self.sigma = sigma\n\n    def _get_params(self, sample: Any) -> Dict[str, Any]:\n        sigma = torch.empty(1).uniform_(self.sigma[0], self.sigma[1]).item()\n        return dict(sigma=[sigma, sigma])\n\n    def _transform(self, inpt: Any, params: Dict[str, Any]) -> Any:\n        return F.gaussian_blur(inpt, **params)\n\n\nclass ToDtype(Lambda):\n    def __init__(self, dtype: torch.dtype, *types: Type) -> None:\n        self.dtype = dtype\n        super().__init__(functools.partial(torch.Tensor.to, dtype=dtype), *types)\n\n    def extra_repr(self) -> str:\n        return \", \".join([f\"dtype={self.dtype}\", f\"types={[type.__name__ for type in self.types]}\"])\n", "path": "torchvision/prototype/transforms/_misc.py"}, {"content": "from . import functional  # usort: skip\n\nfrom ._transform import Transform  # usort: skip\n\nfrom ._augment import RandomCutmix, RandomErasing, RandomMixup\nfrom ._auto_augment import AugMix, AutoAugment, AutoAugmentPolicy, RandAugment, TrivialAugmentWide\nfrom ._color import (\n    ColorJitter,\n    RandomAdjustSharpness,\n    RandomAutocontrast,\n    RandomEqualize,\n    RandomInvert,\n    RandomPhotometricDistort,\n    RandomPosterize,\n    RandomSolarize,\n)\nfrom ._container import Compose, RandomApply, RandomChoice, RandomOrder\nfrom ._geometry import (\n    BatchMultiCrop,\n    CenterCrop,\n    ElasticTransform,\n    FiveCrop,\n    FixedSizeCrop,\n    Pad,\n    RandomAffine,\n    RandomCrop,\n    RandomHorizontalFlip,\n    RandomIoUCrop,\n    RandomPerspective,\n    RandomResizedCrop,\n    RandomRotation,\n    RandomShortestSize,\n    RandomVerticalFlip,\n    RandomZoomOut,\n    Resize,\n    ScaleJitter,\n    TenCrop,\n)\nfrom ._meta import ConvertBoundingBoxFormat, ConvertColorSpace, ConvertImageDtype\nfrom ._misc import GaussianBlur, Identity, Lambda, LinearTransformation, Normalize, ToDtype\nfrom ._type_conversion import DecodeImage, LabelToOneHot, ToImagePIL, ToImageTensor\n\nfrom ._deprecated import Grayscale, RandomGrayscale, ToTensor, ToPILImage, PILToTensor  # usort: skip\n", "path": "torchvision/prototype/transforms/__init__.py"}]}