我正在try 制作一个包含并可以运行TensorFlow js模型的自含式html文档.我将我的模型从python保存为.h5
,然后将其转换为tensorflowjs_convert --input_format keras ...
.这导致了一个包含model.json
的目录(据我所知,它看起来和加载都很好)和权重都存储在一个文件group1-shard1of1.bin
中.
我获取每个文件的内容,对它们进行Base64编码,然后将它们作为两个数据URI插入到我的html文件中.
const modelURI = "data:application/json;base64,<Data Here>";
const weightsURI = "data:application/octet-stream;base64,<Data Here>";
Promise.all([fetch(modelURI), fetch(weightsURI)])
.then(function(resp) {
return Promise.all([resp[0].json(), resp[1].arrayBuffer()]);
})
.then(function(data) {
tf.loadGraphModelSync([data[0], data[1]]);
});
问题是,loadGraphModelSync
人一直在抱怨
Uncaught (in promise) TypeError: n is null
value graph_model.js:212
value graph_model.js:180
value graph_model.js:167
loadGraphModelSync graph_model.js:699
我非常确定问题出在我传入的ArrayBuffer上,但我对tfjs甚至是普通的TensorFlow没有足够的经验来了解.
我查看了添加到选项中的pull request,它提到"ArrayBuffer是模型的连接权重的列表",但我找不到任何关于这到底是什么样子的可用信息.有人知道我在这里传递的权重应该是什么格式吗?另一种加载Base64编码数据的方法也会很有帮助.
Edit 1: 在找不出导致缩小的TensorFlow js包中的问题的原因后,我创建了一个快速BUN项目并安装了TensorFlow js NPM包,这使我能够获得一个更有用的错误:
32091 | if (metadata.structuredOutputKeys != null) {
32092 | this.structuredOutputKeys = metadata.structuredOutputKeys;
32093 | }
32094 | }
32095 | this.signature = signature;
32096 | this.version = "".concat(graph.versions.producer, ".").concat(graph.versions.minConsumer);
^
TypeError: null is not an object (evaluating 'graph.versions')
at .../node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:32096:34
at .../node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:32063:16
at .../node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:32053:16
at loadGraphModelSync (.../node_modules/@tensorflow/tfjs-converter/dist/tf-converter.node.js:32577:5)
at .../src/index.ts:14:9