TensorFlow.js: сохранение разных экземпляров модели во время обучения - PullRequest
0 голосов
/ 06 февраля 2019

Я запускаю TensorFlow.JS на NODE, и я хотел бы иметь возможность сохранить модель в процессе обучения в определенный момент.

Я пытался просто скопировать фактическую модель в глобальную переменную, но объект JavaScript копируется по ссылке, и в конце глобальная переменная имеет ту же модель, что и в прошлую эпоху обучения.

Iзатем использовал много разных методов JavaScript для глубокого клонирования (включая глубокое клонирование lodash), но я получаю ошибки в копируемой модели, например функции, которые в конечном итоге отсутствуют (например, model.evaluate).

Интересно, единственный лиЯ могу сохранить определенную контрольную точку напрямую, используя model.save () или если есть какой-либо другой способ просто скопировать (по значению, а не по ссылке) объект модели в глобальное или классовое свойство.

Спасибо заadvane!

** ОБНОВЛЕНИЕ **

Сейчас самое лучшее решение, которое мне помогло, - это создать копию модели:

  const copyModel = (model) => {
    const copy = tf.sequential();
    model.layers.forEach(layer => {
      copy.add(layer);
    });
    copy.compile({ loss: model.loss, optimizer: model.optimizer });
    return copy;
  }
  • Учтите, что вам может потребоваться скопировать некоторые другие параметры из исходной модели в новую (копию).

1 Ответ

0 голосов
/ 06 февраля 2019

A tf.Model объект содержит значения веса, которые обычно живут на GPU (как текстуры WebGL) и не являются легко клонируемыми.Так что не стоит копировать объект tf.Model.Вы должны сериализовать его и сохранить где-нибудь.Есть два варианта:

  1. Если вы находитесь в Node.js, у вас должно быть относительно много места для хранения.Просто используйте Model.save() для «моментального снимка» моделей на диск, который можно загрузить позже.
  2. Если вы предпочитаете избегать прохождения файловой системы, вы можете выполнить сериализацию и десериализацию в памяти.Используя методы tf.io.withSaveHandler и tf.io.fromMemory().Смотрите пример ниже:
const tf = require('@tensorflow/tfjs');
require('@tensorflow/tfjs-node');

(async function main() {
  const model = tf.sequential();
  model.add(tf.layers.dense({units: 1, inputShape: [3], useBias: false}));
  model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});

  const xs = tf.randomUniform([4, 3]);
  const ys = tf.randomUniform([4, 1]);

  const artifactsArray = [];

  // First save, before training.
  await model.save(tf.io.withSaveHandler(artifacts => {
    artifactsArray.push(artifacts);
  }));

  // First load.
  const model2 = await tf.loadModel(tf.io.fromMemory(
      artifactsArray[0].modelTopology, artifactsArray[0].weightSpecs,
      artifactsArray[0].weightData));

  // Do some training.
  await model.fit(xs, ys, {epochs: 5});

  // Second save, before training.
  await model.save(tf.io.withSaveHandler(artifacts => {
    artifactsArray.push(artifacts);
  }));

  // Second load.
  const model3 = await tf.loadModel(tf.io.fromMemory(
      artifactsArray[1].modelTopology, artifactsArray[1].weightSpecs,
      artifactsArray[1].weightData));

  // The two loaded models should have different weight values.
  model2.getWeights()[0].print();
  model3.getWeights()[0].print();
})();
...