首页 文章

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

提问于
浏览
0

我刚刚完成了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文件的图形与存储库中的pb文件的图形进行了比较,我注意到批处理规范的表示方式存在差异 . 基本上,本教程提供的模型的批处理规范只有一个卷积后加一个,而存储库中的模型有一个FusedBatchNorm运算符 . 我也试过设置 fused=False 然后我得到这个错误:

/opt/conda/lib/python3.6/site-packages/h5py/init.py:36:FutureWarning:不推荐将issubdtype的第二个参数从float转换为np.floating . 将来,它将被视为np.float64 == np.dtype(float).type . 从._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:我十orflow / 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:在一般图形转换之前:656个运算符,874个数组(0量化)2018-05-09 11:51:3 9.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或其他脚本将 FusedBatchNorm 运算符转换为卷积/加法组合 . 真的吗?如果是这样,我在哪里可以找到转换脚本?

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

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

1 回答

  • 0

    无论是融合还是未融合,TOCO都应自动折叠批量规范 . 这是整体流程:

    • 火车模型

    • 制作Eval模型并使用火车检查点冻结或导出已保存的模型

    • 将冻结图或SavedModel提供给tflite_convert

    • 运行推理

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

    希望有所帮助!

相关问题