问题描述
通过 Tensorflow Slim API 实现的 MobileFaceNet 模型,在转换为 tflite 过程中,出现不支持 switch 的问题。
分析
通过 tensorboard 搜索 graph 中 control_flow_ops.switch ,都出现在 BatchNorm/cond/switch
节点中。显然,BN 使用了 cond 封装下的 Switch,所以想要知道谁调用了Switch,关键就是找到 BatchNorm
、Cond
、Switch
这三个 namescope,因此在读源码过程中,抽丝剥茧,缕了一下 BatchNorm 使用 switch 的内容。
问题从 slim.batch_norm 开始:
BatchNorm
在slim.batch_norm 方法中 variable_scope 定义了 BatchNorm
,第一个scope找到,在with上下文语法中,继续查找Cond
。
264| with variable_scope.variable_scope(
265| scope, 'BatchNorm', [inputs], reuse=reuse) as sc:
结合Graph 中的内容,发现 switch
包含在Cond
之内,而 Switch
之后,就紧跟着 FusedBatchNorm 方法。