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 , kita tidak menggunakan rentang penuh dari tipe output, melainkan memilih untuk menghilangkan nilai terendah yang mungkin untuk simetri (misalnya, rentang output adalah -127 hingga 127, bukan -128 hingga 127 untuk kuantisasi 8 bit bertanda), sehingga 0,0 dipetakan ke 0.
Pertama-tama kita mencari rentang nilai dalam tensor kita. Rentang yang kita gunakan selalu berpusat pada 0, jadi kita mencari m sedemikian sehingga
m = max(abs(input_min), abs(input_max))
Rentang tensor input kita adalah [-m, m] .
Selanjutnya, kita memilih bucket kuantisasi titik tetap kita, [min_fixed, max_fixed] . Jika T bertanda, maka 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 bertanda, rentang titik tetapnya adalah
[min_fixed, max_fixed] = [0, (1 << num_bits) - 1]
Dari sini kita menghitung faktor skala kita, s:
s = (max_fixed - min_fixed) / (2 * m)
Sekarang kita dapat mengkuantisasi elemen-elemen tensor kita:
result = round(input * s)
Salah satu hal yang perlu diperhatikan adalah operator mungkin memilih untuk sedikit menyesuaikan nilai minimum dan maksimum yang diminta selama proses kuantisasi, jadi Anda harus selalu menggunakan port output sebagai rentang untuk perhitungan lebih lanjut. Misalnya, jika nilai minimum dan maksimum yang diminta hampir sama, keduanya akan dipisahkan oleh nilai epsilon kecil untuk mencegah pembuatan buffer terkuantisasi yang tidak valid. Jika tidak, Anda dapat berakhir dengan buffer di mana semua nilai terkuantisasi dipetakan ke nilai float yang sama, yang menyebabkan masalah untuk operasi yang harus melakukan perhitungan lebih lanjut padanya.
Argumen:
- Cakupan: Objek Cakupan
- min_range: Nilai skalar minimum yang mungkin dihasilkan untuk input.
- max_range: Nilai skalar maksimum yang mungkin dihasilkan untuk input.
Mengembalikan:
-
Output: Data terkuantisasi yang dihasilkan dari input float. -
Outputoutput_min: Nilai skalar minimum aktual yang digunakan untuk output. -
Outputoutput_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 | 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
Mode
Attrs Mode( StringPiece x )
Mode Putaran
Attrs RoundMode( StringPiece x )