将(融合的)BatchNorm转换为卷积/添加,以便在TensorflowLite上运行MobileNet

将(融合的)BatchNorm转换为卷积/添加,以便在TensorflowLite上运行MobileNet,tensorflow,tensorflow-lite,Tensorflow,Tensorflow Lite,我刚刚完成了TensorFlow for Poeters 2:TFLite教程()。在教程结束时,我能够在手机上运行教程中提供的MobileNet 现在,我试图用一个MobileNet替换教程中的MobileNet,我使用Tensorflow存储库中的MobileNet从头开始训练。然而,当尝试使用TOCO时,我遇到了一个分段错误。如果我使用optimize\u进行推理,我会收到如下警告 警告:tensorflow:节点MobilenetV1/Conv2d_0/BatchNorm/FusedBa

我刚刚完成了TensorFlow for Poeters 2:TFLite教程()。在教程结束时,我能够在手机上运行教程中提供的MobileNet

现在,我试图用一个MobileNet替换教程中的MobileNet,我使用Tensorflow存储库中的MobileNet从头开始训练。然而,当尝试使用TOCO时,我遇到了一个分段错误。如果我使用
optimize\u进行推理
,我会收到如下警告

警告:tensorflow:节点MobilenetV1/Conv2d_0/BatchNorm/FusedBatchNorm的平均值形状不正确,找到(0,),预期为(32,)

警告:tensorflow:未找到“MobilenetV1/Conv2D_1_深度/BatchNorm/FusedBatchNorm”的预期Conv2D输入

我比较了教程中的pb文件图和存储库中的pb文件图,发现批处理规范的表示方式有所不同。基本上,教程中提供的模型的批处理规范只有一个卷积,然后是一个加法,而存储库中的模型有一个FusedBatchNorm操作符。我还尝试设置
fused=False
,但随后出现以下错误:

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

from.\u conv导入寄存器\u转换器作为\u寄存器\u转换器

2018-05-09 11:51:38.419786:W tensorflow/contrib/lite/toco/toco_cmdline_flags.cc:178]--不推荐使用输入类型。这是一个模棱两可的标志,它同时设置了--input_data_类型和--inference_input_类型。如果您试图用有关输入数组类型的信息来补充输入文件,请使用--input\u data\u type。如果您试图控制输出文件中实数输入数组的量化/反量化,请使用--inference\u input\u type

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

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]转换不支持的操作:平方差

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掼u transient掼u 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和squared

中止(堆芯转储)

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

教程中MobileNet的批处理规范表示:

存储库中MobileNet的批处理规范表示:

TOCO应自动折叠批次标准,无论其是否熔合。这是整个流程:

  • 列车模型
  • 制作评估模型并使用列车检查点冻结或导出保存的模型
  • 向tflite\u convert提供冻结的图形或保存的模型
  • 运行推理
  • 您可能会遇到不受支持的操作。为了避免这种情况,请确保为转换提供正确的输入和输出

    希望有帮助

    TensorFlow lite自动机