tensorflow:: عملیات:: کوانتیزه کردن V2

#include <array_ops.h>

تانسور «ورودی» از نوع اعشاری را به تانسور «خروجی» از نوع «T» کوانتیزه کنید.

خلاصه

[min_range، max_range] اعشاری‌های اسکالر هستند که محدوده داده‌های «ورودی» را مشخص می‌کنند. ویژگی «mode» دقیقاً محاسباتی را که برای تبدیل مقادیر اعشاری به معادل‌های کوانتیزه شده آنها استفاده می‌شود، کنترل می‌کند. ویژگی «round_mode» الگوریتم گرد کردن tie-breaking را هنگام گرد کردن مقادیر اعشاری به معادل‌های کوانتیزه شده آنها کنترل می‌کند.

در حالت '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 مشخص شوند. کوانتیزه کردن از اعشاری به quint8، هر مقدار ورودی را در 255/6 ضرب می‌کند و به quint8 تبدیل می‌کند.

اگر نوع خروجی qint8 ([-128, 127]) باشد، عملیات قبل از تبدیل، هر مقدار را به میزان ۱۲۸ کم می‌کند، به طوری که محدوده مقادیر با محدوده 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 باشد، از کل محدوده نوع خروجی استفاده نمی‌کنیم و کمترین مقدار ممکن برای تقارن را حذف می‌کنیم (مثلاً محدوده خروجی -۱۲۷ تا ۱۲۷ است، نه -۱۲۸ تا ۱۲۷ برای کوانتیزاسیون ۸ بیتی علامت‌دار)، به طوری که ۰.۰ به ۰ نگاشت می‌شود.

ابتدا محدوده مقادیر در تانسور خود را پیدا می‌کنیم. محدوده‌ای که استفاده می‌کنیم همیشه روی ۰ متمرکز است، بنابراین m را طوری پیدا می‌کنیم که

  m = max(abs(input_min), abs(input_max))

بنابراین، محدوده تانسور ورودی ما [-m, m] است.

در مرحله بعد، سطل‌های کوانتیزاسیون نقطه ثابت خود، [min_fixed, max_fixed] را انتخاب می‌کنیم. اگر T علامت‌دار باشد، این است

  num_bits = sizeof(T) * 8
  [min_fixed, max_fixed] =
      [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]

در غیر این صورت، اگر T بدون علامت باشد، برد نقطه ثابت برابر است با:

  [min_fixed, max_fixed] = [0, (1 << num_bits) - 1]

از این رو ضریب مقیاس‌بندی، s، را محاسبه می‌کنیم:

  s = (max_fixed - min_fixed) / (2 * m)

اکنون می‌توانیم عناصر تانسور خود را کوانتیزه کنیم:

result = round(input * s)

نکته‌ای که باید مراقب آن باشید این است که اپراتور ممکن است در طول فرآیند کوانتیزاسیون، مقادیر حداقل و حداکثر درخواستی را کمی تنظیم کند، بنابراین شما همیشه باید از پورت‌های خروجی به عنوان محدوده محاسبات بیشتر استفاده کنید. به عنوان مثال، اگر مقادیر حداقل و حداکثر درخواستی نزدیک به برابر باشند، آنها با یک مقدار اپسیلون کوچک از هم جدا می‌شوند تا از ایجاد بافرهای کوانتیزه شده بدشکل جلوگیری شود. در غیر این صورت، ممکن است با بافرهایی مواجه شوید که در آنها تمام مقادیر کوانتیزه شده به یک مقدار اعشاری یکسان نگاشت می‌شوند، که باعث ایجاد مشکل برای عملیاتی می‌شود که باید محاسبات بیشتری روی آنها انجام دهند.

استدلال‌ها:

  • دامنه: یک شیء دامنه
  • min_range: حداقل مقدار اسکالر که ممکن است برای ورودی تولید شود.
  • max_range: حداکثر مقدار اسکالر ممکن برای ورودی تولید می‌شود.

بازده:

  • Output : داده‌های کوانتیزه شده تولید شده از ورودی اعشاری.
  • Output output_min: حداقل مقدار اسکالر واقعی مورد استفاده برای خروجی.
  • Output output_max: حداکثر مقدار اسکالر واقعی مورد استفاده برای خروجی.

سازنده‌ها و مخرب‌ها

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

توابع استاتیک عمومی

Mode (StringPiece x)
RoundMode (StringPiece x)

ساختارها

tensorflow:: عملیات:: QuantizeV2:: جذابیت‌ها

تنظیم‌کننده‌های ویژگی اختیاری برای QuantizeV2 .

ویژگی‌های عمومی

عملیات

Operation operation

خروجی

::tensorflow::Output output

خروجی_حداکثر

::tensorflow::Output output_max

خروجی_دقیقه

::tensorflow::Output output_min

کارکردهای عمومی

کوانتیزهV2

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

کوانتیزهV2

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

توابع استاتیک عمومی

حالت

Attrs Mode(
  StringPiece x
)

حالت گرد

Attrs RoundMode(
  StringPiece x
)