Различные результаты для тензорного потока и кераса на одной модели и тензорном

Я обучил модели CNN на некоторых изображениях, следуя примеру https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html. Код моей модели идентичен, я только что обучил его другому набору данных: также для классификации между двумя классами.

Результаты - это то, что вы ожидаете на тренировочном наборе: изображения правильно классифицируются как 0 или 1.

Я сохранил модель в удобном для тензорного формата формате после раздела "Альтернатива: использование API-интерфейса Python для экспорта напрямую в формат слоев TF.js" в https://js.tensorflow.org/tutorials/import-keras.html

Однако, когда я пытаюсь получить доступ к результатам на html-странице с помощью javascript, я получаю 1 для почти каждого изображения (или близко к нему): даже если изображение дает 0 в Керасе.

Я даже сохранил изображение как тензор в JSON, и я получаю 0 в Керасе и 1 в TensorflowJS. Это ошибка или я где-то ошибся?

Вот мой код в TensorflowJS для доступа к json:

<html>
  <head>
    <!-- Load TensorFlow.js -->
    <meta http-equiv="content-type" content="text/html; charset=utf-8" />
    <script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.0"></script>

    <script>
      // https://stackru.com/a/18324384/2730032
      function callAjax(url, callback){
        var xmlhttp;
        // compatible with IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function(){
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200){
                callback(xmlhttp.responseText);
            }
        }
        xmlhttp.open("GET", url, true);
        xmlhttp.send();
      }

      tf.loadModel('/model.json').then(model => {
        callAjax('/tensor.json', res => {
          arr = JSON.parse(res);
          const example = tf.tensor(arr).reshape([1, 150, 150, 3]);
          const prediction = model.predict(example);
          prediction.data().then(res => {
            console.log('PREDICTION JS', res[0]);
          })
        });
      })
    </script>
  </head>
  <body>
  </body>
</html>

И вот мой код Python для того же:

import json
import numpy as np
import tensorflowjs as tfjs

model = tfjs.converters.load_keras_model('model.json')

with open('tensor.json', 'r') as f:
    r = json.load(f)
arr = np.array([np.array([np.array(v) for v in l]) for l in r])
print('PREDICTION PYTHON', model.predict(arr[np.newaxis,...])[0][0])

Я получаю PREDICTION JS 1 и PREDICTION PYTHON 0.0 для точно таких же данных и той же модели: кто-нибудь видит какие-либо проблемы в моем коде?

EDIT1: я нахожусь на Xubuntu 18.04.1 LTS и использую следующие версии программного обеспечения:

Python 3.6.6
Keras 2.2.4
tensorflow 1.11.0
tensorflowjs 0.6.2
numpy 1.15.2

РЕДАКТИРОВАТЬ 2: я открыл следующую проблему https://github.com/tensorflow/tfjs/issues/776 и с тех пор она была исправлена.

1 ответ

Решение

Обновление до последней версии tfjs (в настоящее время 0.13.3) решает проблему. Больше контекста к вопросу можно посмотреть здесь и там

<script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@0.13.3"></script>

Аналогичная проблема здесь на Mac 10.15, TF 2.3, Python 3.8, простой JavaScript TFJS 2.6.0, веб-сервер: python3 -m http.server

Результаты вывода всегда будут оставаться около 0,5 на всех устройствах в большой, глубокой сети CNN + RNN Keras.

Решение: не используйте tensorflowjs_converter для преобразования.h5 в TFJS

tenorflowjs_wizard позволяет отключить числовое сжатие, обеспечивая почти те же результаты, что и Python TF2.3 (в моем случае до 6 цифр на последнем слое).

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