Модель OpenVino выводит нули - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть модель acousti c, которая успешно конвертирована из ONNX в OpenVino. Однако в OpenVino эта модель выводит тензор, состоящий из нулей из некоторой позиции.

#include <iostream>
#include <fstream>
#include <iterator>
#include <inference_engine.hpp>

typedef struct {
    float* data;
    size_t size;
    size_t timeLen;
} Fbank;

using namespace InferenceEngine;
using std::cout;
using std::endl;

void print_arr(std::string text, const float* arr, int l, int r) {
    cout << text << endl;
    for (int i = l; i < r; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

void doInference(ExecutableNetwork& executable_network, const std::string& input_name, const std::string& output_name, Fbank* fbank) {

    InferRequest infer_request = executable_network.CreateInferRequest();

    InferenceEngine::TensorDesc tDesc(InferenceEngine::Precision::FP32,
        {fbank->size, fbank->timeLen}, InferenceEngine::Layout::HW);
    Blob::Ptr blob = InferenceEngine::make_shared_blob<float>(tDesc, fbank->data);

    infer_request.SetBlob(input_name, blob);

    infer_request.Infer();
    Blob::Ptr output_blob = infer_request.GetBlob(output_name);

    auto dims = output_blob->getTensorDesc().getDims();

    size_t batchSize = dims[0];
    size_t T = dims[1];
    size_t D = dims[2];

    MemoryBlob::CPtr moutput = as<MemoryBlob>(output_blob);
    if (!moutput) {
        return;
    }

    auto moutputHolder = moutput->rmap();
    const float *pred = moutputHolder.as<const float*>();

    print_arr("AM output:", pred, D*29, D*31);
}


int main() {
    Fbank* fbank = new Fbank;
    fbank->size = 64;
    fbank->timeLen = 2000;
    fbank->data = new float[64*2000];

    Core ie;
    CNNNetwork network = ie.ReadNetwork("quartznet_random.xml", "quartznet_random.bin");

    std::string input_name = network.getInputsInfo().begin()->first;
    std::string output_name = network.getOutputsInfo().begin()->first;

    network.getOutputsInfo().begin()->second->setPrecision(Precision::FP32);

    ExecutableNetwork executable_network = ie.LoadNetwork(network, "cpu");
    doInference(executable_network, input_name, output_name, fbank);
    return 0;
}

Выходы:

AM output:
0.138650 -5.833140 -8.023724 -7.637482 -8.001101 -9.033963 -8.029905 -8.132050 -9.186495 -8.537528 -8.788505 -9.240234 -8.547676 -8.673388 0.000000 0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000 -0.000000 -0.000000 -0.000000 0.000000 -0.000000 -0.000000 0.000000 -0.000000 0.000000

Если я запускаю Модель ONNX в Python используя onnxruntime, вывод будет правильным. ( Пример ).

Возможно ли это исправить?

PS Команда для преобразования модели из ONNX: python3 mo_onnx.py —input_model model.onnx —output="output" —input="fbanks[64 2000]"

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Проблема была связана с численной нестабильностью в нашей реализации LogSoftmax. Без лога софтмакса все отлично работает.

1 голос
/ 14 апреля 2020

Протестировано при условии модели ONNX в OpenVINO для Linux, пара выводов при тестировании OpenVINO 2020.1 и новой версии 2020.2 (выпущено сегодня 4/14/2020, примечания к выпуску ).

Используя ту же команду для конвертации из ONNX. Хотя неясно, каков будет ожидаемый результат (вероятность между 0,0 и 1,0?), OpenVINO 2020.2, похоже, влияет на результаты.

  1. На 2020.1 наблюдались результаты, аналогичные вашим (можно предположить, что вы использовали версию OpenVINO).

AM: -3.55062 -3.5114 - 3.50925 -3.52013 -3.51791 -3.54656 -3.53908 -3.54239 -3.53626 -3.50982 -3.54193 -3.55593 -3.52877 -3.53786 -1,546e-07 -6.14673e-08 -8.56817e-08 -1.41561e-07-08,16673,53 e-07 -9.30158e-08 -9.12696e-08 -1.29454e-07 -1.04774e-07 -6.14673e-08 -5.58794e-08 -1.71363e-07 -1.02445e-07 -5.7742e-08 -1.35042 e-07 -9.26666e-08 -1.00583e-07 -1.04308e-07 -1.2666e-07 -1.39698e-07 -7.26432e-08 -9.68575e-08 -1.47149e-07 -9.40636e-08 -9.77889 e-08 -9.49949e-08 -1.16415e-07 -9.54606e-08 -8.3819e-08 -1.28523e-07 -1.35973e-07 -7.66013e-08 -1.12224e-07 -1.546e-07 -6.14673 e-08 -8.56817e-08 -1.41561e-07 -6.14673e-08 -1.16415e-07 -9.30158e-08 -9.12696e-08 -1.29454e-07 -1.04774e-07 -6.14673e-08 -5.58794 e-08 -1.71363e-07 -1.02445e-07 -5.7742e-08 -1.35042e-07 -9.26666e-08 -1.00583e-07 -1.04308e-07 -1.2666e-07

В OpenVINO 2020.2 пришлось изменить ExecutableNetwork executable_network = ie.LoadNetwork(network, "cpu"); на ExecutableNetwork executable_network = ie.LoadNetwork(network, "CPU");, поскольку Механизм логического вывода не распознал устройство ЦП в нижнем регистре, произошла ошибка «: завершается вызов после выброса экземпляра« InferenceEngine :: details :: InferenceEngineException », что (): Устройство с именем «cpu» не зарегистрировано в InferenceEngine Aborted (ядро сброшено)" В OpenVINO 2020.2 результаты отличаются и не близки к нулю (хотя все кажутся отрицательными).

Выход AM: -3,55062 -3,5114 -3,50925 -3,52013 -3,51791 -3,54656 -3,53908 -3,54239 -3,53626 -3,50982 -3,54193 -3,55593 -3,52877 -3,5373,33,563,53,33 3.54885 -3.52137 -3.54384 -3.53411 -3.55188 -3.5477 -3.52514 -3.51171 -3.5022 -3.5138 -3.50823 -3.50125 -3.51817 -3.53914 -3.50173 -3.50603 -3.55062 -3.53,53,53,53 531,83 3.53626 -3.50982 -3.54193 -3.55593 -3.52877 -3.53786 -3.52153 -3.52563 -3.51142 -3.54885 -3.52137 -3.54384 -3.53411 -3.55188 -3.5477 -3.52514 -3.511 71 -3.5022 -3.5138 -3.50823 -3.50125 -3.51817 -3.53914 -3.50173 -3.50603 -3.51917

Нет уверенности в том, что выходные результаты OpenVINO 2020.2 ожидаемые / правильные. Я не могу проверить пример Python с моделью ONNX, используя onnxruntime, сценарий ожидает файл /kek/fbank.out. Уточните / поделитесь, какой выход ожидается, т.е. правильный выход AM.

...