Other than the lack of original source code for the training and loss functions, I am facing a problem with a recursive part of the code. In the paper : “To Choose or to Fuse? Scale Selection for Crowd Counting”, from this year, the author are using a three fold loss. For the last part they recursively look for “hard pixels” (pixels over predicting compare to the groundtruth). For that they recursively split the prediction into 4 quarters, and for the over-predicted ones they recursively go down to pixel level and return indices of said hard pixels.
I quickly coded something which seem to work but I often get the error :
 /opt/conda/conda-bld/pytorch_1595629427478/work/aten/src/ATen/native/cuda/Loss.cu:106: operator(): block: [0,0,0], thread: [31,0,0] Assertion `input_val >= zero && input_val <= one` failed. Traceback (most recent call last): ...     idxs_hard =np.array(self.prasearch(density.detach().clone().cpu().numpy()[0,0,:,:],gt.detach().clone().cpu().numpy()[0,:,:],(0,0))) ....
I am converting the predicted map and groundtruth to numpy arrays as it seemed to be faster than using the tensors (10 times faster apparently).
Am I messing too much with indices ?
I am using them here :

praLoss2 =  self.msesum(density[:,0,idxs_hard[:,0],idxs_hard[:,1]], gt[:,idxs_hard[:,0],idxs_hard[:,1]])

Thank you in advance if you might find the problem with that.
Also here is the recursive function :

def prasearch(self,Dest,Dgt,start):
if(Dest.shape[0]>1):
quarters_sum = [Dest[0:Dest.shape[0]//2,0:Dest.shape[1]//2].sum() - Dgt[0:Dest.shape[0]//2,0:Dest.shape[1]//2].sum(),
Dest[Dest.shape[0]//2:,0:Dest.shape[1]//2].sum()  - Dgt[Dest.shape[0]//2:,0:Dest.shape[1]//2].sum(),
Dest[0:Dest.shape[0]//2,Dest.shape[1]//2:].sum()  - Dgt[0:Dest.shape[0]//2,Dest.shape[1]//2:].sum(),
Dest[Dest.shape[0]//2:,Dest.shape[1]//2:].sum()   - Dgt[Dest.shape[0]//2:,Dest.shape[1]//2:].sum()]
quarters_idxs = [[(0,0),(Dest.shape[0]//2,Dest.shape[1]//2)],
[(Dest.shape[0]//2,0),(Dest.shape[0],Dest.shape[1]//2)],
[(0,Dest.shape[1]//2),(Dest.shape[0]//2,Dest.shape[1])],
[(Dest.shape[0]//2,Dest.shape[1]//2),(Dest.shape[0],Dest.shape[1])]
]
idfix = np.array(quarters_sum)>0
        pixs = []
        for a,b in enumerate(idfix):
            if(b):
                pixs =  pixs +  self.prasearch(Dest[quarters_idxs[a][0][0]:quarters_idxs[a][1][0],quarters_idxs[a][0][1]:quarters_idxs[a][1][1] ],
                                               Dgt[quarters_idxs[a][0][0]:quarters_idxs[a][1][0],quarters_idxs[a][0][1]:quarters_idxs[a][1][1] ],
                                               quarters_idxs[a][0])   
        return pixs
    else:
        if(Dest.shape[0]==1 and Dest.shape[1]==1):
            return [ [start[0],start[1]] ]
        else:## if the input is not even on both axes we need to do that here
            sub = Dest-Dgt
            idmax = sub.argmax()#we take the id of the maximum positive difference in array
            return [ [start[0],start[1]+idmax.item()] ]