「Floating dream」^_ 2024-11-26 00:09 采纳率: 0%
浏览 151
已结题

Tensorflow采用interpreter.allocate_tensors()分配内存出现ValueError: vector too long报错


    with open(f'./model/TargetSparsity_{final_sparsity:.1f}/TargetSparsity_{final_sparsity:.1f}_pruned_model_fp16.tflite', 'rb') as f:
        model_data = f.read()

    interpreter = tf.lite.Interpreter(model_content=model_data)
    input_details = interpreter.get_input_details()
    new_input_shape = [1, 320, 1]  # 根据模型的要求调整输入形状
    interpreter.resize_tensor_input(input_details[0]['index'], new_input_shape, strict=True)
    interpreter.allocate_tensors()

    test_accuracy = evaluate_model(interpreter, X_test, Y_test)

如题,我在分析之前生成的.tflite文件时采用allocate_tensor()分配内存,但是报错如下:

  File "D:\purning\MIT_ECG_class_vgg16_byTargetSparsity_2\train_and_purne_with_sparsity.py", line 200, in train_and_prune_with_sparsity
    interpreter.allocate_tensors()
  File "C:\Users\11340\miniconda3\envs\TF_py37\lib\site-packages\tensorflow\lite\python\interpreter.py", line 513, in allocate_tensors
    return self._interpreter.AllocateTensors()
ValueError: vector too long

请问问题出在哪里,应该如何解决呢,我的模型输入是一个一维的320 x 1的张量,输出是一个5 x 1的张量作为分类的输出

Input Details Before Resizing: [{'name': 'serving_default_input_1:0', 'index': 0, 'shape': array([  1, 320,   1]), 'shape_signature': array([ -1, 320,   1]), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0), 'quantization_parameters': {'scales': array([], dtype=float32), 'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]

  • 写回答

38条回答

  • M_try的小尾巴 2024-11-26 12:30
    关注
    获得0.15元问题酬金

    提示: 本回答参考 AIGC,由本人审核整理提供。若问题解决,望采纳;如仍有疑问,请评论回复。

    问题分析

    你在使用 TensorFlow Lite 的 Interpreter 时,遇到了 ValueError: vector too long 的错误。这个错误通常与内存分配或张量形状不匹配有关。以下是详细的分析和解决方案。

    代码分析

    1. 读取模型文件:

      with open(f'./model/TargetSparsity_{final_sparsity:.1f}/TargetSparsity_{final_sparsity:.1f}_pruned_model_fp16.tflite', 'rb') as f:
          model_data = f.read()
      
    2. 创建解释器:

      interpreter = tf.lite.Interpreter(model_content=model_data)
      
    3. 获取输入细节:

      input_details = interpreter.get_input_details()
      
    4. 调整输入形状:

      new_input_shape = [1, 320, 1]
      interpreter.resize_tensor_input(input_details[0]['index'], new_input_shape, strict=True)
      
    5. 分配内存:

      interpreter.allocate_tensors()
      
    6. 评估模型:

      test_accuracy = evaluate_model(interpreter, X_test, Y_test)
      

    错误原因

    ValueError: vector too long 通常是由于以下原因之一:

    1. 输入形状不匹配: 调整后的输入形状可能与模型的预期形状不匹配。
    2. 内存分配问题: 模型可能需要比可用内存更多的内存。

    解决方案

    1. 检查输入形状

    确保 new_input_shape 与模型的预期输入形状完全匹配。你可以通过打印 input_details 来确认模型的预期输入形状。

    print(input_details)
    

    输出示例:

    [{'name': 'serving_default_input_1:0', 'index': 0, 'shape': array([1, 320, 1]), 'shape_signature': array([-1, 320, 1]), 'dtype': <class 'numpy.float32'>, 'quantization': (0.0, 0), 'quantization_parameters': {'scales': array([], dtype=float32), 'zero_points': array([], dtype=int32), 'quantized_dimension': 0}, 'sparsity_parameters': {}}]
    

    确保 new_input_shapeshape_signature 匹配。

    2. 非严格模式调整形状

    尝试使用非严格模式调整形状,以避免形状不匹配的问题。

    interpreter.resize_tensor_input(input_details[0]['index'], new_input_shape, strict=False)
    

    3. 检查模型文件

    确保 .tflite 文件是正确的,并且没有损坏。你可以尝试重新生成 .tflite 文件,或者使用其他工具检查模型文件的完整性。

    4. 减少模型复杂度

    如果模型非常复杂,可能需要减少模型的复杂度或使用更高性能的硬件来运行模型。

    总结

    通过检查输入形状、使用非严格模式调整形状、确保模型文件正确以及减少模型复杂度,你应该能够解决 ValueError: vector too long 的问题。如果问题仍然存在,请提供更多的上下文信息,以便进一步诊断。

    评论

报告相同问题?

问题事件

  • 系统已结题 12月4日
  • 修改了问题 11月26日
  • 修改了问题 11月26日
  • 创建了问题 11月26日