當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.raw_ops.Dequantize用法及代碼示例


將 'input' 張量反量化為 float 或 bfloat16 張量。

用法

tf.raw_ops.Dequantize(
    input, min_range, max_range, mode='MIN_COMBINED', narrow_range=False,
    axis=-1, dtype=tf.dtypes.float32, name=None
)

參數

  • input 一個Tensor。必須是以下類型之一:qint8 , quint8 , qint32 , qint16 , quint16
  • min_range Tensor 類型為 float32 。可能為輸入產生的最小標量值。
  • max_range Tensor 類型為 float32 。可能為輸入產生的最大標量值。
  • mode 一個可選的 string 來自: "MIN_COMBINED", "MIN_FIRST", "SCALED" 。默認為 "MIN_COMBINED"
  • narrow_range 可選的 bool 。默認為 False
  • axis 可選的 int 。默認為 -1
  • dtype 一個可選的 tf.DType 來自:tf.bfloat16, tf.float32。默認為 tf.float32 。輸出張量的類型。目前 Dequantize 支持 float 和 bfloat16。如果'dtype'為'bfloat16',則隻支持'MIN_COMBINED'模式。
  • name 操作的名稱(可選)。

返回

  • Tensor 類型為 dtype

[min_range, max_range] 是標量浮點數,用於指定輸出範圍。 'mode' 屬性精確控製用於將浮點值轉換為其量化等價物的計算。

在'MIN_COMBINED' 模式下,張量的每個值都會經曆以下過程:

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

這裏range(T) = numeric_limits<T>::max() - numeric_limits<T>::min()

MIN_COMBINED 模式示例

如果輸入來自 QuantizedRelu6,則輸出類型為 quint8(範圍為 0-255),但 QuantizedRelu6 的可能範圍為 0-6。因此,min_range 和 max_range 值為 0.0 和 6.0。 quint8 上的反量化將獲取每個值,轉換為浮點數,然後乘以 6 /255。請注意,如果 quantizedtype 是 qint8,則該操作將在轉換之前將每個值另外加 128。

如果模式是'MIN_FIRST',那麽使用這種方法:

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 = range / num_discrete_values
const double offset_input = static_cast<double>(input) - lowest_quantized;
result = range_min + ((input - numeric_limits<T>::min()) * range_scale)

如果模式是SCALED,則通過將每個輸入值乘以scaling_factor來執行去量化。 (因此輸入 0 總是映射到 0.0)。

scaling_factor 是從 min_range , max_rangenarrow_range 以與 QuantizeAndDequantize{V2|V3}QuantizeV2 兼容的方式確定的,使用以下算法:

const int min_expected_T = std::numeric_limits<T>::min() +
    (narrow_range ? 1:0);
  const int max_expected_T = std::numeric_limits<T>::max();
  const float max_expected_T = std::numeric_limits<float>::max();

  const float scale_factor =
    (std::numeric_limits<T>::min() == 0) ? (max_range / max_expected_T)
                                        :std::max(min_range / min_expected_T,
                                                    max_range / max_expected_T);

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.raw_ops.Dequantize。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。