I have a network and after a few conv layers, it has 3 heads: self.fc_pi, self.fc_q and self.fc_beta. I have frozen all of the conv layer weights and am allowing updates only to self.fc_q and self.fc_beta by adding only their weights to the optimizer as:
self.optimizer = config.optimizer_fn(self.network.fc_q.parameters())
self.optimizer.add_param_group({'params': self.network.fc_beta.parameters()})

The self.fc_pi is a linear layer that connects 200 neurons to 16 neurons so when I do print(list(self.network.fc_pi.parameters())[0].shape), I get [16,200] and when I do print(list(self.network.fc_pi.parameters())[1].shape), I get [16], both of which respectively represent the weights and biases of this linear layer.
I would like to add a subset of these weights and biases to the optimizer so that only the weights connected to the first 4 (out of the 16 neurons), and their biases, are updated. I have tried this:
self.optimizer.add_param_group({'params': list(self.network.fc_pi.parameters())[0][0:4]})
self.optimizer.add_param_group({'params': list(self.network.fc_pi.parameters())[1][0:4]})

but this raises the error:
ValueError: can't optimize a non-leaf Tensor

How can I correctly add a subset of the layer weights and biases to the optimizer so that only a subset of weights is updated and not all the weights in the layer.