|
|
|
@@ -1090,19 +1090,25 @@ def get_bprop_ce_with_logits_loss(self): |
|
|
|
add = P.Add() |
|
|
|
sub = P.Sub() |
|
|
|
size = P.Size() |
|
|
|
neg = P.Neg() |
|
|
|
log = P.Log() |
|
|
|
|
|
|
|
def bprop(predict, target, weight, pos_weight, out, dout): |
|
|
|
sigmoid_input = sigmoid(predict) |
|
|
|
if pos_weight is not None: |
|
|
|
t = mul(target, pos_weight) |
|
|
|
dx = mul(sub(mul(sub(add(t, 1), target), sigmoid_input), t), dout) |
|
|
|
grad_target = mul(sub(log(sub(1, sigmoid_input)), mul(pos_weight, log(sigmoid_input))), dout) |
|
|
|
else: |
|
|
|
dx = mul((sigmoid_input - target), dout) |
|
|
|
grad_target = mul(predict, neg(dout)) |
|
|
|
if weight is not None: |
|
|
|
dx = mul(dx, weight) |
|
|
|
grad_target = mul(grad_target, weight) |
|
|
|
if reduction == 'mean': |
|
|
|
dx = dx / size(dx) |
|
|
|
return dx, zeros_like(target), zeros_like(weight), zeros_like(pos_weight) |
|
|
|
grad_target = grad_target / size(target) |
|
|
|
return dx, grad_target, zeros_like(weight), zeros_like(pos_weight) |
|
|
|
|
|
|
|
return bprop |
|
|
|
|
|
|
|
|