javascript - Rezultate diferite pentru tensorflowjs și keras pe același model și tensor


Am antrenat un model CNN pe niște imagini urmând exemplul de la https://blog.keras.io/building-powerful-image-classification-models-using-very-little-data.html. Codul modelului meu este identic, doar că l-am antrenat pe un alt set de imagini: tot pentru clasificare între două clase.

Rezultatele sunt cele la care te-ai aștepta pe setul de antrenament: imaginile sunt clasificate corect fie 0, fie 1.

Am salvat modelul într-un format compatibil cu tensorflowjs urmând secțiunea „Alternativ: Folosiți API-ul Python pentru a exporta direct în formatul TF.js Layers” de la https://js.tensorflow.org/tutorials/import-keras.html

Totuși, când încerc să accesez rezultatele într-o pagină html cu javascript, obțin 1 pentru aproape fiecare imagine (sau aproape de asta): chiar dacă imaginea dă 0 în Keras.

Am salvat chiar și o imagine ca tensor în JSON și obțin 0 în Keras și 1 în TensorflowJS. Este aceasta o eroare sau am făcut o greșeală undeva?

Iată codul meu în TensorflowJS pentru a accesa json-ul:

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

    <script>
      // https://stackoverflow.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>

Și aici este codul meu Python pentru același lucru:

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])

Obțin PREDICTION JS 1 și PREDICTION PYTHON 0.0, pentru exact aceleași date și același model: vede cineva vreo problemă în codul meu?

EDIT1: Sunt pe Xubuntu 18.04.1 LTS și folosesc următoarele versiuni de software:

Python 3.6.6
Keras 2.2.4
tensorflow 1.11.0
tensorflowjs 0.6.2
numpy 1.15.2

EDIT2: Am deschis următoarea problemă https://github.com/tensorflow/tfjs/issues/776 și de atunci a fost rezolvată.

Răspuns #1

Actualizarea la cea mai recentă versiune a tfjs (în prezent 0.13.3) rezolvă problema. Mai mult context pentru întrebare poate fi vizionat aici și aici

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

Răspunsul #2

Problema este similară aici pe Mac 10.15, TF 2.3, Python 3.8, JavaScript TFJS 2.6.0 simplu, server web: python3 -m http.server

Rezultatele inferenței ar rămâne întotdeauna în jur de 0,5 pe toate unitățile într-o rețea Keras CNN + RNN mare și adâncă.

Soluție: Nu folosiți tensorflowjs_converter pentru conversia .h5 în TFJS

tensorflowjs_wizard îți permite să dezactivezi comprimarea numerică, oferind rezultate aproape identice cu Python TF2.3 (în cazul meu, până la 6 zecimale pe stratul final).