ESP32语音命令识别项目中,将.model模型转换为TFLite文件时出现‘str’ object has no attribute ‘call’错误的技术求助
解决将训练好的模型转换为TFLite时的
'str' has no attribute 'call'错误 我之前在做嵌入式模型转换时也碰到过几乎一样的问题,结合你使用TensorFlow 2.6.2、Python 3.10的环境,这个错误大概率是把模型路径字符串当成了模型对象来处理导致的,下面是具体的排查和解决步骤:
1. 先检查模型加载的正确姿势
你提到的fully_trained.model文件,如果是用Keras的model.save()方法保存的,那它是Keras格式的模型,不能直接把路径字符串传给TFLite转换器。你需要先把模型加载为Keras模型对象,再进行转换:
import tensorflow as tf # 第一步:正确加载模型为Keras对象 try: model = tf.keras.models.load_model("fully_trained.model") print("模型加载成功") except Exception as e: print(f"模型加载失败:{e}") # 第二步:初始化TFLite转换器并执行转换 converter = tf.lite.TFLiteConverter.from_keras_model(model) # 如果需要量化(ESP32推荐使用),可以添加这两行 # converter.optimizations = [tf.lite.Optimize.DEFAULT] # converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS_INT8] tflite_model = converter.convert() # 保存转换后的TFLite文件 with open("voice_commands.tflite", "wb") as f: f.write(tflite_model)
2. 排查代码中的变量混淆
有时候代码里会不小心把存储模型路径的字符串变量当成模型实例来调用(比如误写了model(input_data)但model其实是个路径字符串),这也会触发'str' has no attribute 'call'错误。你可以检查下转换代码里的变量命名和使用,确保所有涉及模型操作的地方,都是加载后的Keras模型对象,而非字符串路径。
3. 版本兼容性备选方案
虽然TensorFlow 2.6.2对Python 3.10有实验性支持,但如果上面的方法都无效,可以考虑:
- 临时降级Python到3.9(TensorFlow 2.6正式支持的版本)
- 升级TensorFlow到2.8及以上版本(对Python 3.10的支持更完善)
先优先尝试前两步,应该就能解决你的问题了。
内容的提问来源于stack exchange,提问作者Nikita Varfolomeev
相关产品推荐
相关产品推荐

