Pytorch - ›[Onnx -› tensorflow] - ›tflite генерирует множество избыточных операторов conv2d

Я конвертирую эффективную сеть из onnx в тензорный поток для дальнейшего преобразования в tflite. Преобразование onnx в tenorflow дает странные результаты

Onnx имеет 1 оператор conv2d

введите описание изображения здесь

И после преобразования в тензорный поток и более позднюю модель tflite я получаю этот стек конвоев (все они не помещаются на картинке, всего их 32, как количество ядер в onnx)  введите здесь описание изображения

Я подозреваю, что проблема в onnx-tf преобразовании. Похоже, что вывод conv2d разделен на 32 отдельных вывода, затем они обрабатываются индивидуально отдельным оператором conv2d, а затем объединяются вместе.

На их гитхабе есть 2 связанных проблемы.

Во-первых, есть исправление для глубинных конвоев, но оно не может быть применено в моем случае.

https://github.com/onnx/onnx-tensorflow/issues/473

https://github.com/onnx/onnx-tensorflow/issues/754

Глядя на источник https://github.com/onnx/onnx-tensorflow/blob/master/onnx_tf/handlers/backend/conv_mixin.py Они действительно разделяют вывод, производя отдельные свертки, а затем объединяют их.

Можно ли избежать этого разделения на несколько сверток?


person vozman    schedule 17.03.2021    source источник


Ответы (1)


После дополнительных копаний я обнаружил следующее

  • Мои конверсии были глубинными (conv2d глубинно в pytorch и onnx, если у него есть параметр групп ›1)
  • Эта связка конвульсий - неэффективный способ глубинной конверсии. Чтобы сделать это эффективно, нам нужно использовать tf.depthwiseconv

Чтобы исправить это в onnx-tf v1.7.0, вы должны применить патч к onnx-tf исходному коду, размещенному здесь https://github.com/onnx/onnx-tensorflow/issues/473#issuecomment-533522917

В текущей основной ветке есть попытка исправить проблему, обнаружив глубинные конверсии, но в настоящее время она содержит ошибку. Чтобы исправить ошибку в основной ветке, вы можете применить исправление, которое я разместил здесь https://github.com/onnx/onnx-tensorflow/issues/754#issuecomment-801775203 Я использовал основную ветку и исправление, указанное выше, в результате получился небольшой график с глубинным преобразованием

Я также создал вилку с исправлением выше, так что вы можете сделать

pip install git+https://github.com/Vozf/onnx-tensorflow

применить его вместо исправления самостоятельно

введите описание изображения здесь

Похоже, проблема должна быть исправлена ​​в следующем крупном выпуске (вероятно, 1.8.0).

Также рассмотрите возможность использования https://github.com/nerox8664/onnx2keras, поскольку он поддерживает глубинные свертки и, кроме того, поддерживает полное преобразование nhwc, которое позволяет удалить все операции транспонирования.

person vozman    schedule 18.03.2021