Fix bugs in quantized PRELU operations.

PiperOrigin-RevId: 313426576
Change-Id: Ifb53ef0add80b5793e428fbfacbbea779bc9ae63
This commit is contained in:
A. Unique TensorFlower 2020-05-27 11:18:31 -07:00 committed by TensorFlower Gardener
parent 56479bb19a
commit a5622fee57
2 changed files with 14 additions and 13 deletions

View File

@ -68,8 +68,9 @@ TfLiteStatus PreluEval(TfLiteContext* context, TfLiteNode* node) {
int output_shift_1 = 0;
int32_t output_multiplier_2 = 0;
int output_shift_2 = 0;
if (output->type == kTfLiteUInt8 || output->type == kTfLiteInt16) {
double real_multiplier_1 = static_cast<double>(input->params.scale) *
if (output->type == kTfLiteInt8 || output->type == kTfLiteUInt8 ||
output->type == kTfLiteInt16) {
double real_multiplier_1 = static_cast<double>(input->params.scale) /
static_cast<double>(output->params.scale);
double real_multiplier_2 = static_cast<double>(input->params.scale) *
static_cast<double>(alpha->params.scale) /

View File

@ -156,14 +156,14 @@ TF_LITE_MICRO_TESTS_BEGIN
TF_LITE_MICRO_TEST(FloatPreluActivationsOpTest) {
const int output_dims_count = 12;
float output_data[output_dims_count];
tflite::testing::TestPreluFloat({1, 2, 2, 3}, // input shape
tflite::testing::TestPreluFloat({3, 2, 2, 3}, // input shape
{
0.0f, 0.0f, 0.0f, // Row 1, Column 1
1.0f, 1.0f, 1.0f, // Row 1, Column 2
-1.0f, -1.0f, -1.0f, // Row 2, Column 1
-2.0f, -2.0f, -2.0f, // Row 1, Column 2
},
{1, 1, 1, 3}, // alpha shape
{3, 1, 1, 3}, // alpha shape
{0.0f, 1.0f, 2.0f}, // alpha values
{
0.0f, 0.0f, 0.0f, // Row 1, Column 1
@ -171,26 +171,26 @@ TF_LITE_MICRO_TEST(FloatPreluActivationsOpTest) {
0.0f, -1.0f, -2.0f, // Row 2, Column 1
0.0f, -2.0f, -4.0f, // Row 1, Column 2
},
{1, 2, 2, 3}, // output shape
{3, 2, 2, 3}, // output shape
output_data);
}
TF_LITE_MICRO_TEST(QuantizedUint8PreluActivationsOpTest) {
using tflite::testing::F2Q;
const float kMin = -1;
const float kMax = 127.f / 128.f;
const float kMin = -4;
const float kMax = 127.f / 32.f;
const float kAlphaMin = -0.5f;
const float kAlphaMax = 0.5f;
const int output_dims_count = 12;
uint8_t output_data[output_dims_count];
tflite::testing::TestPreluQuantized(
{1, 2, 2, 3}, // input shape
{3, 2, 2, 3}, // input shape
{F2Q(0.0f, kMin, kMax), F2Q(0.0f, kMin, kMax), F2Q(0.0f, kMin, kMax),
F2Q(0.5f, kMin, kMax), F2Q(0.5f, kMin, kMax), F2Q(0.5f, kMin, kMax),
F2Q(-1.0f, kMin, kMax), F2Q(-1.0f, kMin, kMax), F2Q(-1.0f, kMin, kMax),
F2Q(-0.25f, kMin, kMax), F2Q(-0.25f, kMin, kMax),
F2Q(-0.25f, kMin, kMax)},
kMin, kMax, {1, 1, 1, 3}, // alpha shape
kMin, kMax, {3, 1, 1, 3}, // alpha shape
{F2Q(0.0f, kMin, kMax), F2Q(0.5f, kMin, kMax), F2Q(-0.5f, kMin, kMax)},
kMin, kMax,
{F2Q(0.0f, kMin, kMax), F2Q(0.0f, kMin, kMax), F2Q(0.0f, kMin, kMax),
@ -198,7 +198,7 @@ TF_LITE_MICRO_TEST(QuantizedUint8PreluActivationsOpTest) {
F2Q(0.0f, kMin, kMax), F2Q(-0.5f, kMin, kMax), F2Q(0.5f, kMin, kMax),
F2Q(0.0f, kMin, kMax), F2Q(-0.125f, kMin, kMax),
F2Q(0.125f, kMin, kMax)},
{1, 2, 2, 3}, // output shape
{3, 2, 2, 3}, // output shape
kMin, kMax, output_data);
}
@ -211,13 +211,13 @@ TF_LITE_MICRO_TEST(QuantizedInt8PreluActivationsOpTest) {
const int output_dims_count = 12;
int8_t output_data[output_dims_count];
tflite::testing::TestPreluQuantized(
{1, 2, 2, 3}, // input shape
{3, 2, 2, 3}, // input shape
{F2QS(0.0f, kMin, kMax), F2QS(0.0f, kMin, kMax), F2QS(0.0f, kMin, kMax),
F2QS(0.5f, kMin, kMax), F2QS(0.5f, kMin, kMax), F2QS(0.5f, kMin, kMax),
F2QS(-1.0f, kMin, kMax), F2QS(-1.0f, kMin, kMax),
F2QS(-1.0f, kMin, kMax), F2QS(-0.25f, kMin, kMax),
F2QS(-0.25f, kMin, kMax), F2QS(-0.25f, kMin, kMax)},
kMin, kMax, {1, 1, 1, 3}, // alpha shape
kMin, kMax, {3, 1, 1, 3}, // alpha shape
{F2QS(0.0f, kMin, kMax), F2QS(0.5f, kMin, kMax), F2QS(-0.5f, kMin, kMax)},
kMin, kMax,
{F2QS(0.0f, kMin, kMax), F2QS(0.0f, kMin, kMax), F2QS(0.0f, kMin, kMax),
@ -225,7 +225,7 @@ TF_LITE_MICRO_TEST(QuantizedInt8PreluActivationsOpTest) {
F2QS(0.0f, kMin, kMax), F2QS(-0.5f, kMin, kMax), F2QS(0.5f, kMin, kMax),
F2QS(0.0f, kMin, kMax), F2QS(-0.125f, kMin, kMax),
F2QS(0.125f, kMin, kMax)},
{1, 2, 2, 3}, // output shape
{3, 2, 2, 3}, // output shape
kMin, kMax, output_data);
}
TF_LITE_MICRO_TESTS_END