将(融合)BatchNorm转换为卷积/添加以在TensorflowLite

时间:2018-05-09 10:45:50

标签: tensorflow tensorflow-lite

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

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

的警告
  

警告:tensorflow:对于节点MobilenetV1 / Conv2d_0 / BatchNorm / FusedBatchNorm

,mean,found(0,),expected(32,)的形状不正确

     

警告:tensorflow:未找到预期的Conv2D输入到' MobilenetV1 / Conv2d_1_depthwise / BatchNorm / FusedBatchNorm'

我将教程中的pb文件图表与存储库中的图表进行了比较,我注意到批处理规范的表示方式存在差异。基本上,本教程提供的模型的批处理规范只有一个卷积后加一个,而存储库中的模型有一个FusedBatchNorm运算符。我也尝试设置fused=False,但后来我收到了这个错误:

  

/opt/conda/lib/python3.6/site-packages/h5py / __init__。py:36:FutureWarning:将issubdtype的第二个参数从float转换为{{1}不推荐使用。将来,它将被视为np.floating

     

从._conv import register_converters as _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。

     

中止(核心倾销)

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

教程中MobileNet的批量规范表示: image1

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

2 个答案:

答案 0 :(得分:0)

无论已融合或未融合,TOCO都应自动折叠批处理规范。这是整体流程:

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

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

希望有帮助!

答案 1 :(得分:-1)

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