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 perhitungan 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
)