dòng chảy căng:: ôi:: Lượng tử hóaV2

#include <array_ops.h>

Lượng tử hóa tenxơ 'đầu vào' của loại float thành tenxơ 'đầu ra' của loại 'T'.

Bản tóm tắt

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

Trong chế độ 'MIN_COMBIND', mỗi giá trị của tenxơ 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() range(T) = numeric_limits ::max() - numeric_limits ::min() range(T) = numeric_limits ::max() - numeric_limits ::min()

Ví dụ về chế độ MIN_COMBIND

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

Nếu loại đầu ra là qint8 ([-128, 127]), thao tác sẽ trừ thêm mỗi giá trị 128 trước khi truyền, sao cho phạm vi giá trị căn chỉnh với phạm vi của qint8.

Nếu chế độ là 'MIN_FIRST' thì phương pháp này đượ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 giá trị này và MIN_COMBINED là phạm vi tối thiểu được làm tròn trước khi bị trừ khỏi giá trị làm tròn. Với MIN_COMBINED, một sai lệch nhỏ được đưa ra trong đó việc lặp lại lượng tử hóa và giải lượng tử sẽ gây ra lỗi ngày càng lớn hơn.

Chế độ SCALED Ví dụ

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

Đầu tiên chúng ta tìm phạm vi giá trị trong tensor của mình. Phạm vi chúng tôi sử dụng luôn tập trung vào 0, vì vậy chúng tôi tìm thấy m sao cho

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

Phạm vi tensor đầu vào của chúng tôi sau đó là [-m, m] .

Tiếp theo, chúng tôi chọn nhóm lượng tử hóa điểm cố định, [min_fixed, max_fixed] . Nếu T được ký 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 không dấu thì phạm vi điểm cố định là

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

Từ đó chúng tôi tính toán hệ số tỷ lệ của chúng tôi, s:

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

Bây giờ chúng ta có thể lượng tử hóa các phần tử của tensor:

result = round(input * s)

Một điều cần chú ý là người vận hành có thể chọn điều chỉnh một chút 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, do đó, bạn phải luô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 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ằng một giá trị epsilon nhỏ để ngăn việc tạo ra bộ đệm lượng tử hóa không đúng định dạng. Nếu không, bạn có thể kết thúc với các bộ đệm trong đó tất cả các giá trị lượng tử hóa ánh xạ tới cùng một giá trị float, điều này gây ra sự cố cho các hoạt động phải thực hiện các phép tính tiếp theo trên chúng.

Tranh luận:

  • phạm vi: Một đối tượng Phạm vi
  • min_range: Giá trị vô hướng tối thiểu có thể được tạo cho đầu vào.
  • max_range: Giá trị vô hướng tối đa có thể được tạo ra cho đầu vào.

Trả về:

  • Đầu ra Output : Dữ liệu lượng tử hóa được tạo ra từ đầu vào float.
  • Output ra_min: Giá trị vô hướng tối thiểu thực tế được sử dụng cho đầu ra.
  • Output : Giá trị vô hướng tối đa thực tế được sử dụng cho đầu ra.

Hàm 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

Bộ cài đặt 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_max

::tensorflow::Output output_max

đầu ra_min

::tensorflow::Output output_min

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

Lượng tử hóaV2

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

Lượng tử hóaV2

 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
)