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_numerikContoh 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.921875Jadi 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> | |
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 akhir minimum, 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
Metode Publik
public static Quantize <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.
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
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 akhir minimum, 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.