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 )