เทนเซอร์โฟลว์:: ปฏิบัติการ:: ควอนไทซ์V2

#include <array_ops.h>

หาปริมาณเทนเซอร์ 'อินพุต' ประเภทลอยเป็นเทนเซอร์ 'เอาท์พุต' ประเภท 'T'

สรุป

[min_range, max_range] เป็นสเกลาร์โฟลตที่ระบุช่วงสำหรับข้อมูล 'อินพุต' แอตทริบิวต์ 'โหมด' ควบคุมได้อย่างแม่นยำว่าการคำนวณใดใช้ในการแปลงค่าทศนิยมให้เทียบเท่ากับปริมาณ แอตทริบิวต์ '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() 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 เราจะไม่ใช้ช่วงเต็มรูปแบบของประเภทเอาต์พุต โดยเลือกที่จะลบค่าสมมาตรที่ต่ำที่สุดที่เป็นไปได้ (เช่น ช่วงเอาต์พุตคือ -127 ถึง 127 ไม่ใช่ -128 ถึง 127 สำหรับการหาปริมาณ 8 บิตที่ลงนาม) ดังนั้น 0.0 จะแมปกับ 0

ก่อนอื่นเราจะค้นหาช่วงของค่าในเมตริกซ์ของเรา ช่วงที่เราใช้จะเน้นที่ 0 เสมอ ดังนั้นเราจึงพบ 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 = (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)

โครงสร้าง

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

ตัวตั้งค่าคุณลักษณะเสริมสำหรับ 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
)