10b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle/* Copyright 2017 The TensorFlow Authors. All Rights Reserved. 20b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 30b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleLicensed under the Apache License, Version 2.0 (the "License"); 40b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleyou may not use this file except in compliance with the License. 50b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleYou may obtain a copy of the License at 60b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 70b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle http://www.apache.org/licenses/LICENSE-2.0 80b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 90b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleUnless required by applicable law or agreed to in writing, software 100b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selledistributed under the License is distributed on an "AS IS" BASIS, 110b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew SelleSee the License for the specific language governing permissions and 130b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellelimitations under the License. 140b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle==============================================================================*/ 150b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <algorithm> 160b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <cmath> 170b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include <limits> 180b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 190b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/kernels/internal/compatibility.h" 200b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/kernels/internal/quantization_util.h" 210b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle#include "tensorflow/contrib/lite/kernels/internal/round.h" 220b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 230b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellenamespace tflite { 240b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 250255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlowervoid QuantizeMultiplier(double double_multiplier, int32_t* quantized_multiplier, 260255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower int* shift) { 270b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle if (double_multiplier == 0.) { 280b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle *quantized_multiplier = 0; 290255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower *shift = 0; 300b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle return; 310b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle } 320255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower const double q = std::frexp(double_multiplier, shift); 330b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle auto q_fixed = static_cast<int64_t>(TfLiteRound(q * (1ll << 31))); 340b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle TFLITE_CHECK(q_fixed <= (1ll << 31)); 350b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle if (q_fixed == (1ll << 31)) { 360b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle q_fixed /= 2; 370255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower ++*shift; 380b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle } 390b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle TFLITE_CHECK_LE(q_fixed, std::numeric_limits<int32_t>::max()); 400b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle *quantized_multiplier = static_cast<int32_t>(q_fixed); 410b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle} 420b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 430b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellevoid QuantizeMultiplierGreaterThanOne(double double_multiplier, 440b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle int32_t* quantized_multiplier, 450b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle int* left_shift) { 460255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower TFLITE_CHECK_GT(double_multiplier, 1.); 470255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower QuantizeMultiplier(double_multiplier, quantized_multiplier, left_shift); 480b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle TFLITE_CHECK_GE(*left_shift, 0); 490255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower} 500255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower 510255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlowervoid QuantizeMultiplierSmallerThanOne(double double_multiplier, 520255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower int32_t* quantized_multiplier, 530255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower int* right_shift) { 540255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower TFLITE_CHECK_LT(double_multiplier, 1.); 550255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower TFLITE_CHECK_GT(double_multiplier, 0.); 560255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower int shift; 570255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower QuantizeMultiplier(double_multiplier, quantized_multiplier, &shift); 580255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower TFLITE_CHECK_LE(shift, 0); 590255d9a9ca66d233ca4befcceff5d6e70b16d0e0A. Unique TensorFlower *right_shift = -shift; 600b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle} 610b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 620b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Sellevoid PreprocessSoftmaxScaling(double beta, double input_scale, 630b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle int input_integer_bits, 640b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle int32_t* quantized_multiplier, int* left_shift) { 650b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // If the overall multiplier (input and beta) is large, then exp() of an 660b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // input difference of 1 scaled by this will be large. In other words, we 670b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // can cap the multiplier and know that, when it is used, the output will be 680b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // (round to) zero wherever the input is not at the maximum value. 690b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 700b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // If the overall scale is less than one, and input_integer_bits=0, then the 710b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // result is double equivalent of Q0.31 (actually with more precision). Thus 720b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // this generates a Q(input_integer_bits).(31-input_integer_bits) 730b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // representation. 740b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle const double input_beta_real_multiplier = std::min( 750b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle beta * input_scale * (1 << (31 - input_integer_bits)), (1ll << 31) - 1.0); 760b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 770b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle QuantizeMultiplierGreaterThanOne(input_beta_real_multiplier, 780b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle quantized_multiplier, left_shift); 790b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle} 800b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 810b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selleint CalculateInputRadius(int input_integer_bits, int input_left_shift) { 820b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle const double max_input_rescaled = 1.0 * ((1 << input_integer_bits) - 1) * 830b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle (1ll << (31 - input_integer_bits)) / 840b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle (1ll << input_left_shift); 850b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // Tighten bound using floor. Suppose that we could use the exact value. 860b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // After scaling the difference, the result would be at the maximum. Thus we 870b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle // must ensure that our value has lower magnitude. 880b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle return static_cast<int>(std::floor(max_input_rescaled)); 890b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle} 900b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle 910b15439f8f0f2d4755587f4096c3ea04cb199d23Andrew Selle} // namespace tflite 92