Tensorflow hub.load模型到TFLite

时间:2020-05-04 15:32:35

标签: tensorflow keras tensorflow-lite tf-lite

我正在尝试将加载了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,所以不应该马上就可以转换吗?

1 个答案:

答案 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特定的错误。不知道如何解决这个难题。