Tensorflow hub.load模型到TFLite。

问题描述 投票:0回答:1

我想把一个用hub.load加载的模型转换为TFLite.这个模型是universal-sentence-encoder (4),可以在以下网站找到 https:/tfhub.devgoogleuniversal-sentence-encoder4。我在Python中用Tensorflow 2.1.0和2.2.0版本进行了尝试。

import tensorflow as tf
import tensorflow_hub as hub

model = hub.load("https://tfhub.dev/google/universal-sentence-encoder/4")
converter = tf.lite.TFLiteConverter.from_keras_model(model )
converter.experimental_new_converter = True // tried with and without
tflite_model = converter.convert()

我得到以下错误。

    converter = tf.lite.TFLiteConverter.from_keras_model(model)
  File "...\lib\site-packages\tensorflow_core\lite\python\lite.py", line 394, in from_keras_model
    if not isinstance(model.call, _def_function.Function):
AttributeError: '_UserObject' object has no attribute 'call'

根据我的理解,hub.load会返回一个keras SavedModel,所以不应该立即转换?

tensorflow keras tensorflow-lite tf-lite
1个回答
2
投票

尝试使用 hub.KerasLayer 将您的模型加载到 tf.keras.Model 然后将其转换为 ŧflite 使用 .from_keras_model.

没有 "keras SavedModel "这种东西。有一个 SavedModel,也就是 .pb 档+ assets 文件夹 variables 文件夹。这就像一种文件格式,一种存储模型的方式。它与内存中的 tf.keras.Models. hub.load 不返回一个 tf.keras.Model而不是 "最普通的东西",你可以保存在的。SavedModel 文件格式,即 _UserObject. 这是因为你可以保存其他东西,而不仅仅是 tf.keras.Models在一个 SavedModel的文件格式。

我知道这不是你的问题,但如果你 想得到你 tf.keras.Model 加载后返回,您可以使用 tf.keras.save_model 来保存它。然后它就会回来作为一个 tf.keras.Model 加载后 tf.saved_model.load 所以就不再是最通用的东西了)。

编辑。

只有代码:

import tensorflow as tf
import tensorflow_hub as hub 
model = tf.keras.Sequential()
model.add(tf.keras.layers.InputLayer(dtype=tf.string, input_shape=()))
model.add(hub.KerasLayer("https://tfhub.dev/google/universal-sentence-encoder/4"))
converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

它的工作原理(它开始转换), 但你得到一个。

2020-05-05 10:48:44.927433: I tensorflow/lite/toco/import_tensorflow.cc:659] Converting unsupported operation: StatefulPartitionedCall

所以这个... 中保存的模型转换代码。SavedModel 格式为 tflite但你会得到一个 google-universal-sentence-encoder 具体的错误。不知道如何解决这个难题。

© www.soinside.com 2019 - 2024. All rights reserved.