tensorflow:: ops:: QuantizeV2

#include <array_ops.h>

قم بتكميم موتر "الإدخال" من النوع float إلى موتر "الإخراج" من النوع T.

ملخص

[min_range, max_range] عبارة عن قيم عشرية تحدد نطاق بيانات الإدخال. تتحكم السمة 'mode' في العمليات الحسابية المستخدمة لتحويل القيم العشرية إلى قيمها الكمية المكافئة. بينما تتحكم السمة 'round_mode' في خوارزمية التقريب المستخدمة لكسر التعادل عند تقريب القيم العشرية إلى قيمها الكمية المكافئة.

في وضع "MIN_COMBINED"، ستخضع كل قيمة من قيم الموتر لما يلي:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0

هنا range(T) = numeric_limits ::max() - numeric_limits ::min()

مثال على وضع MIN_COMBINED

لنفترض أن المدخلات من نوع float ولها نطاق محتمل من 0.0 إلى 6.0، وأن نوع المخرجات هو quint8 (من 0 إلى 255). يجب تحديد قيمتي min_range وmax_range على التوالي بـ 0.0 و6.0. عند تحويل قيمة float إلى quint8، يتم ضرب كل قيمة من المدخلات في 255/6 ثم تحويلها إلى quint8.

إذا كان نوع الإخراج هو qint8 ([-128, 127])، فستقوم العملية أيضًا بطرح كل قيمة بمقدار 128 قبل التحويل، بحيث يتوافق نطاق القيم مع نطاق qint8.

إذا كان الوضع هو 'MIN_FIRST'، فسيتم استخدام هذا الأسلوب:

num_discrete_values = 1 << (# of bits in T)
range_adjust = num_discrete_values / (num_discrete_values - 1)
range = (range_max - range_min) * range_adjust
range_scale = num_discrete_values / range
quantized = round(input * range_scale) - round(range_min * range_scale) +
  numeric_limits::min()
quantized = max(quantized, numeric_limits::min())
quantized = min(quantized, numeric_limits::max())

يتمثل الاختلاف الأكبر بين هذه الطريقة وطريقة MIN_COMBINED في أن النطاق الأدنى يُقرّب أولاً، قبل طرحه من القيمة المقربة. أما مع طريقة MIN_COMBINED، فيحدث تحيز طفيف حيث تؤدي عمليات التكميم وفك التكميم المتكررة إلى زيادة الخطأ تدريجيًا.

مثال على الوضع المقياس

يتوافق وضع SCALED مع أسلوب التكميم المستخدم في QuantizeAndDequantize{V2|V3} .

إذا كان الوضع SCALED )، تتم عملية التكميم بضرب كل قيمة مُدخلة بمعامل قياس (scaling_factor). يُحدد معامل القياس من خلال الحد الأدنى والحد الأقصى للنطاق min_range و max_range ليكون أكبر ما يمكن بحيث يكون النطاق من min_range إلى max_range قابلاً للتمثيل ضمن قيم من النوع T.

  

  const int min_T = std::numeric_limits::min();
  const int max_T = std::numeric_limits::max();
  const float max_float = std::numeric_limits::max();

  const float scale_factor_from_min_side =
      (min_T * min_range > 0) ? min_T / min_range : max_float;
  const float scale_factor_from_max_side =
      (max_T * max_range > 0) ? max_T / max_range : max_float;

  const float scale_factor = std::min(scale_factor_from_min_side,
                                      scale_factor_from_max_side);

ثم نستخدم عامل المقياس لضبط الحد الأدنى والحد الأقصى للنطاق على النحو التالي:

      min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

على سبيل المثال، إذا كانت T = qint8، وكانت قيمة min_range الابتدائية تساوي -10، وقيمة max_range تساوي 9، فسنقارن -128/-10.0 = 12.8 مع 127/9.0 = 14.11، ونضبط scaling_factor = 12.8. في هذه الحالة، ستبقى قيمة min_range عند -10، ولكن سيتم تعديل قيمة max_range إلى 127 / 12.8 = 9.921875.

لذلك سنقوم بتحديد قيم الإدخال في النطاق (-10، 9.921875) إلى (-128، 127).

يمكن الآن تكميم موتر الإدخال عن طريق قص القيم إلى النطاق min_range إلى max_range ، ثم ضربها بمعامل المقياس كما يلي:

result = round(min(max_range, max(min_range, input)) * scale_factor)

يتم إرجاع قيمتي min_range و max_range المعدلتين كمخرجين 2 و 3 لهذه العملية. يجب استخدام هذين المخرجين كنطاق لأي حسابات لاحقة.

السمة narrow_range (منطقية)

إذا كان هذا صحيحًا، فلن نستخدم القيمة المُكمّمة الدنيا. أي بالنسبة لـ int8، سيقتصر الناتج المُكمّم على النطاق من -127 إلى 127 بدلًا من النطاق الكامل من -128 إلى 127. هذا مُتاح للتوافق مع بعض واجهات الاستدلال الخلفية. (ينطبق فقط على وضع SCALED)

سمة المحور (عدد صحيح)

يمكن لخاصية axis الاختيارية تحديد فهرس بُعد لموتر الإدخال، بحيث يتم حساب نطاقات التكميم وتطبيقها بشكل منفصل لكل شريحة من الموتر على طول ذلك البُعد. وهذا مفيد للتكميم لكل قناة.

إذا تم تحديد المحور، فسيتم تحديد الحد الأدنى للنطاق والحد الأقصى للنطاق

إذا كان axis = لا شيء، فسيتم إجراء التكميم لكل موتر كالمعتاد.

خاصية ensure_minimum_range (float)

يضمن هذا الخيار أن يكون الحد الأدنى لنطاق التكميم على الأقل بهذه القيمة. القيمة الافتراضية القديمة هي 0.01، ولكن يُنصح بشدة بتعيينها إلى 0 للاستخدامات الجديدة.

الحجج:

  • النطاق: كائن النطاق
  • min_range: القيمة الدنيا لنطاق التكميم. يمكن تعديل هذه القيمة بواسطة المُشغِّل بناءً على معايير أخرى. تُكتب القيمة المُعدَّلة في output_min . إذا تم تحديد سمة axis ، فيجب أن يكون هذا موترًا أحادي البُعد يتطابق حجمه مع بُعد axis لموتري الإدخال والإخراج.
  • max_range: القيمة القصوى لنطاق التكميم. يمكن تعديل هذه القيمة بواسطة المُشغِّل بناءً على معلمات أخرى. تُكتب القيمة المُعدَّلة في output_max . إذا تم تحديد سمة axis ، فيجب أن يكون هذا موترًا أحادي البُعد يتطابق حجمه مع بُعد axis لموتري الإدخال والإخراج.

المرتجعات:

  • الناتج Output : البيانات الكمية الناتجة من المدخلات ذات العدد العشري.
  • القيمة الدنيا Output (output_min): هي الحد الأدنى لنطاق التكميم النهائي، وتُستخدم لقص قيم الإدخال قبل تغيير مقياسها وتقريبها إلى قيم مُكمّمة. إذا تم تحديد سمة axis ، فسيكون هذا موترًا أحادي البعد يتطابق حجمه مع بُعد axis لموترات الإدخال والإخراج.
  • القيمة القصوى Output (output_max): هي الحد الأقصى لنطاق التكميم النهائي، وتُستخدم لقص قيم الإدخال قبل تغيير مقياسها وتقريبها إلى قيم مُكمّمة. إذا تم تحديد سمة axis ، فسيكون هذا موترًا أحادي البعد يتطابق حجمه مع بُعد axis لموترات الإدخال والإخراج.

البناة والمدمرون

QuantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input min_range, :: tensorflow::Input max_range, DataType T)
QuantizeV2 (const :: tensorflow::Scope & scope, :: tensorflow::Input input, :: tensorflow::Input min_range, :: tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs)

السمات العامة

operation
output
output_max
output_min

الدوال الثابتة العامة

Axis (int64 x)
EnsureMinimumRange (float x)
Mode (StringPiece x)
NarrowRange (bool x)
RoundMode (StringPiece x)

الهياكل

tensorflow:: ops:: QuantizeV2:: Attrs

أدوات تعيين السمات الاختيارية لـ QuantizeV2 .

السمات العامة

عملية

Operation operation

المخرجات

::tensorflow::Output output

output_max

::tensorflow::Output output_max

output_min

::tensorflow::Output output_min

الوظائف العامة

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T,
  const QuantizeV2::Attrs & attrs
)

الدوال الثابتة العامة

محور

Attrs Axis(
  int64 x
)

ضمان الحد الأدنى للنطاق

Attrs EnsureMinimumRange(
  float x
)

وضع

Attrs Mode(
  StringPiece x
)

نطاق ضيق

Attrs NarrowRange(
  bool x
)

وضع الجولة

Attrs RoundMode(
  StringPiece x
)