Hello everyone!
I am trying to understand relations between in-place operations and autograd. In the first snippet of code, I have “RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation” and doesn’t have this exception in the second one.
First snippet:
import torch as T
from torch.autograd import Variable
from torch.nn import functional as F

x = Variable(T.rand(2, 2), requires_grad=True)
h = F.sigmoid(x)
h[:, 0] = 0
loss = h.sum()
loss.backward()

Second snippet:
import torch as T
from torch.autograd import Variable
from torch.nn import functional as F

x = Variable(T.rand(2, 2), requires_grad=True)
h = F.relu(x)
h[:, 0] = 0
loss = h.sum()
loss.backward()

Can someone explain why this is the case? Is it because F.sigmoid calls c function directly and F.relu performs some computations before calling c function which allows pytorch to handle in-place operation? Is there any function in Tensor that performs not in-place setitem ? something like this:
def setitem(self, key, value):
    self = self.clone()
    self[key] = value
    return self

Any help would be appreciated.