tensorflow::ops::QuantizeV2

#include <array_ops.h>

Lượng tử hóa tensor 'đầu vào' kiểu float thành tensor 'đầu ra' kiểu 'T'.

Bản tóm tắt

[min_range, max_range] là các giá trị float vô hướng xác định phạm vi cho dữ liệu 'input'. Thuộc tính 'mode' kiểm soát chính xác các phép tính được sử dụng để chuyển đổi các giá trị float thành các giá trị lượng tử hóa tương ứng. Thuộc tính 'round_mode' kiểm soát thuật toán làm tròn nào được sử dụng khi làm tròn các giá trị float thành các giá trị lượng tử hóa tương ứng.

Ở chế độ 'MIN_COMBINED', mỗi giá trị của tensor sẽ trải qua các bước sau:

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

ở đây range(T) = numeric_limits ::max() - numeric_limits ::min()

Ví dụ về chế độ MIN_COMBINED

Giả sử đầu vào có kiểu dữ liệu float với phạm vi giá trị từ [0.0 đến 6.0] và kiểu dữ liệu đầu ra là quint8 ([0, 255]). Các giá trị min_range và max_range cần được chỉ định là 0.0 và 6.0. Quá trình lượng tử hóa từ float sang quint8 sẽ nhân mỗi giá trị đầu vào với 255/6 và chuyển đổi sang kiểu quint8.

Nếu kiểu đầu ra là qint8 ([-128, 127]), thao tác sẽ trừ thêm 128 vào mỗi giá trị trước khi chuyển đổi, để phạm vi giá trị phù hợp với phạm vi của qint8.

Nếu chế độ là 'MIN_FIRST', thì phương pháp này sẽ được sử dụng:

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

Sự khác biệt lớn nhất giữa phương pháp này và MIN_COMBINED là phạm vi tối thiểu được làm tròn trước, rồi mới trừ đi giá trị đã làm tròn. Với MIN_COMBINED, một sai lệch nhỏ được tạo ra, trong đó các lần lặp lại lượng tử hóa và giải lượng tử hóa sẽ dẫn đến sai số ngày càng lớn.

Ví dụ về chế độ thu phóng

Chế độ SCALED phù hợp với phương pháp lượng tử hóa được sử dụng trong QuantizeAndDequantize{V2|V3} .

Nếu chế độ là SCALED , quá trình lượng tử hóa được thực hiện bằng cách nhân mỗi giá trị đầu vào với một scaling_factor. Hệ số scaling_factor được xác định từ min_range và max_range sao cho càng lớn càng tốt để phạm vi từ min_range đến max_range có thể được biểu diễn trong các giá trị thuộc kiểu 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);

Tiếp theo, chúng ta sử dụng scale_factor để điều chỉnh min_range và max_range như sau:

      min_range = min_T / scale_factor;
      max_range = max_T / scale_factor;

Ví dụ: nếu T = qint8, và ban đầu min_range = -10, max_range = 9, ta sẽ so sánh -128/-10.0 = 12.8 với 127/9.0 = 14.11, và đặt scaling_factor = 12.8. Trong trường hợp này, min_range vẫn giữ nguyên là -10, nhưng max_range sẽ được điều chỉnh thành 127 / 12.8 = 9.921875.

Vì vậy, chúng ta sẽ lượng tử hóa các giá trị đầu vào trong phạm vi từ (-10, 9.921875) đến (-128, 127).

Tensor đầu vào giờ đây có thể được lượng tử hóa bằng cách cắt bớt các giá trị trong khoảng min_range đến max_range , sau đó nhân với scale_factor như sau:

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

Giá min_range và max_range đã điều chỉnh được trả về dưới dạng kết quả 2 và 3 của phép toán này. Các kết quả này nên được sử dụng làm phạm vi cho bất kỳ phép tính nào tiếp theo.

thuộc tính narrow_range (bool)

Nếu đúng như vậy, chúng ta sẽ không sử dụng giá trị lượng tử hóa tối thiểu. Ví dụ: đối với kiểu dữ liệu int8, đầu ra lượng tử hóa sẽ bị giới hạn trong phạm vi -127..127 thay vì toàn bộ phạm vi -128..127. Điều này nhằm mục đích tương thích với một số hệ thống suy luận nhất định. (Chỉ áp dụng cho chế độ SCALED)

thuộc tính trục (int)

Thuộc tính axis tùy chọn có thể chỉ định chỉ số chiều của tensor đầu vào, sao cho các phạm vi lượng tử hóa sẽ được tính toán và áp dụng riêng biệt cho từng lát cắt của tensor dọc theo chiều đó. Điều này hữu ích cho việc lượng tử hóa trên từng kênh.

Nếu trục được chỉ định, min_range và max_range

Nếu axis = None, quá trình lượng tử hóa trên mỗi tensor được thực hiện như bình thường.

thuộc tính ensure_minimum_range (float)

Đảm bảo phạm vi lượng tử hóa tối thiểu ít nhất bằng giá trị này. Giá trị mặc định cũ là 0,01, nhưng rất nên đặt nó thành 0 cho các mục đích sử dụng mới.

Luận điểm:

  • phạm vi: Một đối tượng Phạm vi
  • min_range: Giá trị tối thiểu của phạm vi lượng tử hóa. Giá trị này có thể được điều chỉnh bởi toán tử tùy thuộc vào các tham số khác. Giá trị đã điều chỉnh được ghi vào output_min . Nếu thuộc tính axis được chỉ định, đây phải là một tensor 1 chiều có kích thước khớp với chiều axis của tensor đầu vào và đầu ra.
  • max_range: Giá trị tối đa của phạm vi lượng tử hóa. Giá trị này có thể được điều chỉnh bởi toán tử tùy thuộc vào các tham số khác. Giá trị đã điều chỉnh được ghi vào output_max . Nếu thuộc tính axis được chỉ định, đây phải là một tensor 1 chiều có kích thước khớp với chiều axis của tensor đầu vào và đầu ra.

Trả về:

  • Kết quả Output : Dữ liệu đã được lượng tử hóa từ dữ liệu đầu vào dạng số thực.
  • Output output_min: Giá trị tối thiểu của phạm vi lượng tử hóa cuối cùng, được sử dụng để cắt bớt các giá trị đầu vào trước khi điều chỉnh tỷ lệ và làm tròn chúng thành các giá trị lượng tử hóa. Nếu thuộc tính axis được chỉ định, đây sẽ là một tensor 1 chiều có kích thước khớp với chiều axis của tensor đầu vào và đầu ra.
  • Output output_max: Giá trị tối đa của phạm vi lượng tử hóa cuối cùng, được sử dụng để cắt bớt các giá trị đầu vào trước khi điều chỉnh tỷ lệ và làm tròn chúng thành các giá trị lượng tử hóa. Nếu thuộc tính axis được chỉ định, đây sẽ là một tensor 1 chiều có kích thước khớp với chiều axis của tensor đầu vào và đầu ra.

Hàm khởi tạo và hàm hủy

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)

Thuộc tính công khai

operation
output
output_max
output_min

Các hàm tĩnh công khai

Axis (int64 x)
EnsureMinimumRange (float x)
Mode (StringPiece x)
NarrowRange (bool x)
RoundMode (StringPiece x)

Cấu trúc

tensorflow::ops::QuantizeV2::Attrs

Các thiết lập thuộc tính tùy chọn cho QuantizeV2 .

Thuộc tính công khai

hoạt động

Operation operation

đầu ra

::tensorflow::Output output

đầu ra tối đa

::tensorflow::Output output_max

đầu ra tối thiểu

::tensorflow::Output output_min

Chức năng công cộng

Lượng tử hóa V2

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

Lượng tử hóa V2

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

Các hàm tĩnh công khai

Trục

Attrs Axis(
  int64 x
)

Đảm bảo phạm vi tối thiểu

Attrs EnsureMinimumRange(
  float x
)

Cách thức

Attrs Mode(
  StringPiece x
)

Phạm vi hẹp

Attrs NarrowRange(
  bool x
)

Chế độ tròn

Attrs RoundMode(
  StringPiece x
)