Quantize

kelas akhir publik Kuantisasi

Hitung tensor 'input' bertipe float ke tensor 'output' bertipe 'T'.

[min_range, max_range] adalah pelampung skalar yang menentukan rentang untuk data 'input'. Atribut 'mode' mengontrol penghitungan mana yang digunakan untuk mengonversi nilai float ke nilai terkuantisasinya. Atribut 'round_mode' mengontrol algoritme pemutusan ikatan pembulatan mana yang digunakan saat membulatkan nilai float ke nilai terkuantisasinya.

Dalam mode 'MIN_COMBINED', setiap nilai tensor akan mengalami hal berikut:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
 if T == qint8: out[i] -= (range(T) + 1) / 2.0
 
di sini `rentang(T) = batas_numerik ::maks() - batas_numerik ::menit()`

Contoh Mode MIN_COMBINED

Asumsikan inputnya bertipe float dan memiliki kemungkinan rentang [0.0, 6.0] dan tipe outputnya adalah quint8 ([0, 255]). Nilai min_range dan max_range harus ditentukan sebagai 0,0 dan 6,0. Menghitung dari float ke quint8 akan mengalikan setiap nilai input dengan 255/6 dan dilemparkan ke quint8.

Jika tipe keluarannya adalah qint8 ([-128, 127]), operasi juga akan mengurangi setiap nilai sebesar 128 sebelum transmisi, sehingga rentang nilai sejajar dengan rentang qint8.

Jika modenya adalah 'MIN_FIRST', maka pendekatan ini digunakan:

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())
 
Perbedaan terbesar antara ini dan MIN_COMBINED adalah rentang minimum dibulatkan terlebih dahulu, sebelum dikurangi dari nilai yang dibulatkan. Dengan MIN_COMBINED, bias kecil muncul ketika pengulangan kuantisasi dan dekuantisasi berulang kali akan menghasilkan kesalahan yang semakin besar.

Contoh mode SKALA

Mode `SCALED` cocok dengan pendekatan kuantisasi yang digunakan dalam `QuantizeAndDequantize{V2|V3}`.

Jika modenya adalah `SCALED`, kuantisasi dilakukan dengan mengalikan setiap nilai input dengan scaling_factor. Faktor_penskalaan ditentukan dari `min_range` dan `max_range` menjadi sebesar mungkin sehingga rentang dari `min_range` hingga `max_range` dapat diwakili dalam nilai tipe 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);
 
Kami selanjutnya menggunakan scale_factor untuk menyesuaikan min_range dan max_range sebagai berikut:
min_range = min_T / scale_factor;
       max_range = max_T / scale_factor;
 
misalnya jika T = qint8, dan awalnya min_range = -10, dan max_range = 9, kita akan membandingkan -128/-10.0 = 12.8 dengan 127/9.0 = 14.11, dan menetapkan scaling_factor = 12.8 Dalam hal ini, min_range akan tetap -10, tapi max_range akan disesuaikan menjadi 127 / 12.8 = 9.921875

Jadi kita akan mengkuantisasi nilai input dalam rentang (-10, 9,921875) hingga (-128, 127).

Tensor masukan kini dapat dikuantisasi dengan memotong nilai ke rentang `min_range` hingga `max_range`, lalu mengalikannya dengan scale_factor sebagai berikut:

result = round(min(max_range, max(min_range, input)) * scale_factor)
 
`min_range` dan `max_range` yang disesuaikan dikembalikan sebagai output 2 dan 3 dari operasi ini. Keluaran ini harus digunakan sebagai kisaran untuk penghitungan lebih lanjut.

atribut rentang_sempit (bool).

Jika benar, kami tidak menggunakan nilai terkuantisasi minimum. yaitu untuk int8 keluaran terkuantisasi, itu akan dibatasi pada kisaran -127..127 bukannya kisaran -128..127 penuh. Ini disediakan untuk kompatibilitas dengan backend inferensi tertentu. (Hanya berlaku untuk mode SCALED)

atribut sumbu (int).

Atribut `sumbu` opsional dapat menentukan indeks dimensi tensor masukan, sehingga rentang kuantisasi akan dihitung dan diterapkan secara terpisah untuk setiap potongan tensor sepanjang dimensi tersebut. Ini berguna untuk kuantisasi per saluran.

Jika sumbu ditentukan, min_range dan max_range

jika `axis`=Tidak ada, kuantisasi per-tensor dilakukan seperti biasa.

atribut sure_minimum_range (float).

Memastikan rentang kuantisasi minimum setidaknya bernilai ini. Nilai default lama untuk ini adalah 0,01, namun sangat disarankan untuk menyetelnya ke 0 untuk penggunaan baru.

Kelas Bersarang

kelas Kuantisasi.Opsi Atribut opsional untuk Quantize

Konstanta

Rangkaian OP_NAME Nama operasi ini dikenal dengan mesin inti TensorFlow

Metode Publik

Quantize.Options statis
sumbu (Sumbu panjang)
statis <T extends TType > Kuantisasi <T>
buat ( Lingkup lingkup , Operan < TFloat32 > masukan, Operan < TFloat32 > minRange, Operan < TFloat32 > maxRange, Kelas<T> T, Opsi... opsi)
Metode pabrik untuk membuat kelas yang membungkus operasi Quantize baru.
Quantize.Options statis
pastikanMinimumRange (Float pastikanMinimumRange)
Quantize.Options statis
mode (mode string)
Quantize.Options statis
rentang sempit (rentang sempit Boolean)
Keluaran <T>
keluaran ()
Data terkuantisasi dihasilkan dari input float.
Keluaran < TFloat32 >
keluaran Maks ()
Rentang kuantisasi akhir maksimum, digunakan untuk memotong nilai masukan sebelum menskalakan dan membulatkannya ke nilai terkuantisasi.
Keluaran < TFloat32 >
keluaranMin ()
Rentang kuantisasi minimum akhir, digunakan untuk memotong nilai masukan sebelum menskalakan dan membulatkannya ke nilai terkuantisasi.
Quantize.Options statis
roundMode (String putaranMode)

Metode Warisan

Konstanta

String akhir statis publik OP_NAME

Nama operasi ini dikenal dengan mesin inti TensorFlow

Nilai Konstan: "QuantizeV2"

Metode Publik

Sumbu Quantize.Options statis publik (Sumbu panjang)

public static Quantize <T> buat ( Lingkup lingkup , Operan < TFloat32 > masukan, Operan < TFloat32 > minRange, Operan < TFloat32 > maxRange, Kelas<T> T, Opsi... pilihan)

Metode pabrik untuk membuat kelas yang membungkus operasi Quantize baru.

Parameter
cakupan ruang lingkup saat ini
rentang minimum Nilai minimum rentang kuantisasi. Nilai ini dapat disesuaikan oleh operasi tergantung pada parameter lainnya. Nilai yang disesuaikan ditulis ke `output_min`. Jika atribut `axis` ditentukan, ini harus berupa tensor 1-D yang ukurannya cocok dengan dimensi `axis` dari tensor input dan output.
rentang maksimal Nilai maksimum rentang kuantisasi. Nilai ini dapat disesuaikan oleh operasi tergantung pada parameter lainnya. Nilai yang disesuaikan ditulis ke `output_max`. Jika atribut `axis` ditentukan, ini harus berupa tensor 1-D yang ukurannya cocok dengan dimensi `axis` dari tensor input dan output.
pilihan membawa nilai atribut opsional
Kembali
  • contoh baru Quantize

Kuantisasi statis publik.Opsi pastikanMinimumRange (Float pastikanMinimumRange)

Mode Quantize.Options statis publik (mode String)

Quantize.Options NarrowRange statis publik (Boolean NarrowRange)

Keluaran publik <T> keluaran ()

Data terkuantisasi dihasilkan dari input float.

Keluaran publik < TFloat32 > keluaran Maks ()

Rentang kuantisasi akhir maksimum, digunakan untuk memotong nilai masukan sebelum menskalakan dan membulatkannya ke nilai terkuantisasi. Jika atribut `axis` ditentukan, ini akan menjadi tensor 1-D yang ukurannya cocok dengan dimensi `axis` dari tensor input dan output.

Keluaran publik < TFloat32 > keluaranMin ()

Rentang kuantisasi minimum akhir, digunakan untuk memotong nilai masukan sebelum menskalakan dan membulatkannya ke nilai terkuantisasi. Jika atribut `axis` ditentukan, ini akan menjadi tensor 1-D yang ukurannya cocok dengan dimensi `axis` dari tensor input dan output.

Quantize.Options roundMode statis publik (String roundMode)