You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含单个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:05:21