tensorflow - 将先前对现有模型动态的占位符尺寸变为静态
问题描述
我训练了一个用于对象检测的张量流模型,输入作为占位符,尺寸为 [1,None,None,3],因为我的训练图像有各种大小。然后我将冻结图(.pb 文件)转换为 tensorRT 图以加快推理速度,但 tensorRT 警告我输入张量具有未知的非批量维度,因此节点将回退到 TF。错误信息是:
2019-05-22 08:59:56.628216: W tensorflow/contrib/tensorrt/convert/convert_nodes.cc:3710] Validation failed for TensorRTInputPH_0 and input slot 0: Input tensor with shape [1,?,?,3] has an unknown non-batch dimension at dim 1
2019-05-22 08:59:56.628262: W tensorflow/contrib/tensorrt/convert/convert_graph.cc:1021] TensorRT node TRTEngineOp_0 added for segment 0 consisting of 160 nodes failed: Invalid argument: Validation failed for TensorRTInputPH_0 and input slot 0: Input tensor with shape [1,?,?,3] has an unknown non-batch dimension at dim 1. Fallback to TF...
我知道我可以在 trt.create_inference_graph 中将 is_dynamic_op 设置为 True,但这会增加运行时间。我想使用这个模型来推断视频,其中所有帧都具有相同的高度和宽度。有没有办法将输入占位符尺寸固定为静态值,而无需重新训练模型?我的输入张量可以通过 get_tensor_by_name 访问
解决方案
我认为您正在使用静态模式。
is_dynamic_op
TF-TRT 的默认操作模式称为静态模式,只要参数设置为 False ,它就处于活动状态。在静态模式下,要求模型中的所有形状都完全定义(尺寸不能为无或-1)。当参数 is_dynamic_op 设置为 True 时,TF-TRT 将以动态模式运行。在动态模式下,TF-TRT API(TF <= 1.13 中的 create_inference_graph)返回一个修改后的图,但此时没有创建 TensorRT 引擎。相反,当您将输入发送到图形时,TensorRT 引擎是在运行时创建的。
动态模式的主要优点是它允许您在模型中拥有未知的形状,尽管 TensorRT 需要完全定义所有形状。在这种模式下,TF-TRT 为提供给模型的每个唯一输入形状创建一个新的 TensorRT 引擎。
推荐阅读
- docker - 在 docker 中运行的红隼无法提供静态内容
- regex - 使用正则表达式仅匹配百分比中的数字
- python - QSqlTableModel setFilter 参数太多
- flutter - Mockito 重置通话计数?
- symfony - 在一个带有 encore 的 symfony 项目中,如何设置 Jest?
- java - 如何在 Selenium-java 中将页面对象与代码逻辑分开
- php - 正则表达式 php 中替代值的 Preg_match 不起作用
- windows - 由于“无法构建存档”而无法构建任何依赖项
- docker - 如何更新在我的 ddev 容器中使用的作曲家版本?
- python - Django:每次我开发我的 django 应用程序时都必须打开虚拟环境吗