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 ke max_range , kemudian mengalikannya dengan scale_factor sebagai berikut:

result = round(min(max_range, max(min_range, input)) * scale_factor)

Disesuaikan min_range dan max_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 atribut axis ditentukan, ini harus berupa tensor 1-D yang ukurannya sesuai dengan dimensi axis 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 atribut axis ditentukan, ini harus berupa tensor 1-D yang ukurannya sesuai dengan dimensi axis 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 atribut axis ditentukan, ini akan menjadi tensor 1-D yang ukurannya sesuai dengan dimensi axis 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 atribut axis ditentukan, ini akan menjadi tensor 1-D yang ukurannya sesuai dengan dimensi axis 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
)