MLBEDSW-6929 Fix LeakyReLU int16 regressions
Fixed LeakyReLU regressions for int16 due to scaling introduced
for handling negative alpha.
Signed-off-by: Fredrik Svedberg <fredrik.svedberg@arm.com>
Change-Id: I84a494fedf54bd4b47c4632645ded7d6cda445f8
diff --git a/ethosu/vela/tflite_graph_optimiser.py b/ethosu/vela/tflite_graph_optimiser.py
index 052f824..fb98e21 100644
--- a/ethosu/vela/tflite_graph_optimiser.py
+++ b/ethosu/vela/tflite_graph_optimiser.py
@@ -1049,20 +1049,25 @@
quantization.min = 0
quantization.max = alpha * (quantization.quant_max - quantization.quant_min)
quantization.zero_point = 0
+ alpha_dtype = mul_ifm.dtype
if "alpha_scaling" in op.attrs:
# The LeakyRelu was the result from convert_prelu
scalar, alpha_scale, alpha_shift = op.attrs["alpha_scaling"]
mul_alpha.type = Op.RescaleMul
mul_alpha.rescale = [alpha_scale, alpha_shift]
- elif np.isinf(1 / alpha):
- # Handling of alpha near zero
+ elif alpha == 0 or np.isinf(1 / alpha):
+ # Handling of alpha near or at zero
quantization.scale_f32 = np.float32(1)
scalar = 0
else:
quantization.scale_f32 = alpha
- scalar, _ = scaling.elementwise_mul_scale(ifm.quantization.scale_f32, alpha, ofm.quantization.scale_f32)
+ if alpha_dtype == DataType.int32:
+ # When the datatype is int32 we need to do the scaling with the multiplication
+ scalar, _ = scaling.elementwise_mul_scale(ifm.quantization.scale_f32, alpha, ofm.quantization.scale_f32)
+ else:
+ scalar = 1
alpha_tens = create_const_tensor(
- op.name + "_alpha_scalar", [1, 1, 1, 1], DataType.int32, [scalar], np.int32, quantization=quantization
+ op.name + "_alpha_scalar", [1], alpha_dtype, [scalar], alpha_dtype.as_numpy_type(), quantization=quantization
)
mul_alpha.add_input_tensor(alpha_tens)
fm_alpha = ofm.clone(op.name + "_alpha", set_unique=True)