为 TFLite 硬刷

Hard-swish for TFLite

我有一个用 Tensorflow.Keras 编写的自定义神经网络,并将 hard-swish 函数用作激活(如 MobileNetV3 论文中所用):

实施:

def swish(x):
    return x * tf.nn.relu6(x+3) / 6

我正在运行量化感知训练,最后写了一个protobuf文件。然后,我使用此代码转换为 tflite(并最终将其部署在 EdgeTPU 上):

tflite_convert --output_file test.tflite --graph_def_file=test.pb --inference_type=QUANTIZED_UINT8 --input_arrays=input_1 --output_arrays=conv2d_3/Sigmoid --mean_values=0 --std_dev_values=255 --default_ranges_min=0 --default_ranges_max=6

当我不除以 6 时,这非常有效,但是,当除以 6 时,我收到此错误:

Unimplemented: this graph contains an operator of type Div for which the quantized form is not yet implemented.

我正在使用 TF 1.14 进行训练,昨晚使用 TF 1.15 构建以转换为 TFLITE;我正在努力让 TF 2.x 为一些奇怪的 HDF5 不兼容性工作,但如果有人知道如何规避这个问题,那就太好了......谢谢!

因为它是一个常量除法,你可以乘以(近似)倒数:

def swish(x):
    return x * tf.nn.relu6(x+3) * 0.16666667