tensor akışı:: işlem:: QuantizeV2

#include <array_ops.h>

Float tipindeki 'giriş' tensörünü 'T' tipindeki 'çıkış' tensörüne niceliklendirin.

Özet

[min_aralık, maksimum_aralık], 'giriş' verilerinin aralığını belirten skaler değişkenlerdir. 'Mode' özelliği, kayan değer değerlerini nicelenmiş eşdeğerlerine dönüştürmek için tam olarak hangi hesaplamaların kullanıldığını kontrol eder. 'Round_mode' özelliği, kayan değer değerlerinin nicelenmiş eşdeğerlerine yuvarlanmasında hangi yuvarlama eşitlik bozma algoritmasının kullanılacağını kontrol eder.

'MIN_COMBINED' modunda tensörün her değeri aşağıdaki işlemlerden geçecektir:

out[i] = (in[i] - min_range) * range(T) / (max_range - min_range)
if T == qint8: out[i] -= (range(T) + 1) / 2.0

burada range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min()

MIN_COMBINED Mod Örneği

Girişin float tipinde olduğunu ve olası bir [0.0, 6.0] aralığına sahip olduğunu ve çıkış tipinin quint8 ([0, 255]) olduğunu varsayalım. Min_range ve max_range değerleri 0,0 ve 6,0 olarak belirtilmelidir. Float'tan quint8'e niceleme yapmak, girişin her değerini 255/6 ile çarpacak ve quint8'e dönüştürecektir.

Çıkış türü qint8 ([-128, 127]) ise işlem, değer aralığının qint8 aralığıyla aynı hizada olması için dönüştürmeden önce her değeri ek olarak 128 oranında çıkaracaktır.

Mod 'MIN_FIRST' ise bu yaklaşım kullanılır:

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

Bununla MIN_COMBINED arasındaki en büyük fark, yuvarlanmış değerden çıkarılmadan önce minimum aralığın önce yuvarlanmasıdır. MIN_COMBINED ile, niceleme ve nicemlemenin tekrar tekrar tekrarlanmasının giderek daha büyük bir hataya yol açacağı küçük bir sapma ortaya çıkar.

ÖLÇEKLİ mod Örnek

SCALED modu QuantizeAndDequantize{V2|V3} 'de kullanılan niceleme yaklaşımıyla eşleşir.

Mod SCALED ise, simetri için mümkün olan en düşük değeri atlamayı seçerek çıkış tipinin tüm aralığını kullanmayız (örneğin, işaretli 8 bit niceleme için çıkış aralığı -128 ila 127 değil, -127 ila 127'dir), böylece 0,0, 0 ile eşleşir.

Öncelikle tensörümüzdeki değer aralığını buluyoruz. Kullandığımız aralık her zaman 0 merkezli olduğundan m'yi öyle buluruz ki

  m = max(abs(input_min), abs(input_max))

Bu durumda giriş tensör aralığımız [-m, m] olur.

Daha sonra, sabit nokta niceleme gruplarımızı [min_fixed, max_fixed] seçiyoruz. T imzalıysa, bu

  num_bits = sizeof(T) * 8
  [min_fixed, max_fixed] =
      [-(1 << (num_bits - 1) - 1), (1 << (num_bits - 1)) - 1]

Aksi takdirde, eğer T işaretsizse, sabit nokta aralığı

  [min_fixed, max_fixed] = [0, (1 << num_bits) - 1]

Buradan ölçeklendirme faktörümüzü (s) hesaplıyoruz:

  s = (max_fixed - min_fixed) / (2 * m)

Artık tensörümüzün elemanlarını nicemleyebiliriz:

result = round(input * s)

Dikkat edilmesi gereken bir nokta, operatörün niceleme işlemi sırasında talep edilen minimum ve maksimum değerleri biraz ayarlamayı seçebilmesidir, bu nedenle daha sonraki hesaplamalar için aralık olarak her zaman çıkış bağlantı noktalarını kullanmalısınız. Örneğin, talep edilen minimum ve maksimum değerler eşite yakınsa, kötü biçimlendirilmiş nicelenmiş arabelleklerin oluşturulmasını önlemek için bunlar küçük bir epsilon değeriyle ayrılacaktır. Aksi takdirde, tüm nicelenmiş değerlerin aynı kayan değerle eşleştiği arabelleklerle karşılaşabilirsiniz; bu da, bunlar üzerinde daha fazla hesaplama yapmak zorunda olan işlemlerde sorunlara neden olur.

Argümanlar:

  • kapsam: Bir Kapsam nesnesi
  • min_range: Giriş için üretilebilecek minimum skaler değer.
  • max_range: Giriş için üretilebilecek maksimum skaler değer.

İade:

  • Output çıkışı: Float girişinden üretilen nicelenmiş veriler.
  • Output çıkışı_min: Çıkış için kullanılan gerçek minimum skaler değer.
  • Output Output_max: Çıkış için kullanılan gerçek maksimum skaler değer.

Yapıcılar ve Yıkıcılar

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)

Genel özellikler

operation
output
output_max
output_min

Genel statik işlevler

Mode (StringPiece x)
RoundMode (StringPiece x)

Yapılar

tensorflow:: ops:: QuantizeV2:: Öznitelikler

QuantizeV2 için isteğe bağlı öznitelik ayarlayıcılar.

Genel özellikler

operasyon

Operation operation

çıktı

::tensorflow::Output output

çıktı_maks

::tensorflow::Output output_max

çıktı_dakika

::tensorflow::Output output_min

Kamu işlevleri

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T
)

QuantizeV2

 QuantizeV2(
  const ::tensorflow::Scope & scope,
  ::tensorflow::Input input,
  ::tensorflow::Input min_range,
  ::tensorflow::Input max_range,
  DataType T,
  const QuantizeV2::Attrs & attrs
)

Genel statik işlevler

Mod

Attrs Mode(
  StringPiece x
)

Yuvarlak Mod

Attrs RoundMode(
  StringPiece x
)