Модель tensflow js (в пересчете с Keras) имеет 3 выхода. Как я могу извлечь их? - PullRequest
1 голос
/ 15 февраля 2020

Я обучил модель yolov3 в Керасе, и у нее есть 3 выхода (3D-тензоры). Нет проблем там. Затем я преобразовал эту модель в tf js, чтобы запустить ее в браузере. Я могу легко получить содержимое каждого из выходных данных, если укоротить модель до этого заданного c вывода. Но я не могу получить полный (3 выхода) сразу. Мне интересно, возможно ли это вообще?

Вот что я хотел бы сделать (не работает, зависает):

const myTracker = await tf.loadLayersModel(v3_model); 
const prediction = tf.tidy(() => {

      // prepare inputs tensor
      const inputs = tf.browser.fromPixels(canvas, 3).expandDims(0).toFloat().div(tf.scalar(255));
      console.log("============ inputs tensor shape:" + inputs.shape);  //--> 1,416,416,3  

      // get all 3 outputs
      const outputs = myTracker.predict(inputs).arraySync(); 
      outputs.print();
      return outputs; 
});            

А вот что работает, если я только заинтересованы в 1 выводе, после определения 3-х имен выходов.

const myTracker = await tf.loadLayersModel(v3_model); 
const prediction = tf.tidy(() => {

      // prepare inputs tensor
      const inputs = tf.browser.fromPixels(canvas, 3).expandDims(0).toFloat().div(tf.scalar(255));
      console.log("============ inputs tensor shape:" + inputs.shape);  //--> 1,416,416,3  

      // get the full object of interesting layers
      const layer3 = myTracker.getLayer('conv2d_3');
      const layer8 = myTracker.getLayer('conv2d_8'); 
      const layer13= myTracker.getLayer('conv2d_13'); 

      // get 1 specific output from a new model build from the original
      const myTracker_truncated = tf.model({inputs: myTracker.inputs, outputs: layer3.output});
      const outputs = myTracker_truncated.predict(inputs).arraySync();  
      return outputs; 
});

Если я проверю (console.log (myTracker)), я получу эту структуру для своих выходов:

outputNames: (3) […]
0: "conv2d_3
1: "conv2d_8"
2: "conv2d_13"
length: 3

outputs: (3) […]
0: Object { dtype: "float32", id: 662, originalName: "conv2d_3/conv2d_3", … }
1: Object { dtype: "float32", id: 665, originalName: "conv2d_8/conv2d_8", … }
2: Object { dtype: "float32", id: 668, originalName: "conv2d_13/conv2d_13", … }
length: 3

Будет Кто-нибудь знает, возможно ли то, чего я пытаюсь достичь (если не объединить 3 выхода в 1 в исходной модели keras)?

1 Ответ

0 голосов
/ 20 февраля 2020

Эти выходные данные могут быть получены с использованием массива выходных данных при создании модели с tf.model

tf.model({inputs: myTracker.inputs, outputs: [layer3.output, layer8.output, layer13.output, ...]});

prediction = myTracker_truncated.predict(inputs).arraySync()

Теперь прогноз будет представлять собой массив из трех значений соответственно слоям, определенным в outputs

...