我正在尝试使用tensorflowjs_converter 将我在python 中训练的模型(使用tensorflow)转换为JSON 层格式,以便我可以在网络上运行它。我安装了最新版本,并转换了测试模型。对于这个模型,它按预期提供了
model.json
和
.bin
文件,但是当我在网络上运行它时,我遇到了错误:
Uncaught (in promise) Error: Provided weight data has no target variable: sequential/conv2d/kernel
at a.value (container.js:643:15)
at models.js:331:11
at h (tf.min.js:17:2100)
at Generator.<anonymous> (tf.min.js:17:3441)
at Generator.next (tf.min.js:17:2463)
at u (tf.min.js:17:8324)
at o (tf.min.js:17:8527)
我用来生成 .h5 文件的代码:
model.save("mnist_model.h5")
(如果需要,可以提供包括培训在内的所有代码)
我用来在网络上运行模型的代码:
const modelPath = "new_model/model.json"
const model = await tf.loadLayersModel(modelPath, strict=false)
版本信息:
python 3.9.13
tensorflow 2.16.2
tensorflowjs 4.20.0
numpy 1.26.4
进行一些搜索后(查找“错误:假设重量数据没有目标变量:"),我发现 这个堆栈溢出问题 和 这个github问题 提出了同样的问题。
堆栈溢出问题没有用因为我计划构建一个更复杂的模型,手动(甚至编写脚本来)修复模型文件中的错误将非常乏味。
github问题建议了多种解决方案,但这些解决方案都不适合我加载模型一次(这就是我已经在做的事情),使用命令行工具而不是Python代码(两种方法都不起作用),在函数调用中添加 false (他们正在使用 tf.loadModel ,当我使用它时,它已被弃用)我正在使用 tf.loadLayersModel,因为该帖子已经有 6 年历史了),运行 keras.backend.clear_session() 或 tf.keras.backend.clear_session() (不起作用),然后在 colab 中重新启动会话并运行每个单元一次(没用)。
遇到的问题似乎是由 Tensorflow.js 版本和用来保存模型的 Tensorflow 版本之间的兼容性问题引起的。 虽然没有明确提及它,但我猜想在创建
mnist_model.h5
文件时正在使用 Tensorflow 2.x。
以下是一些可能解决此问题的步骤:
1. 尝试使用旧版 Tensorflow.js 加载器:
Tensorflow.js 提供了一个旧版加载器,该加载器可能与使用 Tensorflow 2.x 创建的模型更加兼容。 尝试用以下代码替换的模型加载代码:
```javascript import * as tf from '@tensorflow/tfjs'; import { loadGraphModel } from '@tensorflow/tfjs-converter';
const model = await loadGraphModel("new_model/model.json"); ```
这将使用旧版图模型加载器,该加载器可能可以正确处理的权重文件。
2. 降级的 Tensorflow.js 版本:
如果旧版加载器不起作用,则可以尝试降级 Tensorflow.js 版本。 已知 Tensorflow.js 版本 3.x 与使用 Tensorflow 2.x 创建的模型具有更好的兼容性。
可以使用 npm 或 yarn 降级的 Tensorflow.js 版本:
npm install @tensorflow/[email protected]
将
3.x.x
替换为要使用的实际 3.x 版本。
3. 使用 Tensorflow.js 重新训练的模型:
如果可能,请考虑直接在 Tensorflow.js 中重新训练的模型。 这将确保与 Tensorflow.js 的最大兼容性,并避免转换问题。
可以使用 Tensorflow.js 中的 Layers API 或导入预先训练的模型并对其进行微调。
4. 检查变量名称:
确保的模型中没有包含无效字符(如空格或特殊字符)的变量名称。 这些字符可能会在转换过程中引起问题。 如果存在,请将它们重命名为仅包含字母数字字符和下划线的名称。
如果尝试了这些步骤但仍然遇到问题,请提供以下附加信息,以便我进一步帮助:
- 用于训练模型的 Tensorflow 版本。
- 的模型架构(例如,层数、层类型)。
- 训练模型时使用的代码片段。
提供此信息将有助于我更准确地诊断问题并提供更具体的解决方案。
标签:javascript,python,tensorflow,tensorflow.js,tensorflowjs-converter From: 78774410