Однонаправленные и двунаправленные модели Keras LSTM, преобразованные в Tensorflowjs, не дают правильного вывода

Используется версия TensorFlow.js

  • тензор потока 1.12.0
  • tenorflow-base 1.12.0
  • ТензорФлоу-GPU 1.12.0
  • тензор потока-хаб 0.2.0
  • tensorflowjs 0.8.0

Используемая версия браузера

  • Firefox 65.0 (64-it) в Windows 10
  • Microsoft Edge 42.17134.1.0 в Windows 10

описание проблемы

Я создал и обучил двунаправленную модель LSTM на основе Keras в Python для классификации видео. Эта модель работает потрясающе и классифицирует видео с точностью 90+. Но когда я преобразовал эту модель в модель tenenslorjs с помощью инструмента tenorflorjs_converter и использовал ее в браузере, модель всегда выдает одинаковые выходные данные (первые три результата) для любого видеовхода - BasketballDunk; Проб. 0,860, BalanceBeam; Проб. 0.088, BodyWeightSquats; Проб. 0,024

Я проверил все входные данные, их форму и т. Д., Которые даны для двунаправленной модели LSTM, и не могу найти никаких проблем. Но все же вывод из двунаправленной модели LSTM всегда одинаков независимо от видеовхода. Я гарантировал, что каждый отдельный видеокадр, отправленный на модель LSTM в виде последовательности, является правильным. (Использовал модель MobileNet для распознавания каждого кадра, и он делает это правильно, и, следовательно, пришел к выводу, что кадры, отправленные в LSTM, идеально подходят) Пожалуйста, помогите мне определить проблему и устранить ее. Все необходимые детали приведены ниже.

(вся модель основана на примерах, приведенных в этом github-репозитории Xianshun Chen (chen0040) -> [ https://github.com/chen0040/keras-video-classifier])

Детали модели:

  • использует модель MobileNet для извлечения функций
  • использует двунаправленную модель LSTM, чтобы получить извлеченные функции и классифицировать видео как один из 20 классов

Используемый набор данных:

Преобразованная модель Tensorflowjs:

  • Конвертированная модель тензорного потока, примеры видео и HTML-файл для тестирования находятся на этом диске в виде zip-файла: [ https://drive.google.com/open?id=1k_4xOPlTdbUJCBPFyT9zmdB3W5lYfuw0]
  • чтобы протестировать модель, просто разархивируйте и соберите, используя 'пряжу', и запустите, используя 'yearn Watch'
  • index.html имеет инструкции для тестирования

ПРИМЕЧАНИЕ. Я пробовал модель LSTM (однонаправленную), и та же проблема возникает и с этой преобразованной моделью. Разница лишь в том, что он выдает "Биллардс" в качестве верхнего прогноза с вероятностью более 0,95

Код для воспроизведения проблемы: код и тестовые артефакты находятся в zip-файле в этом месте диска - [ https://drive.google.com/open?id=1k_4xOPlTdbUJCBPFyT9zmdB3W5lYfuw0]

1 ответ

Решение

Выяснили причины, по которым преобразованная модель tfjs не выдает правильный вывод... наконец-то:)

Причины:

  1. Элемент списка Вход в модель LSTM содержал NaN! Хотя я передавал извлеченные функции из модели MobileNet в LSTM, функции .dataSync() не использовались. Из-за этого, когда я добавил извлеченные функции в tf.buffer, они были добавлены как NaN. (когда я печатал значения в журнале непосредственно перед добавлением в tf.buffer, они печатали значения правильно!... это странно). Поэтому, когда я использовал dataSync () для извлеченных функций, они были правильно добавлены в tf.buffer.

  2. Элемент списка Использование tf.buffer () для хранения извлеченных функций (из MobileNet) и преобразования их в тензоры перед передачей в модель LSTM. Вместо этого я использовал tf.stack() для хранения извлеченных объектов, а затем передал сложенный тензор в модель LSTM. (Я понимаю, что tf.stack() делает эквивалент np.array ())

Надеюсь, что эти данные помогут кому-то.

С уважением, Джей

Другие вопросы по тегам