I have defined a function called LiocFunction and it uses proposals refined by regression values  output from self.RCNN_bbox_pred (nn.Linear) to calculate some scores.
Its self-defined backward() returns the gradients of proposals, labels, mask
So  it looks like this:
bbox_pred = self.RCNN_bbox_pred(pooled_feat)
proposals = bbox_transform.apply(boxes, bbox_pred)
scores = LiocFunction.apply(proposals, labels, mask)


class LiocFunction(torch.autograd.Function):

    @staticmethod
    def forward(ctx, proposals,labels, mask):
        #proposals = [1,num_boxes,5]
        ctx.save_for_backward(proposals, labels, mask)
        back = False
        output = calculate_Loic(proposals, labels, mask, back) #output = [1,num_boxes,1]

        return output

    @staticmethod
    def backward(ctx, grad_pro):
        proposals, labels, mask = ctx.saved_variables
        grad_proposals = grad_labels = grad_mask = None
        back = True
        grad_proposals = calculate_Loic(proposals, labels, mask, back)

        return grad_proposals, grad_labels, grad_mask

I also implement  bbox_transform and the backward() returns the gradients of boxes, bbox_pred
I have found that the backward() of two self-defined functions are called during training, but the back propagation stops at bbox_transform, doesn’t go further to
nn.Linear layer. What could have gone wrong?