Воссоздать Тензор Из Струн - PullRequest
2 голосов
/ 01 мая 2019

Я использую tenorflow.js (узел) как способ предварительной обработки файлов изображений для тензоров.

const tf = require('@tensorflow/tfjs');
require("@tensorflow/tfjs-node")
const mobilenetModule = require('@tensorflow-models/mobilenet');
const knnClassifier = require('@tensorflow-models/knn-classifier'); 
const { loadImage, createCanvas } = require('canvas')

Когда я создаю классификатор, он сохраняет объект класса Tensor в виде пары ключ: значение.После создания этого объекта я его разветвляю и записываю в файл, чтобы использовать его позже.

{ '0':
   Tensor {
     kept: true,
     isDisposedInternal: false,
     shape: [ 5, 1024 ],
     dtype: 'float32',
     size: 5120,
     strides: [ 1024 ],
     dataId: {},
     id: 1333,
     rankType: '2',
     scopeId: 728 },
  '1':
   Tensor {
     kept: true,
     isDisposedInternal: false,
     shape: [ 5, 1024 ],
     dtype: 'float32',
     size: 5120,
     strides: [ 1024 ],
     dataId: {},
     id: 2394,
     rankType: '2',
     scopeId: 1356 } }
fs.writeFileSync("test", util.inspect(classifier.getClassifierDataset(), false, 2, false))

Когда я анализирую эту строку, поскольку она не является стандартным JSON, .parse () метод находит ошибку с файлом

(node:14780) UnhandledPromiseRejectionWarning: SyntaxError: Unexpected token ' in JSON at position 2

Как преобразовать строку этого формата обратно в объект того же точного формата?

РЕДАКТИРОВАТЬ:

Решено: Преобразование моего тензора в массив

Сохранение этого тензора в виде строки

Извлечение этой строки из сохраненного местоположения

Воссоздать Тензор

let tensorArr = tensor.arraySync()
fs.writeFileSync("test", JSON.stringify(tensorArr))
 let test = JSON.parse(classifierFile)
tf.tensor(test)

Рекомендовать Tennflow-модель KnnClassifier сделать это автоматически с их .getClassifierDataset

1 Ответ

0 голосов
/ 01 мая 2019

Невозможно преобразовать эту строку обратно в ее исходный тензор. Причина этого заключается в том, что данные не содержат фактических данных тензора. Это только некоторые метаданные.

Давайте рассмотрим первые данные, которые вы привели в качестве примера:

Tensor {
    kept: true,
    isDisposedInternal: false,
    shape: [ 5, 1024 ],
    dtype: 'float32',
    size: 5120,
    strides: [ 1024 ],
    dataId: {},
    id: 1333,
    rankType: '2',
    scopeId: 728
}

Что я могу сказать о тензоре, так это о том, что он имеет ранг два и имеет форму 5x1024. Общий размер 5120 (поэтому он имеет 5120 значений, связанных с этим тензором). Однако фактические тензорные данные в этих данных отсутствуют.

Другая ошибка также заключается в том, что вы использовали функцию util.inspect, которая должна использоваться только для целей отладки и для сохранения данных. Цитировать документы :

Метод util.inspect() возвращает строковое представление объекта, предназначенного для отладки. Вывод util.inspect может измениться в любое время и не должен зависеть от программного обеспечения.

Вместо этого следует использовать JSON.stringify.

Правильный способ сделать это

В следующий раз, когда вы хотите сохранить тензор, используйте функцию tenor.array () (или tensor.arraySync()).

Пример

const t = tf.tensor2d([[1,2], [3,4]]);
const dataArray = t.arraySync();
const serializedString = JSON.stringify(dataArray);
console.log(serializedString);

Это вернет: [[1,2],[3,4]]

Для десериализации данных вы можете использовать функцию tf.tensor:

const serializedString = '[[1,2],[3,4]]';
const dataArray = JSON.parse(serializedString);
const t = tf.tensor(dataArray);
t.print();

t будет таким же тензором, как указано выше, на выходе будет:

Tensor
    [[1, 2],
     [3, 4]]
...