我有这段代码,用于使用tensorflow hub中预先训练的通用编码器构建语义搜索引擎。我无法转换为tlite。我已将模型保存到我的目录中。
导入模型:
module_path ="/content/drive/My Drive/4"
%time model = hub.load(module_path)
#print ("module %s loaded" % module_url)
#Create function for using modeltraining
def embed(input):
return model(input)
在数据上训练模型:
## training the model
Model_USE= embed(data)
保存模型:
exported = tf.train.Checkpoint(v=tf.Variable(Model_USE))
exported.f = tf.function(
lambda x: exported.v * x,
input_signature=[tf.TensorSpec(shape=None, dtype=tf.float32)])
export_dir = "/content/drive/My Drive/"
tf.saved_model.save(exported,export_dir)
保存工作正常,但当我转换为tflite时,会出现错误。
转换代码:
converter = tf.lite.TFLiteConverter.from_saved_model(export_dir)
converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS,
tf.lite.OpsSet.SELECT_TF_OPS]
tflite_model = converter.convert()
open("converted_model.tflite", "wb").write(tflite_model)
错误:
as_list() is not defined on an unknown TensorShape.
首先,您应该添加一个数据生成器,以便为转换器提供有代表性的输入。就像这样:
def representative_data_gen():
for input_value in dataset.take(100):
yield [input_value]
input value
的形状必须是(1, your_iput_shape)
,就好像它具有1的批处理形状一样。它必须以清单的形式产生;强制性的
您还应该声明您想要哪种类型的优化,例如:
converter.optimizations = [tf.lite.Optimize.OPTIMIZE_FOR_SIZE]
尽管如此,我也遇到了转换器的不同选项的问题,这取决于网络结构,在这种情况下我不知道。所以,为了让转换器干净地运行,我只想做:
converter = lite.TFLiteConverter.from_keras_model(model)
converter.experimental_new_converter = True
converter.optimizations = [lite.Optimize.DEFAULT]
tfmodel = converter.convert()
converter.experimental_new_converter = True
用于转换RNN时的问题,如https://github.com/tensorflow/tensorflow/issues/34813
编辑:
如本文所述:ValueError:None仅在第1维度中受支持。张量';flatbuffer_data';具有无效形状';[无,无,1512]';TFLite只允许数据的第一个维度为None,即批处理。所有其他尺寸必须固定。试着用tf.keras.preprocessing.sequence.pad_sequences
填充它们。
然后用Embedding
或Masking
层在网络中屏蔽序列,如中所述:tensorflow.org/guide/keras/masking_and_padding
。