tensorflow::ops::QuantizeV2
#include <array_ops.h>Kuantisasi tensor 'input' bertipe float menjadi tensor 'output' bertipe 'T'.
Ringkasan
[min_range, max_range] adalah bilangan float skalar yang menentukan rentang untuk data 'input'. Atribut 'mode' mengontrol perhitungan mana yang digunakan untuk mengkonversi nilai float ke nilai kuantisasi yang setara. Atribut 'round_mode' mengontrol algoritma pembulatan mana yang digunakan saat membulatkan nilai float ke nilai kuantisasi yang setara.
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 range(T) = numeric_limits
Contoh Mode MIN_COMBINED
Misalkan input bertipe float dan memiliki rentang nilai [0.0, 6.0] dan tipe output adalah quint8 ([0, 255]). Nilai min_range dan max_range harus ditentukan sebagai 0.0 dan 6.0. Kuantisasi dari float ke quint8 akan mengalikan setiap nilai input dengan 255/6 dan mengubahnya menjadi quint8.
Jika tipe outputnya adalah qint8 ([-128, 127]), operasi ini juga akan mengurangi setiap nilai dengan 128 sebelum melakukan konversi tipe, sehingga rentang nilai sesuai dengan rentang qint8.
Jika mode yang dipilih adalah 'MIN_FIRST', maka pendekatan berikut 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::min() quantized = max(quantized, numeric_limits ::min()) quantized = min(quantized, numeric_limits ::max())
Perbedaan terbesar antara ini dan MIN_COMBINED adalah bahwa rentang minimum dibulatkan terlebih dahulu, sebelum dikurangi dari nilai yang dibulatkan. Dengan MIN_COMBINED, bias kecil diperkenalkan di mana iterasi berulang dari kuantisasi dan dekuantisasi akan memperkenalkan kesalahan yang semakin besar.
Contoh mode SKALA
Mode SCALED sesuai dengan pendekatan kuantisasi yang digunakan dalam QuantizeAndDequantize{V2|V3} .
Jika modenya adalah SCALED , kuantisasi dilakukan dengan mengalikan setiap nilai input dengan scaling_factor. scaling_factor ditentukan dari min_range dan max_range agar sebesar mungkin sehingga rentang dari min_range ke max_range dapat direpresentasikan dalam nilai tipe T.
const int min_T = std::numeric_limits::min(); const int max_T = std::numeric_limits ::max(); const float max_float = std::numeric_limits ::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);
Selanjutnya, kita 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, tetapi 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 input sekarang dapat dikuantisasi dengan memotong nilai ke rentang min_range hingga max_range , kemudian dikalikan dengan scale_factor sebagai berikut:
result = round(min(max_range, max(min_range, input)) * scale_factor)
Nilai min_range dan max_range yang telah disesuaikan dikembalikan sebagai output 2 dan 3 dari operasi ini. Output ini harus digunakan sebagai rentang untuk perhitungan selanjutnya.
atribut rentang_sempit (bool)
Jika benar, kami tidak menggunakan nilai kuantisasi minimum. Misalnya, untuk int8, output yang dikuantisasi akan dibatasi pada rentang -127..127, bukan rentang penuh -128..127. Ini disediakan untuk kompatibilitas dengan backend inferensi tertentu. (Hanya berlaku untuk mode SCALED)
atribut sumbu (int)
Atribut axis opsional dapat menentukan indeks dimensi tensor input, sehingga rentang kuantisasi akan dihitung dan diterapkan secara terpisah untuk setiap irisan tensor di sepanjang dimensi tersebut. Ini berguna untuk kuantisasi per-saluran.
Jika axis ditentukan, min_range dan max_range
Jika axis = None, kuantisasi per-tensor dilakukan seperti biasa.
atribut ensure_minimum_range (float)
Memastikan rentang kuantisasi minimum setidaknya bernilai ini. Nilai default lama untuk ini adalah 0,01, tetapi sangat disarankan untuk mengaturnya ke 0 untuk penggunaan baru.
Argumen:
- Cakupan: Objek Cakupan
- min_range: Nilai minimum dari rentang kuantisasi. Nilai ini dapat disesuaikan oleh operasi tergantung pada parameter lain. Nilai yang disesuaikan ditulis ke
output_min. Jika atributaxisditentukan, ini harus berupa tensor 1-D yang ukurannya sesuai dengan dimensiaxistensor input dan output. - max_range: Nilai maksimum rentang kuantisasi. Nilai ini dapat disesuaikan oleh operasi tergantung pada parameter lain. Nilai yang disesuaikan ditulis ke
output_max. Jika atributaxisditentukan, ini harus berupa tensor 1-D yang ukurannya sesuai dengan dimensiaxistensor input dan output.
Mengembalikan:
-
Output: Data terkuantisasi yang dihasilkan dari input float. -
Outputoutput_min: Nilai minimum rentang kuantisasi akhir, digunakan untuk memotong nilai input sebelum penskalaan dan pembulatan ke nilai terkuantisasi. Jika atributaxisditentukan, ini akan berupa tensor 1-D yang ukurannya sesuai dengan dimensiaxistensor input dan output. -
Output: Rentang kuantisasi maksimum akhir, digunakan untuk memotong nilai input sebelum penskalaan dan pembulatan ke nilai terkuantisasi. Jika atributaxisditentukan, ini akan berupa tensor 1-D yang ukurannya sesuai dengan dimensiaxistensor input dan output.
Konstruktor dan Destruktor | |
|---|---|
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) |
Atribut publik | |
|---|---|
operation | |
output | |
output_max | |
output_min | |
Fungsi statis publik | |
|---|---|
Axis (int64 x) | |
EnsureMinimumRange (float x) | |
Mode (StringPiece x) | |
NarrowRange (bool x) | |
RoundMode (StringPiece x) | |
Struktur | |
|---|---|
| tensorflow::ops::QuantizeV2::Attrs | Pengaturan atribut opsional untuk QuantizeV2 . |
Atribut publik
operasi
Operation operation
keluaran
::tensorflow::Output output
output_maksimum
::tensorflow::Output output_max
output_min
::tensorflow::Output output_min
Fungsi publik
Kuantisasi V2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T )
Kuantisasi V2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T, const QuantizeV2::Attrs & attrs )
Fungsi statis publik
Sumbu
Attrs Axis( int64 x )
PastikanRentangMinimum
Attrs EnsureMinimumRange( float x )
Mode
Attrs Mode( StringPiece x )
Jangkauan Sempit
Attrs NarrowRange( bool x )
Mode Putaran
Attrs RoundMode( StringPiece x )