You only need to use one of the three methods. In other words if you do
self.hidden[0].detach_()
self.hidden[1].detach_()

then that is enough, you don’t need to use the other two methods as well.
The other two methods will complain about TypeError: ‘tuple’ object does not support item assignment. In that case, the hidden state should be initialised as a list instead of a tuple.
def init_hidden(self):
    return [autograd.Variable(torch.zeros(self.hidden_layers, 1, self.hidden_dim)),
        autograd.Variable(torch.zeros(self.hidden_layers, 1, self.hidden_dim))]