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 , chúng ta không sử dụng toàn bộ phạm vi của kiểu đầu ra, mà chọn cách bỏ qua giá trị thấp nhất có thể để đảm bảo tính đối xứng (ví dụ: phạm vi đầu ra là -127 đến 127, chứ không phải -128 đến 127 đối với lượng tử hóa 8 bit có dấu), sao cho 0.0 được ánh xạ thành 0.

Trước tiên, chúng ta tìm phạm vi giá trị trong tenxơ của mình. Phạm vi chúng ta sử dụng luôn được đặt ở vị trí trung tâm là 0, vì vậy chúng ta tìm m sao cho

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

Phạm vi tensor đầu vào của chúng ta là [-m, m] .

Tiếp theo, chúng ta chọn các khoảng lượng tử hóa điểm cố định, [min_fixed, max_fixed] . Nếu T là số có dấu, thì đây là

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

Ngược lại, nếu T là số không dấu, phạm vi số thập phân cố định là

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

Từ đó, chúng ta tính được hệ số tỷ lệ, s:

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

Giờ đây chúng ta có thể lượng tử hóa các phần tử của tenxơ:

result = round(input * s)

Một điều cần lưu ý là người vận hành có thể điều chỉnh nhẹ các giá trị tối thiểu và tối đa được yêu cầu trong quá trình lượng tử hóa, vì vậy bạn luôn nên sử dụng các cổng đầu ra làm phạm vi cho các phép tính tiếp theo. Ví dụ, nếu các giá trị tối thiểu và tối đa được yêu cầu gần bằng nhau, chúng sẽ được phân tách bởi một giá trị epsilon nhỏ để ngăn chặn việc tạo ra các bộ đệm lượng tử hóa không hợp lệ. Nếu không, bạn có thể nhận được các bộ đệm mà tất cả các giá trị lượng tử hóa đều ánh xạ tới cùng một giá trị float, điều này gây ra sự cố cho các thao tác phải thực hiện các phép tính tiếp theo trên chúng.

Luận điểm:

  • phạm vi: Một đối tượng Phạm vi
  • min_range: Giá trị vô hướng nhỏ nhất có thể tạo ra từ dữ liệu đầu vào.
  • max_range: Giá trị vô hướng tối đa có thể tạo ra từ dữ liệu đầu vào.

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ị vô hướng tối thiểu thực tế được sử dụng cho đầu ra.
  • Output output_max: Giá trị vô hướng tối đa thực tế được sử dụng cho đầ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

Mode (StringPiece 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

Cách thức

Attrs Mode(
  StringPiece x
)

Chế độ tròn

Attrs RoundMode(
  StringPiece x
)