I am trying to implement a version of iterative FGSM. I want to iteratively backpropagate and then reassign a variable like so:
def fgsm_attack(image, epsilon, data_grad): # Collect the element-wise sign of the data gradient sign_data_grad = data_grad.sign() # Create the perturbed image by adjusting each pixel of the input image perturbed_image = image + epsilon*sign_data_grad # Adding clipping to maintain [0,1] range perturbed_image = torch.clamp(perturbed_image, 0, 1) # Return the perturbed image return perturbed_image
I iteratively call this function, but the problem is that “perturbed_image” loses its gradients from “image.” But, I cannot set perturbed_image.requires_grad = True because it is not a leaf variable. What’s the correct solution to this?