我正在尝试将加载了hub.load的模型转换为TFLite。 所讨论的模型是在https://tfhub.dev/google/universal-sentence-encoder/4处找到的通用句子编码器(4) 我在Tensorflow 2.1.0和2.2.0版本的Python中尝试过
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,所以不应该马上就可以转换吗?
答案 0 :(得分:3)
尝试使用hub.KerasLayer
将模型加载到tf.keras.Model
中,然后使用ŧflite
将其转换为.from_keras_model
。
没有“ keras SavedModel”之类的东西。有SavedModel
,它是.pb
文件+ assets
文件夹+ variables
文件夹。这就像文件格式一样,是存储模型的一种方式。它与内存tf.keras.Model
无关。 hub.load
不会返回tf.keras.Model
,而是可以以SavedModel
文件格式(即_UserObject
)保存的“最普通的东西”。这是因为您可以将tf.keras.Models
以外的其他内容保存为SavedModel
的文件格式。
我知道这不是您的问题,但是如果您 do 想要在加载后恢复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
特定的错误。不知道如何解决这个难题。