เทนเซอร์โฟลว์ :: ops :: QuantizeV2

#include <array_ops.h>

หาค่าเทนเซอร์ชนิด 'อินพุต' ลอยเป็น 'เอาต์พุต' เทนเซอร์ประเภท 'T'

สรุป

[min_range, max_range] คือสเกลาร์ลอยที่ระบุช่วงสำหรับข้อมูล "อินพุต" แอตทริบิวต์ "mode" จะควบคุมว่าการคำนวณใดที่ใช้ในการแปลงค่า float เป็นค่าเทียบเท่าเชิงปริมาณ แอตทริบิวต์ "round_mode" จะควบคุมอัลกอริธึมการแบ่งการผูกแบบปัดเศษที่ใช้เมื่อปัดเศษค่า float เป็นค่าเทียบเท่าเชิงปริมาณ

ในโหมด "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() range(T) = numeric_limits ::max() - numeric_limits ::min() 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

โหมด SCALED ตรงกับวิธีการหาปริมาณที่ใช้ใน QuantizeAndDequantize{V2|V3}

ถ้าโหมดเป็น SCALED การหาปริมาณจะดำเนินการโดยการคูณค่าอินพุตแต่ละค่าด้วย scaling_factor 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);

ต่อไปเราจะใช้ scale_factor เพื่อปรับ min_range และ max_range ดังต่อไปนี้:

      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 จากนั้นคูณด้วย scale_factor ดังนี้:

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 เท่านั้น)

แกน (int) แอตทริบิวต์

แอ็ตทริบิวต์ axis เป็นทางเลือกสามารถระบุดัชนีมิติของเทนเซอร์อินพุตซึ่งจะคำนวณและใช้ช่วงการหาปริมาณแยกกันสำหรับแต่ละชิ้นส่วนของเทนเซอร์ตามมิตินั้น สิ่งนี้มีประโยชน์สำหรับการหาปริมาณต่อช่องสัญญาณ

ถ้ามีการระบุแกน min_range และ max_range

ถ้า axis = ไม่มีการหาปริมาณต่อเทนเซอร์จะดำเนินการตามปกติ

sure_minimum_range (float) แอตทริบิวต์

ตรวจสอบให้แน่ใจว่าช่วงการหาปริมาณขั้นต่ำคือค่านี้เป็นอย่างน้อย ค่าเริ่มต้นเดิมคือ 0.01 แต่ขอแนะนำอย่างยิ่งให้ตั้งค่าเป็น 0 สำหรับการใช้งานใหม่

อาร์กิวเมนต์:

  • ขอบเขต: วัตถุ ขอบเขต
  • min_range: ค่าต่ำสุดของช่วงการหาปริมาณ ค่านี้อาจปรับได้โดย op ขึ้นอยู่กับพารามิเตอร์อื่น ๆ ค่าที่ปรับแล้วถูกเขียนลงใน output_min หากระบุแอ็ตทริบิวต์ axis ต้องเป็นเทนเซอร์ 1-D ที่มีขนาดตรงกับมิติ axis ของเทนเซอร์อินพุตและเอาต์พุต
  • max_range: ค่าสูงสุดของช่วงการหาปริมาณ ค่านี้อาจปรับได้โดย op ขึ้นอยู่กับพารามิเตอร์อื่น ๆ ค่าที่ปรับแล้วถูกเขียนลงใน output_max หากระบุแอ็ตทริบิวต์ axis ต้องเป็นเทนเซอร์ 1-D ที่มีขนาดตรงกับมิติ axis ของเทนเซอร์อินพุตและเอาต์พุต

ผลตอบแทน:

  • Output ท: ข้อมูลเชิงปริมาณที่ผลิตจากอินพุตลอย
  • Output output_min: ค่าต่ำสุดของช่วงการหาปริมาณขั้นสุดท้ายที่ใช้ในการตัดค่าอินพุตก่อนที่จะปรับขนาดและปัดเศษให้เป็นค่าเชิงปริมาณ หากระบุแอ็ตทริบิวต์ axis นี่จะเป็นเทนเซอร์ 1 มิติที่มีขนาดตรงกับมิติ axis ของเทนเซอร์อินพุตและเอาท์พุต
  • Output output_max: ค่าสูงสุดของช่วง quantization สุดท้ายที่ใช้เพื่อตัดค่าอินพุตก่อนที่จะปรับขนาดและปัดเศษให้เป็นค่าเชิงปริมาณ หากระบุแอ็ตทริบิวต์ axis นี่จะเป็นเทนเซอร์ 1 มิติที่มีขนาดตรงกับมิติ 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
)

SureMinimumRange

Attrs EnsureMinimumRange(
  float x
)

โหมด

Attrs Mode(
  StringPiece x
)

ช่วงแคบ ๆ

Attrs NarrowRange(
  bool x
)

RoundMode

Attrs RoundMode(
  StringPiece x
)