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 atribut axis ditentukan, ini harus berupa tensor 1-D yang ukurannya cocok dengan dimensi axis 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 atribut axis ditentukan, ini harus berupa tensor 1-D yang ukurannya cocok dengan dimensi axis 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 atribut axis ditentukan, ini akan menjadi tensor 1-D yang ukurannya cocok dengan dimensi axis tensor masukan dan keluaran.
  • Output output_max: Rentang kuantisasi akhir maksimum, digunakan untuk memotong nilai input sebelum menskalakan dan membulatkannya ke nilai terkuantisasi. Jika atribut axis ditentukan, ini akan menjadi tensor 1-D yang ukurannya cocok dengan dimensi axis 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
)