Neural network TensorFlow.js:在培训期间保存不同的模型实例

Neural network TensorFlow.js:在培训期间保存不同的模型实例,neural-network,tensorflow.js,Neural Network,Tensorflow.js,我正在节点上运行TensorFlow.JS,我希望能够在某一点的培训过程中保存一个模型 我试图将实际的模型复制到一个全局变量,但JavaScript对象是通过引用复制的,并且最终全局变量的模型与上一个训练历元的模型相同 然后,我使用了许多不同的JavaScript方法来进行深度克隆(包括lodash deep clone),但在复制的类似于模型的函数(如model.evaluate)上会出现错误,最终会丢失这些函数 我想知道保存某个检查点的唯一方法是直接使用model.save()还是有其他方法

我正在节点上运行TensorFlow.JS,我希望能够在某一点的培训过程中保存一个模型

我试图将实际的模型复制到一个全局变量,但JavaScript对象是通过引用复制的,并且最终全局变量的模型与上一个训练历元的模型相同

然后,我使用了许多不同的JavaScript方法来进行深度克隆(包括lodash deep clone),但在复制的类似于模型的函数(如model.evaluate)上会出现错误,最终会丢失这些函数

我想知道保存某个检查点的唯一方法是直接使用model.save()还是有其他方法将模型对象复制(通过值而不是引用)到全局或类属性

谢谢你

**更新**

目前,对我来说,最好的解决方案是创建模型的副本:

  const copyModel = (model) => {
    const copy = tf.sequential();
    model.layers.forEach(layer => {
      copy.add(layer);
    });
    copy.compile({ loss: model.loss, optimizer: model.optimizer });
    return copy;
  }
  • 考虑到您可能需要将一些其他设置从原始模型复制到新模型(副本)

  • A
    tf.Model
    对象包含权重值,通常位于GPU上 (如WebGL纹理)并且不容易关闭。所以这不是一个好主意 克隆一个
    tf.Model
    对象。您应该序列化它并将其保存在某个位置。 有两种选择:

  • 如果您在Node.js中,那么应该有相对充足的存储空间。只是 使用
    Model.save()
    稍后
  • 如果您希望避免使用文件系统,那么可以在内存中进行序列化和反序列化。使用方法
    tf.io.with saveHandler
    tf.io.fromMemory()
    。请参见下面的示例:

  • 你能展示一下代码吗?这个解决方案非常有效,谢谢@scai!!能够将检查点保存在内存中是我的需要。虽然这样做有效,但我发现在运行模型方法(如evaluate)时,我会出现以下错误:“错误:模型需要在使用之前进行编译。”我使用自己的代码以及使用model2和model3的示例对此进行了测试。TensorFlow.JS API说:“在compile()期间指定损失和度量,这需要在调用evaluate()之前进行。”也许某些模型配置没有使用此方法传输?再次感谢!正确的。保存的模型工件当前不包括丢失和优化器信息。加载模型后可以再次调用compile吗?为什么保存后需要加载?当然,储蓄然后继续训练会更有效率吗?
    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();
    })();