Как tflite объединяет Relu в сверточные слои? - PullRequest
0 голосов
/ 25 мая 2020

При преобразовании модели TF в модель tflite (или другими словами - квантовании модели с помощью «посттренировочного квантования») слои Relu исчезают с графика. Это объясняется в документации : "операции, которые можно просто удалить из графа (tf.identity), заменить тензорами (tf.placeholder) или объединить в более сложные операции (tf.nn.bias_add ). "

Мой вопрос - как можно объединить слой Relu с предыдущим слоем? (Какая математика помимо этого «слияния»? Это специальная процедура c для квантованных моделей, или это можно сделать также в исходной модели с плавающей запятой?)

1 Ответ

1 голос
/ 02 июня 2020
  • Для Relu (или функций активации) в TFLite за слиянием на самом деле не стоит математика, а больше потому, что ядро ​​Conv поддерживает активацию во время вычисления свертки. Таким образом, вместо того, чтобы строить тензор элементов X в качестве вывода от Conv и затем передавать его в качестве входных данных следующему слою Relu, который просто выполняет итерацию для его вычисления, вы можете просто зафиксировать значения непосредственно во время свертки. Итак, поскольку ядро ​​TFLite поддерживает это, мы можем упростить график во время преобразования и объединить слой активации с conv и установить тип FusedActivationFunction в ConvParams, для которого должна происходить активация во время свертки. Это не c специально для квантованной модели, ядра TFLite с плавающей запятой также делают это. Вот пример, в котором значения ограничения установлены перед GEMM https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/optimized/optimized_ops.h#L1338

    или в эталонном ядре https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/reference/conv.h#L91

  • Для исчезновения bias_add преобразователь объединяет bias_add и conv и устанавливает параметр смещения в Op (в случае, если добавляемое значение является постоянным), поэтому ядро ​​может добавить значение смещения во время вычисления свертки. https://github.com/tensorflow/tensorflow/blob/master/tensorflow/lite/kernels/internal/reference/conv.h#L89

  • Для таких случаев, как Mul, преобразователь объединяет mul с Conv, если множитель является некоторой константой

    Mul (Const_A, Conv (Input, Filter) , bias)

    Conv (Input, (Filter * Const_A), (bias * Const_A))

    Предполагается, что Const_A и Filter являются широковещательными типами

    Это происходит во время преобразования https://github.com/tensorflow/tensorflow/blob/master/tensorflow/compiler/mlir/lite/transforms/optimize_patterns.td#L118

Надеюсь, что это поможет.

...