Hello everyone, i am trying to use dice loss for my 3D point cloud semantic segmentation model.
Although, I have implemented the function by referencing some of the codes, I am not sure whether it is correct as my IoU for my validation set does not increase compare to using cross entropy loss solely.
Below is my function for multi class dice loss:
def diceLoss(prediction_g, label_g, num_class, epsilon=1):
ls = []
diceRatio_g = 0
label_g= one_hot(label_g,15).to(device) #one hot encode 15 classes
label_g = label_g.reshape(batch_size*16384, -1) #16384 is number of point cloud (batchsize*n_pts,15)
prediction_g = prediction_g.reshape(batch_size*16384,-1) #reshape so (batchsize*n_pts,15)
for i in range(num_class):
pred = prediction_g
label = label_g
pred=torch.nn.functional.softmax(pred, dim=1)[:, i] #select ith index in softmax
pred = pred.reshape(-1,1) #bs*pts*1
diceLabel_g = label.sum(dim=0)
diceLabel_g = diceLabel_g[i]
dicePrediction_g = pred.sum(dim=0)
diceCorrect_g = (pred * label)[:,0]
diceCorrect_g = diceCorrect_g .sum(dim=0)
#print(diceLabel_g,dicePrediction_g,diceCorrect_g)
diceRatio_g += (2 * diceCorrect_g + epsilon) \
/ (dicePrediction_g + diceLabel_g + epsilon)
loss = 1-(1/num_class)*diceRatio_g
#print(loss)
return loss
Please have a look and let me know if there is any problem. Thank you.