I copy Diceloss function code online. the function need  the input and its correspoding label to be one-hot encoded, so  I need to transform the inputs to one-hot format at first, and feed them into the loss function.
I have experimented a more simple situation to find the problem, and the problem are exactly same as above.
my codes  are below:
x = torch.tensor([[1,2],[3,4]]).float()
w = torch.tensor([1]).float()
w.requires_grad = True
x_ = x*w
x_o_h = get_one_hot(x_, 5)  #转换为one-hot编码 size = (5,2,2)
res = sum(x_o_h)
res.backward()
print(w.grad)
function to get one-hot format:
def get_one_hot(label, N): #输入是一个二维的label!!!且label是long类型的数据,例如(3,3)
size = list(label.size())
label = label.view(-1)  # reshape 为向量
ones = torch.eye(N)
ones = (ones.index_select(0, label.long()))# 用上面的办法转为换one hot
size.append(N)  # 把类别输目添到size的尾后，准备reshape回原来的尺寸（3，3，9）
res = ones.view(size).permute((2,0,1))   ##size = (9, 3, 3)
return res

the error is below:
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn