含单个Ragged输入的Keras模型转TensorFlow Lite出现多输入异常
TFLite转换含Ragged输入的Keras模型相关问题解答
问题背景
在TensorFlow 2.8.0和2.11.0版本中,使用Keras构建含单个Ragged输入的模型后,转换为TF Lite模型时,原输入会被拆分为两个输入:一个为原数据类型、适配扁平化后的值张量,另一个为int64类型的行分割张量,同时原输入名称input_1丢失,导致推理时输入数量不符合预期。
疑问1:能否在保留Ragged功能的前提下避免输入拆分?
无法避免这种拆分行为。原因是TF Lite原生不直接支持RaggedTensor作为输入/输出,转换过程中会自动将RaggedTensor拆解为两个基础张量:
- 扁平化的
values张量:存储RaggedTensor中的所有有效数据 row_splits张量:记录RaggedTensor各维度的分割位置,用于还原原始的不规则结构
如果要保留RaggedTensor的动态不规则维度能力,就必须接受这种拆分形式。
疑问2:若无法避免,额外输入应传入什么内容?
额外的int64类型输入是RaggedTensor的row_splits数组,用于标记不规则维度的分割边界。
举个实际例子:
假设输入是一个RaggedTensor,结构为:
rt = tf.RaggedTensor.from_row_lengths( values=[[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]], row_lengths=[2,1] # 代表batch中第一个样本有2个元素,第二个样本有1个元素 )
对应的row_splits就是[0,2,3](长度为batch_size + 1),而values就是扁平化后的[[1.,2.,3.,4.], [5.,6.,7.,8.], [9.,10.,11.,12.]]。
推理时需要将这两个张量分别传入TF Lite解释器,示例代码如下:
# 准备测试用的RaggedTensor test_rt = tf.RaggedTensor.from_row_lengths( values=tf.random.normal((3,4)), row_lengths=[2,1] ) # 拆分得到values和row_splits input_values = test_rt.values input_row_splits = test_rt.row_splits # 初始化TFLite解释器 interpreter = tf.lite.Interpreter(model_path="test_model.tflite") interpreter.allocate_tensors() # 获取输入索引 input_details = interpreter.get_input_details() values_idx = input_details[0]['index'] splits_idx = input_details[1]['index'] # 设置输入 interpreter.set_tensor(values_idx, input_values.numpy()) interpreter.set_tensor(splits_idx, input_row_splits.numpy()) # 执行推理 interpreter.invoke() # 获取输出 output_details = interpreter.get_output_details() output = interpreter.get_tensor(output_details[0]['index'])
内容的提问来源于stack exchange,提问作者lordfarquant
相关产品推荐
相关产品推荐

