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)

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

org.tensorflow.op.RawOp
บูลีนสุดท้าย
เท่ากับ (วัตถุ obj)
int สุดท้าย
การดำเนินการ
สหกรณ์ ()
ส่งกลับหน่วยการคำนวณนี้เป็นการ Operation เดียว
สตริงสุดท้าย
บูลีน
เท่ากับ (วัตถุ arg0)
คลาสสุดท้าย<?>
รับคลาส ()
ภายใน
แฮชโค้ด ()
โมฆะสุดท้าย
แจ้ง ()
โมฆะสุดท้าย
แจ้งทั้งหมด ()
สตริง
toString ()
โมฆะสุดท้าย
รอสักครู่ (ยาว arg0, int arg1)
โมฆะสุดท้าย
รอ (ยาว arg0)
โมฆะสุดท้าย
รอ ()
org.tensorflow.op.Op
บทคัดย่อ ExecutionEnvironment
สิ่งแวดล้อม ()
ส่งคืนสภาพแวดล้อมการดำเนินการที่ op นี้ถูกสร้างขึ้น
การดำเนินการ ที่เป็นนามธรรม
สหกรณ์ ()
ส่งกลับหน่วยการคำนวณนี้เป็นการ Operation เดียว

ค่าคงที่

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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