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?