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

Flutter中TFLite推荐模型推理:输入格式适配问题求助

解决方案

1. 核心问题分析

当前Flutter代码错误地将字符串转为Uint8List(单字符串的字节流),但模型期望的是形状匹配的字符串数组(对应Python的np.array(["42"], dtype=np.string_)),同时模型存在两个输出张量,需要分别处理。

2. 调整Flutter代码步骤

(1)修复模型加载的异步问题

原构造函数为同步方法,可能导致推理时模型未加载完成,改为异步构造:

import 'dart:convert';
import 'dart:typed_data';
import 'package:tflite_flutter/tflite_flutter.dart';

class RecommendationModel {
  late final Interpreter _recommendationInterpreter;

  // 私有构造函数
  RecommendationModel._(this._recommendationInterpreter);

  // 异步创建实例,确保模型加载完成
  static Future<RecommendationModel> create({
    String recommendationModelPath = "assets/user_retrieval.tflite",
  }) async {
    final interpreter = await Interpreter.fromAsset(recommendationModelPath);
    print("Recommendation model loaded");
    return RecommendationModel._(interpreter);
  }

(2)构造正确的输入张量

模型输入为形状[1]的字符串数组,直接传递List<String>即可(tflite_flutter会自动处理为对应格式):

Future<void> testUserRetrievalModel(String userId) async {
    try {
      // 确认输入张量的形状和类型(可选,用于调试)
      final inputTensor = _recommendationInterpreter.getInputTensor(0);
      print("Input shape: ${inputTensor.shape}");
      print("Input type: ${inputTensor.type}");

      // 构造输入:对应Python的np.array(["42"], dtype=np.string_)
      final input = [userId]; // 形状为[1],与模型输入要求匹配

      // 准备两个输出张量(对应Python的两个输出)
      // 第一个输出:float32类型,形状[1,10]
      final output0 = List.filled(10, 0.0).reshape([1, 10]);
      // 第二个输出:int32类型,形状[1,10]
      final output1 = List.filled(10, 0).reshape([1, 10]);

      // 运行推理,传入输入和两个输出张量
      _recommendationInterpreter.run(input, [output0, output1]);

      // 打印第二个输出(对应Python中output_details[1]的结果)
      print('Second output: ${output1[0]}');
      final List<int> recommendations = output1[0].cast<int>().toList();
      print("Recommended recipe IDs: $recommendations");
    } catch (e) {
      print('Error during prediction: $e');
    }
  }

  void dispose() {
    _recommendationInterpreter.close();
  }
}

(3)使用方式

在Flutter页面中,确保模型加载完成后再调用推理:

// 初始化模型
final model = await RecommendationModel.create();
// 调用推理
await model.testUserRetrievalModel("42");
// 用完释放资源
model.dispose();

3. 关键注意点

  • 输入类型匹配:如果模型输入张量类型为TfLiteType.string,直接传递List<String>即可,无需手动转字节;
  • 输出张量数量:模型有两个输出,必须准备对应数量和形状的输出容器;
  • 异步安全:必须确保模型加载完成后再执行推理,避免空指针或未初始化错误。

内容的提问来源于stack exchange,提问作者ayato1225

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 07:17:07