我想把一个用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,所以不应该立即转换?
尝试使用 hub.KerasLayer
将您的模型加载到 tf.keras.Model
然后将其转换为 ŧflite
使用 .from_keras_model
.
没有 "keras SavedModel "这种东西。有一个 SavedModel
,也就是 .pb
档+ assets
文件夹 variables
文件夹。这就像一种文件格式,一种存储模型的方式。它与内存中的 tf.keras.Model
s. 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
具体的错误。不知道如何解决这个难题。