diff --git a/tensorflow/lite/schema/schema.fbs b/tensorflow/lite/schema/schema.fbs index aca926a3b97..13f47d2cfcc 100644 --- a/tensorflow/lite/schema/schema.fbs +++ b/tensorflow/lite/schema/schema.fbs @@ -64,9 +64,20 @@ table QuantizationParameters { scale:[float]; // For dequantizing the tensor's values. zero_point:[long]; - // If this is not none, the quantization parameters above are ignored and the - // value of the QuantizationDetails union below should be used. + // If this is not none, the other quantization parameters (i.e. min, max, + // scale, zero_point fields above) are ignored and the value of the + // QuantizationDetails union should be used. details:QuantizationDetails; + + // Specifies the dimension of the Tensor's shape that the scales and + // zero_points correspond to. For example, a tensor t, with dims=[4, 3, 2, 1] + // with quantization params: + // scale=[1.0, 2.0, 3.0], zero_point=[1, 2, 3], quantization_dimension=1 + // will be quantized across the second dimension of t. + // t[:, 0, :, :] will have scale[0]=1.0, zero_point[0]=1 + // t[:, 1, :, :] will have scale[1]=2.0, zero_point[0]=2 + // t[:, 2, :, :] will have scale[2]=3.0, zero_point[0]=3 + quantized_dimension:int; } table Tensor { diff --git a/tensorflow/lite/schema/schema_generated.h b/tensorflow/lite/schema/schema_generated.h index 1d153cc7177..a1174e79f72 100755 --- a/tensorflow/lite/schema/schema_generated.h +++ b/tensorflow/lite/schema/schema_generated.h @@ -2335,7 +2335,9 @@ struct QuantizationParametersT : public flatbuffers::NativeTable { std::vector scale; std::vector zero_point; QuantizationDetailsUnion details; - QuantizationParametersT() { + int32_t quantized_dimension; + QuantizationParametersT() + : quantized_dimension(0) { } }; @@ -2347,7 +2349,8 @@ struct QuantizationParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Tab VT_SCALE = 8, VT_ZERO_POINT = 10, VT_DETAILS_TYPE = 12, - VT_DETAILS = 14 + VT_DETAILS = 14, + VT_QUANTIZED_DIMENSION = 16 }; const flatbuffers::Vector *min() const { return GetPointer *>(VT_MIN); @@ -2371,6 +2374,9 @@ struct QuantizationParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Tab const CustomQuantization *details_as_CustomQuantization() const { return details_type() == QuantizationDetails_CustomQuantization ? static_cast(details()) : nullptr; } + int32_t quantized_dimension() const { + return GetField(VT_QUANTIZED_DIMENSION, 0); + } bool Verify(flatbuffers::Verifier &verifier) const { return VerifyTableStart(verifier) && VerifyOffset(verifier, VT_MIN) && @@ -2384,6 +2390,7 @@ struct QuantizationParameters FLATBUFFERS_FINAL_CLASS : private flatbuffers::Tab VerifyField(verifier, VT_DETAILS_TYPE) && VerifyOffset(verifier, VT_DETAILS) && VerifyQuantizationDetails(verifier, details(), details_type()) && + VerifyField(verifier, VT_QUANTIZED_DIMENSION) && verifier.EndTable(); } QuantizationParametersT *UnPack(const flatbuffers::resolver_function_t *_resolver = nullptr) const; @@ -2416,6 +2423,9 @@ struct QuantizationParametersBuilder { void add_details(flatbuffers::Offset details) { fbb_.AddOffset(QuantizationParameters::VT_DETAILS, details); } + void add_quantized_dimension(int32_t quantized_dimension) { + fbb_.AddElement(QuantizationParameters::VT_QUANTIZED_DIMENSION, quantized_dimension, 0); + } explicit QuantizationParametersBuilder(flatbuffers::FlatBufferBuilder &_fbb) : fbb_(_fbb) { start_ = fbb_.StartTable(); @@ -2435,8 +2445,10 @@ inline flatbuffers::Offset CreateQuantizationParameters( flatbuffers::Offset> scale = 0, flatbuffers::Offset> zero_point = 0, QuantizationDetails details_type = QuantizationDetails_NONE, - flatbuffers::Offset details = 0) { + flatbuffers::Offset details = 0, + int32_t quantized_dimension = 0) { QuantizationParametersBuilder builder_(_fbb); + builder_.add_quantized_dimension(quantized_dimension); builder_.add_details(details); builder_.add_zero_point(zero_point); builder_.add_scale(scale); @@ -2453,7 +2465,8 @@ inline flatbuffers::Offset CreateQuantizationParametersD const std::vector *scale = nullptr, const std::vector *zero_point = nullptr, QuantizationDetails details_type = QuantizationDetails_NONE, - flatbuffers::Offset details = 0) { + flatbuffers::Offset details = 0, + int32_t quantized_dimension = 0) { return tflite::CreateQuantizationParameters( _fbb, min ? _fbb.CreateVector(*min) : 0, @@ -2461,7 +2474,8 @@ inline flatbuffers::Offset CreateQuantizationParametersD scale ? _fbb.CreateVector(*scale) : 0, zero_point ? _fbb.CreateVector(*zero_point) : 0, details_type, - details); + details, + quantized_dimension); } flatbuffers::Offset CreateQuantizationParameters(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT *_o, const flatbuffers::rehasher_function_t *_rehasher = nullptr); @@ -8263,6 +8277,7 @@ inline void QuantizationParameters::UnPackTo(QuantizationParametersT *_o, const { auto _e = zero_point(); if (_e) { _o->zero_point.resize(_e->size()); for (flatbuffers::uoffset_t _i = 0; _i < _e->size(); _i++) { _o->zero_point[_i] = _e->Get(_i); } } }; { auto _e = details_type(); _o->details.type = _e; }; { auto _e = details(); if (_e) _o->details.value = QuantizationDetailsUnion::UnPack(_e, details_type(), _resolver); }; + { auto _e = quantized_dimension(); _o->quantized_dimension = _e; }; } inline flatbuffers::Offset QuantizationParameters::Pack(flatbuffers::FlatBufferBuilder &_fbb, const QuantizationParametersT* _o, const flatbuffers::rehasher_function_t *_rehasher) { @@ -8279,6 +8294,7 @@ inline flatbuffers::Offset CreateQuantizationParameters( auto _zero_point = _o->zero_point.size() ? _fbb.CreateVector(_o->zero_point) : 0; auto _details_type = _o->details.type; auto _details = _o->details.Pack(_fbb); + auto _quantized_dimension = _o->quantized_dimension; return tflite::CreateQuantizationParameters( _fbb, _min, @@ -8286,7 +8302,8 @@ inline flatbuffers::Offset CreateQuantizationParameters( _scale, _zero_point, _details_type, - _details); + _details, + _quantized_dimension); } inline TensorT *Tensor::UnPack(const flatbuffers::resolver_function_t *_resolver) const {