用于通过调用tf.loadModel('https://storage.googleapis.com/tfjs-models/tfjs/mobilenet_v1_0.25_128/model.json')
加载模型,但是,我需要更改mobilinet版本。
因此,我从tensorflowhub中获取了所需的版本,在tensorflow_converter上运行它,并获得了两个文件(.pb和weight文件)。然后我使用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
答案 0 :(得分:1)
LoadFrozenModel
。 LoadGraphModel
使用较少的参数执行相同的操作。它仅将模型拓扑文件作为参数。
如果加载的对象中没有图层,则可能是因为模型加载不正确或冻结的模型不包含任何层。
答案 1 :(得分:1)
TF.js支持两种API和相应的序列化格式:Layers API(对应于Keras模型)和较低级别的Core API(对应于任意TensorFlow图)。
根据获取模型的位置以及如何转换模型,可以通过tf.loadLayersModel()
或tf.loadGraphModel()
加载文件,但不能同时加载。请参阅table of available conversions。
即使最初使用Keras训练模型,也可能将其保存为低级TensorFlow图,其中Keras层结构丢失了。我相信目前所有TF-Hub模块都是这种情况。因此,您当前的方法为您提供了tf.GraphModel
,无法从中重构图层。
我们在您列出的URL上提供了已经从原始Keras转换为TF.js Layers格式的MobileNet v1,因此您可以直接使用loadLayersModel()
(以前为loadModel()
)。我们目前不托管转换后的MobileNet v2。但是,您可以获取原始的Keras .h5模型here,然后使用tensorflowjs_converter
将其转换为TF.js图层格式。