ValueError:仅第一个维度不支持张量'input_tensor'具有无效的形状'[1,None,None,3]'

问题描述

我训练了用于对象检测的定制MobileNetV2 SSD模型。我保存了.pb文件,现在想将其转换为.tflite文件,以便与Coral edge-tpu一起使用。

我在Windows 10上的cpu上使用Tensorflow 2.2。

我正在使用的代码

import tensorflow as tf

saved_model_dir = r"C:/Tensorflow/Backup_Training/my_MobileNetV2_fpnlite_320x320/saved_model"
num_calibration_steps = 100

def representative_dataset_gen():
    for _ in range(num_calibration_steps):
        # Get sample input data as a numpy array
        yield [np.random.uniform(0.0,1.0,size=(1,416,3)).astype(np.float32)]

converter = tf.lite.TFLiteConverter.from_saved_model(saved_model_dir)
converter.optimizations = [tf.lite.Optimize.DEFAULT]

converter.experimental_new_converter = True

converter.representative_dataset = representative_dataset_gen
converter.target_spec.supported_ops = [
    #tf.lite.OpsSet.TFLITE_BUILTINS_INT8,tf.lite.OpsSet.TFLITE_BUILTINS,tf.lite.OpsSet.SELECT_TF_OPS
    ]
converter.inference_input_type = tf.int8
converter.inference_output_type = tf.int8

tflite_quant_model = converter.convert()

with open('model.tflite','wb') as f:
    f.write(tflite_model)

我尝试了其他线程提出的几种解决方案,并且还使用tf-nightly,tf2.3和tf1.14进行了尝试,但均无效果(总是出现另一条我无法处理的错误消息)。自从我使用tf2.2进行培训以来,我认为继续进行tf2.2可能是一个好主意。

由于我是Tensorflow的新手,所以我有几个问题:输入张量到底是什么?在哪里定义它?是否有可能看到或提取此输入张量? 有人知道如何解决此问题吗?

整个错误消息:

(tf22) C:\Tensorflow\Backup_Training>python full_int_quant.py
2020-10-22 14:51:20.460948: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2020-10-22 14:51:20.466366: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2020-10-22 14:51:29.231404: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'nvcuda.dll'; dlerror: nvcuda.dll not found
2020-10-22 14:51:29.239003: E tensorflow/stream_executor/cuda/cuda_driver.cc:313] Failed call to cuInit: UNKNowN ERROR (303)
2020-10-22 14:51:29.250497: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: ip3536
2020-10-22 14:51:29.258432: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: ip3536
2020-10-22 14:51:29.269261: I tensorflow/core/platform/cpu_feature_guard.cc:143] Your cpu supports instructions that this TensorFlow binary was not compiled to use: AVX2
2020-10-22 14:51:29.291457: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x2ae2ac3ffc0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-10-22 14:51:29.298043: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host,Default Version
2020-10-22 14:52:03.785341: I tensorflow/core/grappler/devices.cc:55] Number of eligible GPUs (core count >= 8,compute capability >= 0.0): 0
2020-10-22 14:52:03.790251: I tensorflow/core/grappler/clusters/single_machine.cc:356] Starting new session
2020-10-22 14:52:04.559832: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:797] Optimization results for grappler item: graph_to_optimize
2020-10-22 14:52:04.564529: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:799]   function_optimizer: Graph size after: 3672 nodes (3263),5969 edges (5553),time = 136.265ms.
2020-10-22 14:52:04.570187: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:799]   function_optimizer: function_optimizer did nothing. time = 2.637ms.
2020-10-22 14:52:10.742013: I tensorflow/core/grappler/devices.cc:55] Number of eligible GPUs (core count >= 8,compute capability >= 0.0): 0
2020-10-22 14:52:10.746868: I tensorflow/core/grappler/clusters/single_machine.cc:356] Starting new session
2020-10-22 14:52:12.358897: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:797] Optimization results for grappler item: graph_to_optimize
2020-10-22 14:52:12.363657: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:799]   constant_folding: Graph size after: 1714 nodes (-1958),2661 edges (-3308),time = 900.347ms.
2020-10-22 14:52:12.369137: I tensorflow/core/grappler/optimizers/Meta_optimizer.cc:799]   constant_folding: Graph size after: 1714 nodes (0),2661 edges (0),time = 60.628ms.
Traceback (most recent call last):
  File "full_int_quant.py",line 40,in <module>
    tflite_model = converter.convert()
  File "C:\Users\schulzyk\Anaconda3\envs\tf22\lib\site-packages\tensorflow\lite\python\lite.py",line 480,in convert
    raise ValueError(
ValueError: None is only supported in the 1st dimension. Tensor 'input_tensor' has invalid shape '[1,None,3]'.

无论我在代码中进行什么更改,总会有相同的错误消息。我不知道这是否表明在训练过程中出现了一些问题,但没有出现引人注目的现象。

我很高兴收到任何反馈!

解决方法

啊,带有tensorflow 2.0的珊瑚对象检测API仍然是WIP。我们遇到许多障碍,可能很快将看不到此功能。我建议暂时使用tf1.x aPI。这是一个很好的教程:) https://github.com/Namburger/edgetpu-ssdlite-mobiledet-retrain

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...