从TFLite文件中提取融合的激活类型

时间:2020-03-16 23:30:40

标签: tensorflow-lite

我正在使用Python解析TFLite文件(Tensorflow 1.15,模式版本3)。一切(步幅和其他)都可以正常工作,但是融合的激活类型始终返回0。这意味着没有激活层,但是我们知道有Relu6。我在这段代码中做错了什么?

conv2d_opt = DepthwiseConv2DOptions.DepthwiseConv2DOptions()
conv2d_opt.Init(graph.Operators(operator_index).BuiltinOptions().Bytes,graph.Operators(operator_index).BuiltinOptions().Pos)
row_stride = conv2d_opt.StrideW()
col_stride = conv2d_opt.StrideH()
FusedActivationFunction = conv2d_opt.FusedActivationFunction()

1 个答案:

答案 0 :(得分:0)

在Daniel Situnayake的帮助下找到了答案。基本上,Conv2D或DS_Conv2D内核将输出裁剪为始终层的output_activation_max和output_activation_min值。请看下面。因此,您默认情况下会获得Relu / Relu6 / None,而无需添加额外的图层。来自depthwise_conv内核的示例 https://github.com/tensorflow/tensorflow/blob/88bd10e84273f558a72714890ab7d04789ebbe37/tensorflow/lite/kernels/internal/reference/depthwiseconv_uint8.h#L266

acc = DepthwiseConvRound<output_rounding>(
      acc, output_multiplier[output_channel],
      output_shift[output_channel]);
acc += output_offset;
**acc = std::max(acc, output_activation_min);
acc = std::min(acc, output_activation_max);**
output_data[Offset(output_shape, batch, out_y, out_x,
                                 output_channel)] = static_cast<int8_t>(acc);
相关问题