title: How do I rotate a PyTorch image tensor around it's center in a way that supports autograd?
body: <p>I'd like to randomly rotate an image tensor (B, C, H, W) around it's center (2d rotation I think?). I would like to avoid using NumPy and Kornia, so that I basically only need to import from the torch module. I'm also not using <code>torchvision.transforms</code>, because I need it to be autograd compatible. Essentially I'm trying to create an autograd compatible version of <code>torchvision.transforms.RandomRotation()</code> for visualization techniques like DeepDream (so I need to avoid artifacts as much as possible).</p>
  <pre><code>import torch
  import math
  import random
  import torchvision.transforms as transforms
  from PIL import Image
  
  
  # Load image
  def preprocess_simple(image_name, image_size):
      Loader = transforms.Compose([transforms.Resize(image_size), transforms.ToTensor()])
      image = Image.open(image_name).convert('RGB')
      return Loader(image).unsqueeze(0)
      
  # Save image   
  def deprocess_simple(output_tensor, output_name):
      output_tensor.clamp_(0, 1)
      Image2PIL = transforms.ToPILImage()
      image = Image2PIL(output_tensor.squeeze(0))
      image.save(output_name)
  
  
  # Somehow rotate tensor around it's center
  def rotate_tensor(tensor, radians):
      ...
      return rotated_tensor
  
  # Get a random angle within a specified range 
  r_degrees = 5
  angle_range = list(range(-r_degrees, r_degrees))
  n = random.randint(angle_range[0], angle_range[len(angle_range)-1])
  
  # Convert angle from degrees to radians
  ang_rad = angle * math.pi / 180
  
  
  # test_tensor = preprocess_simple('path/to/file', (512,512))
  test_tensor = torch.randn(1,3,512,512)
  
  
  # Rotate input tensor somehow
  output_tensor = rotate_tensor(test_tensor, ang_rad)
  
  
  # Optionally use this to check rotated image
  # deprocess_simple(output_tensor, 'rotated_image.jpg')
  </code></pre>
  <p>Some example outputs of what I'm trying to accomplish:</p>
  <p><a href="https://i.stack.imgur.com/hiZv7s.jpg" rel="noreferrer"><img src="https://i.stack.imgur.com/hiZv7s.jpg" alt="First example of rotated image" /></a> <a href="https://i.stack.imgur.com/svOqhs.jpg" rel="noreferrer"><img src="https://i.stack.imgur.com/svOqhs.jpg" alt="Second example of rotated image" /></a></p>