1

我刚刚完成了 TensorFlow for Poets 2:TFLite 教程(https://codelabs.developers.google.com/codelabs/tensorflow-for-poets-2-tflite/#0)。在教程结束时,我能够在手机上运行教程中提供的 MobileNet。

现在,我正在尝试用我使用 Tensorflow 存储库中的 MobileNet 从头开始​​训练的 MobileNet 替换教程中的 MobileNet。但是,当尝试使用 TOCO 时,我遇到了分段错误。如果我使用optimize_for_inference,我会收到类似的警告

警告:张量流:节点 MobilenetV1/Conv2d_0/BatchNorm/FusedBatchNorm 的均值形状不正确,发现 (0,),预期 (32,)

警告:张量流:未找到“MobilenetV1/Conv2d_1_depthwise/BatchNorm/FusedBatchNorm”的预期 Conv2D 输入

我将教程中的 pb 文件图与存储库中的图进行了比较,我注意到批处理规范的表示方式有所不同。基本上,本教程提供的模型的批范数只有一个卷积和一个加法,而来自存储库的模型有一个 FusedBatchNorm 运算符。我也尝试过设置fused=False,但随后出现此错误:

/opt/conda/lib/python3.6/site-packages/h5py/.py:36:FutureWarning __init__:不推荐将 issubdtype 的第二个参数从floatto转换np.floating。将来,它将被视为np.float64 == np.dtype(float).type.

从 ._conv 导入 register_converters 作为 _register_converters

2018-05-09 11:51:38.419786: W tensorflow/contrib/lite/toco/toco_cmdline_flags.cc:178] --input_type 已弃用。这是一个模棱两可的标志,同时设置了 --input_data_types 和 --inference_input_type。如果您尝试使用有关输入数组类型的信息来补充输入文件,请使用 --input_data_type。如果您尝试控制输出文件中实数输入数组的量化/去量化,请使用 --inference_input_type。

2018-05-09 11:51:38.781372:I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.781693: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.781864: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.782019: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不受支持的操作:SquaredDifference

2018-05-09 11:51:38.782181: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不受支持的操作:SquaredDifference

2018-05-09 11:51:38.782329: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.782508: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.782663: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.782851: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.783009:I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.783211: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.783352:I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.783561: I tensorflow/contrib/lite/toco/import_tensorflow.cc:1057] 转换不支持的操作:SquaredDifference

2018-05-09 11:51:38.832089: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] 在一般图形转换之前:656 个运算符,874 个数组(0 量化)

2018-05-09 11:51:39.037810: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] 一般图形转换后通过 1: 222 个运算符,435 个数组(0 量化)

2018-05-09 11:51:39.041366: I tensorflow/contrib/lite/toco/graph_transformations/graph_transformations.cc:39] 在去量化图转换之前:222 个运算符,435 个数组(0 个量化)

2018-05-09 11:51:39.044092:I tensorflow/contrib/lite/toco/allocate_transient_arrays.cc:313] 总瞬态数组分配大小:4333824 字节,理论最优值:4333696 字节。

2018-05-09 11:51:39.045179: F tensorflow/contrib/lite/toco/tflite/export.cc:303] 标准 TensorFlow Lite 运行时不支持模型中的某些运算符。如果您有他们的自定义实现,您可以使用 --allow_custom_ops 禁用此错误。以下是您需要自定义实现的运算符列表:Mean、RSQRT、SquaredDifference、Squeeze。

中止(核心转储)

我假设可以FusedBatchNorm使用 TOCO 或其他脚本将运算符转换为卷积/加法组合。真的吗?如果是这样,我在哪里可以找到转换脚本?

教程中 MobileNet 的批量规范表示: 图像1

来自存储库的 MobileNet 的批量规范表示: 图2

4

2 回答 2

0

TOCO 应该自动折叠批规范,无论它们是融合的还是未融合的。这是整体流程:

  1. 训练模型
  2. 制作 Eval 模型并使用训练检查点冻结或导出保存的模型
  3. 向 tflite_convert 提供冻结图或 SavedModel
  4. 运行推理

您可能会遇到不受支持的操作。为避免这种情况,请确保您为转换提供正确的输入和输出。

希望有帮助!

于 2018-07-27T21:39:10.843 回答
-1

TensorFlow lite 自动融合 BachNorm 层,因为对于冻结图,Bach 范数参数是恒定的。最好试试 tf2 夜间版

于 2019-08-19T13:05:15.163 回答