aliran tensor:: operasi:: KuantisasiV2
#include <array_ops.h>
Hitung tensor 'input' bertipe float ke tensor 'output' bertipe 'T'.
Ringkasan
[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 range(T) = numeric_limits ::max() - numeric_limits ::min()
range(T) = numeric_limits ::max() - numeric_limits ::min()
range(T) = numeric_limits ::max() - numeric_limits ::min()
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::min() quantized = max(quantized, numeric_limits ::min()) quantized = min(quantized, numeric_limits ::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::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);
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 axis
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
=None, 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.
Argumen:
- ruang lingkup: Objek Lingkup
- min_range: Nilai minimum rentang kuantisasi. Nilai ini dapat disesuaikan oleh operasi tergantung pada parameter lainnya. Nilai yang disesuaikan ditulis ke
output_min
. Jika atributaxis
ditentukan, ini harus berupa tensor 1-D yang ukurannya cocok dengan dimensiaxis
tensor masukan dan keluaran. - max_range: Nilai maksimum rentang kuantisasi. Nilai ini dapat disesuaikan oleh operasi tergantung pada parameter lainnya. Nilai yang disesuaikan ditulis ke
output_max
. Jika atributaxis
ditentukan, ini harus berupa tensor 1-D yang ukurannya cocok dengan dimensiaxis
tensor masukan dan keluaran.
Pengembalian:
-
Output
output: Data terkuantisasi yang dihasilkan dari input float. -
Output
output_min: Rentang kuantisasi akhir minimum, digunakan untuk memotong nilai input sebelum menskalakan dan membulatkannya ke nilai terkuantisasi. Jika atributaxis
ditentukan, ini akan menjadi tensor 1-D yang ukurannya cocok dengan dimensiaxis
tensor masukan dan keluaran. -
Output
output_max: Rentang kuantisasi akhir maksimum, digunakan untuk memotong nilai input sebelum menskalakan dan membulatkannya ke nilai terkuantisasi. Jika atributaxis
ditentukan, ini akan menjadi tensor 1-D yang ukurannya cocok dengan dimensiaxis
tensor masukan dan keluaran.
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 | Penyetel atribut opsional untuk QuantizeV2 . |
Atribut publik
operasi
Operation operation
keluaran
::tensorflow::Output output
keluaran_maks
::tensorflow::Output output_max
keluaran_menit
::tensorflow::Output output_min
Fungsi publik
KuantisasiV2
QuantizeV2( const ::tensorflow::Scope & scope, ::tensorflow::Input input, ::tensorflow::Input min_range, ::tensorflow::Input max_range, DataType T )
KuantisasiV2
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 )
Pastikan Rentang Minimum
Attrs EnsureMinimumRange( float x )
Mode
Attrs Mode( StringPiece x )
Rentang Sempit
Attrs NarrowRange( bool x )
Mode Bulat
Attrs RoundMode( StringPiece x )