tensorflow::ops::QuantizeV2
#include <array_ops.h>'Girdi' tensörünü (float türünde) 'çıktı' tensörüne (T türünde) dönüştürün.
Özet
[min_range, max_range], 'giriş' verileri için aralığı belirten skalar kayan noktalı sayılardır. 'mode' özniteliği, kayan noktalı değerleri nicelleştirilmiş karşılıklarına dönüştürmek için hangi hesaplamaların kullanılacağını tam olarak kontrol eder. 'round_mode' özniteliği, kayan noktalı değerleri nicelleştirilmiş karşılıklarına yuvarlarken hangi yuvarlama algoritmasının kullanılacağını kontrol eder.
'MIN_COMBINED' modunda, tensörün her değeri aşağıdaki işlemlere tabi tutulacaktır:
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
MIN_COMBINED Modu Örneği
Girişin float türünde ve [0.0, 6.0] aralığında olabileceğini, çıkışın ise quint8 ([0, 255]) türünde olduğunu varsayalım. min_range ve max_range değerleri sırasıyla 0.0 ve 6.0 olarak belirtilmelidir. Float'tan quint8'e dönüştürme işlemi, girişin her değerini 255/6 ile çarpacak ve quint8'e dönüştürecektir.
Çıktı türü qint8 ([-128, 127]) ise, dönüştürmeden önce her değerden 128 çıkarılarak değer aralığı qint8'in aralığıyla uyumlu hale getirilir.
Mod 'MIN_FIRST' ise, şu 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())
Bu yöntem ile MIN_COMBINED arasındaki en büyük fark, minimum aralığın önce yuvarlanması ve ardından yuvarlanmış değerden çıkarılmasıdır. MIN_COMBINED ile, tekrarlanan nicelleştirme ve nicelleştirmeyi kaldırma işlemleri daha büyük ve daha büyük bir hataya yol açacağından küçük bir sapma oluşur.
Ölçeklendirilmiş mod Örneği
SCALED modu QuantizeAndDequantize{V2|V3} içinde kullanılan niceleme yaklaşımıyla eşleşir.
Eğer mod SCALED ise, niceleme her giriş değerinin bir ölçekleme faktörü ile çarpılmasıyla gerçekleştirilir. Ölçekleme faktörü, min_range ve max_range değerlerinden, min_range ile max_range arasındaki aralığın T tipindeki değerler içinde temsil edilebilir olmasını sağlayacak şekilde mümkün olduğunca büyük olacak şekilde belirlenir.
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);
Ardından, min_range ve max_range'i ayarlamak için scale_factor'ı aşağıdaki gibi kullanıyoruz:
min_range = min_T / scale_factor;
max_range = max_T / scale_factor;Örneğin, T = qint8 ise ve başlangıçta min_range = -10 ve max_range = 9 ise, -128/-10.0 = 12.8'i 127/9.0 = 14.11 ile karşılaştırır ve scaling_factor = 12.8 olarak ayarlardık. Bu durumda, min_range -10 olarak kalır, ancak max_range 127 / 12.8 = 9.921875 olarak ayarlanır.
Dolayısıyla, giriş değerlerini (-10, 9.921875) ile (-128, 127) aralığında nicelleştireceğiz.
Giriş tensörü artık min_range ile max_range aralığındaki değerleri kırparak ve ardından scale_factor ile çarparak aşağıdaki gibi nicelleştirilebilir:
result = round(min(max_range, max(min_range, input)) * scale_factor)
Ayarlanmış min_range ve max_range , bu işlemin 2. ve 3. çıktıları olarak döndürülür. Bu çıktılar, bundan sonraki tüm hesaplamalar için aralık olarak kullanılmalıdır.
narrow_range (bool) özniteliği
Eğer doğruysa, minimum nicelleştirilmiş değeri kullanmayız. Yani, int8 için nicelleştirilmiş çıktı, tam -128..127 aralığı yerine -127..127 aralığıyla sınırlandırılır. Bu, belirli çıkarım arka uçlarıyla uyumluluk sağlamak içindir. (Yalnızca ÖLÇEKLENDİRİLMİŞ mod için geçerlidir)
eksen (int) özniteliği
İsteğe bağlı bir axis özniteliği, giriş tensörünün bir boyut indeksini belirtebilir; böylece niceleme aralıkları, tensörün o boyut boyunca her dilimi için ayrı ayrı hesaplanır ve uygulanır. Bu, kanal başına niceleme için kullanışlıdır.
Eksen belirtilmişse, min_range ve max_range
Eğer axis =None ise, her tensör için ayrı ayrı niceleme işlemi normal şekilde gerçekleştirilir.
ensure_minimum_range (float) özniteliği
Minimum niceleme aralığının en az bu değer olmasını sağlar. Bunun için eski varsayılan değer 0,01'dir, ancak yeni kullanımlar için 0 olarak ayarlanması şiddetle tavsiye edilir.
Argümanlar:
- kapsam: Bir Kapsam nesnesi
- min_range: Nicelleştirme aralığının minimum değeri. Bu değer, diğer parametrelere bağlı olarak işlem tarafından ayarlanabilir. Ayarlanan değer
output_minyazılır. Eğeraxisözniteliği belirtilmişse, bu, giriş ve çıkış tensörlerininaxisboyutlarıyla eşleşen boyutta 1 boyutlu bir tensör olmalıdır. - max_range: Nicelleştirme aralığının maksimum değeri. Bu değer, diğer parametrelere bağlı olarak işlem tarafından ayarlanabilir. Ayarlanan değer
output_maxyazılır. Eğeraxisözniteliği belirtilmişse, bu, giriş ve çıkış tensörlerininaxisboyutlarıyla eşleşen boyutta 1 boyutlu bir tensör olmalıdır.
İadeler:
-
Output: Kayan noktalı girişten üretilen nicelleştirilmiş veri. -
Outputoutput_min: Giriş değerlerini ölçeklendirmeden ve yuvarlamadan önce kırpmak için kullanılan son niceleme aralığı minimum değeri. Eğeraxisözniteliği belirtilmişse, bu, giriş ve çıkış tensörlerininaxisboyutlarıyla eşleşen boyutta 1 boyutlu bir tensör olacaktır. -
Outputoutput_max: Giriş değerlerini ölçeklendirmeden ve yuvarlamadan önce kırpmak için kullanılan son niceleme aralığı maksimum değeri. Eğeraxisözniteliği belirtilmişse, bu, giriş ve çıkış tensörlerininaxisboyutlarıyla eşleşen boyutta 1 boyutlu bir tensör olacaktır.
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 | |
Herkese açık statik fonksiyonlar | |
|---|---|
Axis (int64 x) | |
EnsureMinimumRange (float x) | |
Mode (StringPiece x) | |
NarrowRange (bool x) | |
RoundMode (StringPiece x) | |
Yapılar | |
|---|---|
| tensorflow::ops::QuantizeV2::Attrs | QuantizeV2 için isteğe bağlı özellik ayarlayıcıları. |
Genel özellikler
operasyon
Operation operation
çıktı
::tensorflow::Output output
çıktı_maks
::tensorflow::Output output_max
çıktı_minimum
::tensorflow::Output output_min
Kamusal işlevler
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 )
Herkese açık statik fonksiyonlar
Eksen
Attrs Axis( int64 x )
Minimum Aralığı Sağla
Attrs EnsureMinimumRange( float x )
Mod
Attrs Mode( StringPiece x )
Dar Aralık
Attrs NarrowRange( bool x )
Yuvarlak Mod
Attrs RoundMode( StringPiece x )