tensorflow :: ops :: KuantisasiV2
#include <array_ops.h>
Hitung tensor 'input' berjenis float ke tensor 'keluaran' berjenis 'T'.
Ringkasan
[min_range, max_range] adalah float skalar yang menentukan kisaran untuk data 'masukan'. Atribut 'mode' mengontrol dengan tepat kalkulasi mana yang digunakan untuk mengonversi nilai float menjadi padanan terkuantisasi. Atribut 'round_mode' mengontrol pembulatan algoritma tie-breaking yang digunakan saat membulatkan nilai float ke padanan terkuantisasi.
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 input adalah tipe float dan memiliki kemungkinan kisaran [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. Mengukur dari float ke quint8 akan mengalikan setiap nilai input dengan 255/6 dan melemparkan ke quint8.
Jika tipe keluarannya adalah qint8 ([-128, 127]), operasi tersebut juga akan mengurangi setiap nilai dengan 128 sebelum casting, sehingga kisaran nilai sejajar dengan kisaran 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 kisaran minimum dibulatkan terlebih dahulu, sebelum dikurangi dari nilai yang dibulatkan. Dengan MIN_COMBINED, bias kecil diperkenalkan di mana iterasi berulang dari kuantisasi dan dequantizing akan memperkenalkan kesalahan yang lebih besar dan lebih besar.
Contoh mode SCALED
Mode SCALED
cocok dengan pendekatan kuantisasi yang digunakan di QuantizeAndDequantize{V2|V3}
.
Jika mode SCALED
, kuantisasi dilakukan dengan mengalikan setiap nilai input dengan scaling_factor. min_range
ditentukan dari min_range
dan max_range
menjadi sebesar mungkin sehingga rentang dari min_range
hingga 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);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 hingga 127 / 9.0 = 14.11, dan mengatur scaling_factor = 12.8 Dalam kasus ini, min_range akan tetap -10, tetapi max_range akan disesuaikan menjadi 127 / 12.8 = 9.921875
Jadi kami akan menghitung nilai input dalam rentang (-10, 9.921875) hingga (-128, 127).
Tensor masukan sekarang dapat dikuantisasi dengan memotong nilai ke kisaran
min_range
kemax_range
, kemudian mengalikannya dengan scale_factor sebagai berikut:
result = round(min(max_range, max(min_range, input)) * scale_factor)Disesuaikan
min_range
danmax_range
dikembalikan sebagai output 2 dan 3 dari operasi ini. Keluaran ini harus digunakan sebagai rentang untuk kalkulasi selanjutnya.sempit_rentang (bool)
Jika benar, kami tidak menggunakan nilai terkuantisasi minimum. yaitu untuk int8 output terkuantisasi, itu akan dibatasi ke kisaran -127..127 daripada kisaran -128..127 penuh. Ini disediakan untuk kompatibilitas dengan backend inferensi tertentu. (Hanya berlaku untuk mode SCALED)
axis (int)
Atribut
axis
opsional dapat menentukan indeks dimensi tensor input, 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, rentang_minimal dan rentang_aks
jika
axis
= Tidak ada, kuantisasi per tensor dilakukan seperti biasa.memastikan atribut_minimum_range (float)
Memastikan kisaran kuantisasi minimum setidaknya nilai ini. Nilai default lama untuk ini adalah 0,01, tetapi sangat disarankan untuk menyetelnya ke 0 untuk penggunaan baru.
Argumen:
- scope: Objek Scope
- min_range: Nilai minimum dari rentang kuantisasi. Nilai ini dapat diatur oleh op tergantung pada parameter lainnya. Nilai yang disesuaikan ditulis ke
output_min
. Jika atributaxis
ditentukan, ini harus berupa tensor 1-D yang ukurannya sesuai dengan dimensiaxis
dari tensor masukan dan keluaran. - max_range: Nilai maksimum dari rentang kuantisasi. Nilai ini dapat diatur oleh op tergantung pada parameter lainnya. Nilai yang disesuaikan ditulis ke
output_max
. Jika atributaxis
ditentukan, ini harus berupa tensor 1-D yang ukurannya sesuai dengan dimensiaxis
dari 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 sesuai dengan dimensiaxis
dari 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 sesuai dengan dimensiaxis
dari tensor masukan dan keluaran.
Pembuat dan Penghancur | |
---|---|
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) |
Structs | |
---|---|
tensorflow :: ops :: QuantizeV2 :: Attrs | Penyetel atribut opsional untuk QuantizeV2 . |
Atribut publik
operasi
Operation operation
keluaran
::tensorflow::Output output
output_max
::tensorflow::Output output_max
output_min
::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 )
EnsureMinimumRange
Attrs EnsureMinimumRange( float x )
Mode
Attrs Mode( StringPiece x )
NarrowRange
Attrs NarrowRange( bool x )
RoundMode
Attrs RoundMode( StringPiece x )