0

用于通过调用加载模型tf.loadModel('https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_128/model.json'),但是,我需要更改 mobilinet 版本。

所以,我从 tensorflowhub 获取了我需要的版本,在 tensorflow_converter 上运行它,得到了两个文件(.pb 和权重文件)。然后我使用 tf.loadGraphModel 加载它。但是,model.getLayer 抛出:

model.getLayer 不是函数。

加载看起来像这样:

const model = await tf.loadGraphModel(modelUrl); //url points to .pb

然后我将 mobilinet 模型保存为冻结模型,在 tensorflow_converter 上再次运行它,并尝试将其加载为 tf.loadFrozenModel。它返回了同样的东西。

我很困惑。

有没有办法从非 keras 模型中获取图层?

编辑:为澄清起见,我从 tensoflowhub 获取的模型是: https ://tfhub.dev/google/imagenet/mobilenet_v2_075_96/classification/2

4

2 回答 2

1

LoadFrozenModel自 0.15 起已弃用。LoadGraphModel用更少的参数做同样的事情。它仅将模型拓扑文件作为参数。

如果加载的对象中没有图层,则可能是因为模型没有很好地加载或冻结的模型不包含任何 .

于 2019-03-01T20:36:46.570 回答
1

TF.js 支持两种 API 和对应的序列化格式:Layers API(对应 Keras 模型)和底层 Core API(对应任意 TensorFlow 图)。

根据您获取模型的位置以及转换方式,您的文件可以通过tf.loadLayersModel()或加载tf.loadGraphModel(),但不能同时加载。请参阅可用转换表

即使一个模型最初是使用 Keras 训练的,它也可能被保存为一个低级 TensorFlow 图,其中 Keras 层结构丢失了。我相信这是目前所有 TF-Hub 模块的情况。因此,您当前的方法为您提供了一个tf.GraphModel,从中无法重构图层。

我们在您列出的 URL 中提供了已经从原始 Keras 转换为 TF.js 层格式的 MobileNet v1,因此您可以直接使用loadLayersModel()(以前loadModel())。我们目前不托管转换后的 MobileNet v2。但是,您可以在此处获取原始 Keras .h5 模型,然后使用 .h5 将其转换为 TF.js 图层格式tensorflowjs_converter

于 2019-03-06T20:24:07.397 回答