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
, kita tidak menggunakan rentang penuh dari tipe keluaran, memilih untuk menghilangkan nilai simetri serendah mungkin (misalnya, rentang keluaran adalah -127 hingga 127, bukan -128 hingga 127 untuk kuantisasi 8 bit bertanda), sehingga 0,0 dipetakan ke 0.
Pertama-tama kita menemukan rentang nilai di tensor kita. Rentang yang kita gunakan selalu berpusat pada 0, jadi kita cari m sedemikian rupa
m = max(abs(input_min), abs(input_max))
Rentang tensor masukan kita adalah [-m, m]
.
Selanjutnya, kita memilih keranjang kuantisasi titik tetap, [min_fixed, max_fixed]
. Jika T ditandatangani, ini adalah
num_bits = sizeof(T) * 8 [min_fixed, max_fixed] = [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]
Sebaliknya, jika T tidak ditandatangani, rentang titik tetapnya adalah
[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]
Dari sini kami menghitung faktor skala kami, s:
s = (max_fixed - min_fixed) / (2 * m)
Sekarang kita dapat mengkuantifikasi elemen tensor kita:
result = round(input * s)
Satu hal yang harus diperhatikan adalah bahwa operator dapat memilih untuk sedikit menyesuaikan nilai minimum dan maksimum yang diminta selama proses kuantisasi, jadi Anda harus selalu menggunakan port keluaran sebagai rentang untuk penghitungan lebih lanjut. Misalnya, jika nilai minimum dan maksimum yang diminta mendekati sama, keduanya akan dipisahkan dengan nilai epsilon kecil untuk mencegah terciptanya buffer terkuantisasi yang tidak tepat. Jika tidak, Anda bisa mendapatkan buffer di mana semua nilai terkuantisasi dipetakan ke nilai float yang sama, yang menyebabkan masalah pada operasi yang harus melakukan penghitungan lebih lanjut terhadap nilai tersebut.
Argumen:
- ruang lingkup: Objek Lingkup
- min_range: Nilai skalar minimum yang mungkin dihasilkan untuk input.
- max_range: Nilai skalar maksimum yang mungkin dihasilkan untuk input.
Pengembalian:
-
Output
output: Data terkuantisasi yang dihasilkan dari input float. -
Output
output_min: Nilai skalar minimum aktual yang digunakan untuk output. -
Output
output_max: Nilai skalar maksimum aktual yang digunakan untuk 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 | |
---|---|
Mode (StringPiece 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
Mode
Attrs Mode( StringPiece x )
Mode Bulat
Attrs RoundMode( StringPiece x )