Quantize

Quantize คลาสสุดท้ายสาธารณะ

หาปริมาณเทนเซอร์ 'อินพุต' ประเภทลอยเป็นเทนเซอร์ 'เอาท์พุต' ประเภท '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() - ตัวเลข_ขีดจำกัด ::นาที()`

ตัวอย่างโหมด 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<T>::min()
 quantized = max(quantized, numeric_limits<T>::min())
 quantized = min(quantized, numeric_limits<T>::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<T>::min();
   const int max_T = std::numeric_limits<T>::max();
   const float max_float = std::numeric_limits<float>::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)
 
`ช่วงต่ำสุด` และ `ช่วงสูงสุด` ที่ปรับแล้วจะถูกส่งกลับเป็นเอาต์พุต 2 และ 3 ของการดำเนินการนี้ ควรใช้เอาต์พุตเหล่านี้เป็นช่วงสำหรับการคำนวณเพิ่มเติม

แอตทริบิวต์ช่วงแคบ (บูล)

หากเป็นจริง เราจะไม่ใช้ค่าเชิงปริมาณขั้นต่ำ เช่น สำหรับ int8 เอาต์พุตเชิงปริมาณ มันจะถูกจำกัดไว้ที่ช่วง -127..127 แทนที่จะเป็นช่วง -128..127 เต็ม มีไว้เพื่อให้เข้ากันได้กับแบ็กเอนด์การอนุมานบางอย่าง (ใช้กับโหมด SCALED เท่านั้น)

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

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

หากระบุแกน ให้ใช้ min_range และ max_range

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

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

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

คลาสที่ซ้อนกัน

ระดับ Quantize ตัวเลือก แอ็ตทริบิวต์ทางเลือกสำหรับ Quantize

ค่าคงที่

สตริง OP_NAME ชื่อของ op นี้ ซึ่งรู้จักกันในชื่อของเอ็นจิ้นหลัก TensorFlow

วิธีการสาธารณะ

Quantize.Options แบบคงที่
แกน (แกนยาว)
คงที่ <T ขยาย TType > ปริมาณ <T>
สร้าง (ขอบเขต ขอบเขต , ตัวดำเนินการ < TFloat32 > อินพุต, ตัวดำเนินการ < TFloat32 > minRange, ตัวดำเนินการ < TFloat32 > maxRange, Class<T> T, ตัวเลือก... ตัวเลือก)
วิธีการจากโรงงานเพื่อสร้างคลาสที่รวมการดำเนินการ Quantize ใหม่
Quantize.Options แบบคงที่
ให้แน่ใจว่าขั้นต่ำช่วง (ลอยให้แน่ใจว่าขั้นต่ำช่วง)
Quantize.Options แบบคงที่
โหมด (โหมดสตริง)
Quantize.Options แบบคงที่
แคบช่วง (บูลีน แคบช่วง)
เอาท์พุต <T>
เอาท์พุท ()
ข้อมูลเชิงปริมาณที่ผลิตจากอินพุตโฟลต
เอาท์พุต < TFloat32 >
เอาท์พุทสูงสุด ()
ช่วงการหาปริมาณสูงสุดสุดท้าย ใช้เพื่อตัดค่าอินพุตก่อนที่จะปรับขนาดและปัดเศษให้เป็นค่าเชิงปริมาณ
เอาท์พุต < TFloat32 >
เอาท์พุทขั้นต่ำ ()
ช่วงต่ำสุดของช่วงการหาปริมาณสุดท้าย ใช้เพื่อตัดค่าอินพุตก่อนที่จะปรับขนาดและปัดเศษให้เป็นค่าเชิงปริมาณ
Quantize.Options แบบคงที่
RoundMode (สตริง RoundMode)

วิธีการสืบทอด

ค่าคงที่

สตริงสุดท้ายแบบคงที่สาธารณะ OP_NAME

ชื่อของ op นี้ ซึ่งรู้จักกันในชื่อของเอ็นจิ้นหลัก TensorFlow

ค่าคงที่: "QuantizeV2"

วิธีการสาธารณะ

แกน Quantize.Options แบบคงที่สาธารณะ (แกนยาว)

การสร้าง Quantize <T> แบบคงที่สาธารณะ (ขอบเขต ขอบเขต , ตัวดำเนินการ < TFloat32 > อินพุต, ตัวดำเนินการ < TFloat32 > minRange, ตัวดำเนินการ < TFloat32 > maxRange, คลาส <T> T, ตัวเลือก... ตัวเลือก)

วิธีการจากโรงงานเพื่อสร้างคลาสที่รวมการดำเนินการ Quantize ใหม่

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

Quantize สาธารณะแบบคง ที่ ตัวเลือกมั่นใจ MinimumRange (ลอยมั่นใจ MinimumRange)

โหมด Quantize.Options สาธารณะแบบคงที่ (โหมด String)

สาธารณะ Quantize.Options คง ที่แคบช่วง (บูลีนแคบช่วง)

เอาท์พุท สาธารณะ <T> เอาท์พุท ()

ข้อมูลเชิงปริมาณที่ผลิตจากอินพุตโฟลต

เอาท์พุท สาธารณะ < TFloat32 > outputMax ()

ช่วงการหาปริมาณสูงสุดสุดท้าย ใช้เพื่อตัดค่าอินพุตก่อนที่จะปรับขนาดและปัดเศษให้เป็นค่าเชิงปริมาณ หากระบุแอตทริบิวต์ `แกน` นี่จะเป็นเทนเซอร์ 1-D ซึ่งมีขนาดตรงกับขนาด 'แกน' ของเทนเซอร์อินพุตและเอาท์พุต

เอาท์พุท สาธารณะ < TFloat32 > เอาท์พุทขั้นต่ำ ()

ช่วงต่ำสุดของช่วงการหาปริมาณสุดท้าย ใช้เพื่อตัดค่าอินพุตก่อนที่จะปรับขนาดและปัดเศษให้เป็นค่าเชิงปริมาณ หากระบุแอตทริบิวต์ `แกน` นี่จะเป็นเทนเซอร์ 1-D ซึ่งมีขนาดตรงกับมิติ `แกน` ของเทนเซอร์อินพุตและเอาท์พุต

Quantize.Options แบบคงที่สาธารณะ RoundMode (String RoundMode)