在Windows浏览器中用TensorFlow.js如何实现模型本地磁盘存读?
TensorFlow.js 模型本地保存与加载实现方案
针对你基于MobileNet训练图像分类模型的场景,以下是具体的本地保存和加载操作步骤,分浏览器和Node.js两种环境说明:
一、保存训练后的模型及分类器数据
1. 浏览器环境(下载到本地)
在浏览器中,TensorFlow.js支持直接触发下载,将模型打包为zip文件保存到本地:
// 保存MobileNet模型(浏览器自动下载zip包,包含model.json和权重文件) await _net.model.save('downloads://my-image-model');
如果你的代码中使用了knnClassifier(即代码里的_classifier),仅保存MobileNet模型不够,还需要单独保存分类器的训练数据:
// 导出KNN分类器的数据集 const classifierDataset = _classifier.getClassifierDataset(); // 将分类器数据保存为本地文件 await tf.io.save('downloads://my-classifier-data', { modelArtifactsInfo: { dateSaved: new Date() }, weights: classifierDataset });
2. Node.js环境(写入本地磁盘)
在Node.js环境下,使用tf.node.save()直接将模型写入指定路径:
const tf = require('@tensorflow/tfjs-node'); // 保存模型到本地目录 await tf.node.save(_net.model, 'file://./saved-models/my-image-model');
同样,针对KNN分类器,需要序列化其数据后写入文件:
const fs = require('fs'); const classifierDataset = _classifier.getClassifierDataset(); // 序列化分类器数据为JSON格式 const serializedData = JSON.stringify( Object.fromEntries( Object.entries(classifierDataset).map(([key, tensor]) => [key, Array.from(tensor.dataSync())]) ) ); // 写入本地文件 fs.writeFileSync('./saved-models/classifier-data.json', serializedData);
二、从本地加载模型及分类器数据
1. 浏览器环境(从本地文件加载)
通过文件选择器让用户上传之前保存的文件,然后加载:
// 加载模型(绑定文件输入框事件) document.getElementById('model-upload').addEventListener('change', async (e) => { const modelFile = e.target.files[0]; _net.model = await tf.loadLayersModel(tf.io.browserFiles([modelFile])); }); // 加载KNN分类器数据 document.getElementById('classifier-upload').addEventListener('change', async (e) => { const classifierFile = e.target.files[0]; const reader = new FileReader(); reader.onload = () => { const serializedData = JSON.parse(reader.result); const classifierDataset = Object.fromEntries( Object.entries(serializedData).map(([key, data]) => [key, tf.tensor(data)]) ); _classifier.setClassifierDataset(classifierDataset); }; reader.readAsText(classifierFile); });
2. Node.js环境(从本地路径加载)
直接从指定目录加载模型和分类器数据:
const tf = require('@tensorflow/tfjs-node'); const fs = require('fs'); // 加载本地模型 _net.model = await tf.loadLayersModel('file://./saved-models/my-image-model/model.json'); // 加载KNN分类器数据 const serializedData = fs.readFileSync('./saved-models/classifier-data.json', 'utf8'); const classifierDataset = Object.fromEntries( Object.entries(JSON.parse(serializedData)).map(([key, data]) => [key, tf.tensor(data)]) ); _classifier.setClassifierDataset(classifierDataset);
关键提示
- 如果你仅用MobileNet做特征提取,核心训练数据在KNN分类器中,其实无需重复保存MobileNet,直接重新加载官方预训练模型即可,这样能节省存储空间:
// 重新加载官方MobileNet,无需自己保存 _net = await mobilenet.load(); - 模型加载时,
model.json必须和对应的权重文件放在同一目录下,否则会加载失败。
内容的提问来源于stack exchange,提问作者user4657635
相关产品推荐
相关产品推荐

